책에 근거를 대는 대화형 추천: 구현보다 먼저 정한 것들
책 사이트에 「이 책과 비슷한 책」 추천과 「이 책에 대해 물어보기」 대화를 붙이려 합니다. 콘텐츠 기반 추천과 원문 근거 대화를 그래프 데이터베이스(Neo4j)와 검색 결과를 근거로 답하는 GraphRAG 방식으로 구현하는 안을 검토하고 있습니다. 이 글을 쓰는 시점에서 이 서비스는 설계와 검증 기준을 정하는 단계이며 구현·배포된 것은 없습니다. 대신 기능을 만들기 전에 합의한 것들을 정리해 둡니다.
1. 합의한 개발 기준(v1.1)
개발 책임자와 검수자가 토론으로 4가지 방안을 비교한 뒤, 방향이 같은 것을 확인하고 하나의 기준 문서로 합쳤습니다. 검수 과정에서 모호한 숫자 두 가지가 지적되었고, 정의를 고정했습니다.
- 청킹(책을 검색 단위로 쪼개는 일)의 겹침률은 「겹침이 있는 인접 조각 쌍 수 ÷ 전체 인접 조각 쌍 수」의 비율로 정의하고, 목표를 20% 이하로 둡니다. 문장 절단률의 목표는 5% 이하입니다.
- 되돌림 1분, 재적재 10분이라는 목표의 측정 범위도 고정했습니다. 재적재 10분은 「비어 있는 데이터베이스에서 적재기 실행을 시작해, 적재가 끝나고, 샘플 질의 1건이 통과할 때까지」의 전체 시간입니다. 적재기 실행 시간을 빼고 재면 목표를 쉽게 달성한 것처럼 보이기 때문에 분모를 처음부터 못박았습니다.
위 숫자는 모두 목표값입니다. 새 데이터에서 달성했다는 뜻이 아닙니다.
2. 판정기를 먼저 만들었다
청킹 품질을 사람이 눈으로 보고 「괜찮아 보인다」고 말하지 않도록, 겹침률과 절단률을 전수 계산하는 판정 스크립트를 먼저 만들었습니다. 이 스크립트는 통과 0, 실패 1, 입력 오류 2로 종료하고, 자체 시험 12건을 통과했습니다. 다만 자체 시험 통과는 판정기가 의도대로 계산한다는 뜻이지, 새로 만든 데이터가 기준을 통과했다는 뜻이 아닙니다. 두 가지를 보고서에서 구분해 적습니다.
3. 검색 전에 권한을 거른다
현재 사이트의 대화 중계 코드를 정적으로 읽어 보니, 질문과 함께 상류로 넘어가는 값이 책, 질문, 대화 이력뿐이어서 「이 사용자가 읽을 수 있는 책인가」를 검색 단계에서 제한하는 장치가 없었습니다. 그래서 검색 결과를 만든 뒤 걸러내는 것이 아니라, 검색을 하기 전에 권한으로 범위를 제한하는 계약을 설계 요건으로 추가했습니다. 읽을 수 없는 책의 문장이 검색 결과에 한 번이라도 들어오면, 나중에 가리더라도 이미 늦기 때문입니다.
4. 동의와 삭제를 먼저 정한다
대화 기능은 이용자의 질문을 저장하게 됩니다. 기존 기록 방식이 접속 주소를 필수로 저장하고 원래 사용자 식별자를 그대로 두고 있었기 때문에, 앱 쪽 기록과 그래프 쪽 기록의 경계를 나누고 동의·삭제 API 계약을 문서로 먼저 만들었습니다. 검수에서 5가지 수정 요구가 나와 반영했고, 7개 항목 재대조를 통과했습니다. 이 통과는 단계 A에 입력으로 써도 된다는 승인이며, 구현 검증이나 법적 준수 판정이 아닙니다.
5. 비교 조사
이미 책에 대한 AI 질의를 제공하는 서비스들의 공식 자료를 조사해 어떤 설계 선택을 하는지 비교했습니다. 눈에 띈 공통점은 읽은 위치 범위로 답을 제한하는 것, 인용을 누르면 원문 구절로 이동하는 것, 근거가 부족하면 그렇게 표시하는 것이었습니다. 엔빌의 기준 문서도 원문 근거를 붙인 대화를 기본 방향으로 잡고 있고, 모델에게 임의의 데이터베이스 질의를 실행할 권한을 주지 않는다는 제한을 둡니다.
다음 단계
기준 문서와 판정기, 데이터 계약이 갖춰졌으므로 다음은 배포 판본·권리·좌표 대장과 검색 전 권한 필터 계약입니다. 구현이 끝나 외부에 열리면 그때 실제로 잰 숫자와 함께 다시 쓰겠습니다.