근거 부족 판정을 유사도 기준값 대신 답변 생성 단계에 맡긴 결정
2026.10.04 · 2분
개요
| 항목 | 내용 |
|---|---|
| 유형 | 기술 선택 |
| 시점 | 2026.09 |
| 상태 | 샘플 측정 후 결정, 제품 파이프라인에서 재확인 |
| 관련 영역 | RAG 검색, 답변 생성, 임베딩 |
| 나의 역할 | 측정 실행, 방식 결정, 제품 반영 후 재측정 |
1. 상황과 제약
포트폴리오 챗봇은 제 경험에 없는 내용을 지어내면 안 됩니다. 과장된 답변은 사실 오류만큼 위험하다고 봤습니다. 그래서 근거가 부족한 질문에는 "등록된 근거가 없다"고 답해야 했습니다.
처음에는 검색 유사도가 일정 값보다 낮으면 근거 없음으로 처리하려고 했습니다. 그 전에 실제 콘텐츠로 이 방법이 되는지 확인하기로 했습니다.
2. 검토와 판단
샘플 공개 문서 5건(청크 30개)과 대표 질문 7개로 검색을 측정했습니다. 질문 6개는 근거가 있고, OAuth 트러블슈팅을 묻는 1개는 근거가 없는 질문이었습니다.
| 구분 | 상위 1건 유사도 |
|---|---|
| 근거 있는 질문 중 가장 낮은 값 (React Native 경험) | 0.372 |
| 근거 없는 질문 (OAuth 트러블슈팅) | 0.342 |
| 차이 | 0.030 |
차이가 0.030이면 어떤 기준값을 정해도 정상 질문을 잘라내거나, 없는 근거를 통과시키게 됩니다. 근거 없는 질문의 상위 결과는 각 프로젝트의 "트러블슈팅" 섹션이었는데, 그 섹션들에 OAuth 내용은 없었고 질문의 "트러블슈팅"이라는 단어가 섹션 제목과 겹쳐 올라온 것이었습니다.
그래서 검색 단계에서는 거르지 않고 상위 5건을 답변 모델에 넘긴 뒤, 근거가 충분한지는 모델이 판단하게 했습니다.
3. 실행과 조율
- 답변 모델은 gpt-4.1-mini, temperature 0으로 두고 같은 질문 7개를 다시 실행했습니다.
- 근거가 없으면 모델이 답변 앞에 표시를 붙이게 하고, 서버는 그 표시를 방문자에게 보내지 않고 "답하지 못한 질문"으로 따로 저장했습니다.
- 근거 없는 질문에도 모델 호출이 생기므로, IP당·전체 질문 수 제한으로 비용 상한을 잡았습니다.
4. 결과와 확인
- 근거 있는 질문 6개는 모두 원문 범위 안에서 답했고, OAuth 질문은 근거 5건을 받고도 "근거에 등록되어 있지 않다"고 답했습니다.
- 비공개 글과 제목이 거의 같은 질문에도 공개 문서만 인용했습니다.
- 원문의 "단독 담당"과 "논의 참여" 구분이 답변에서도 유지됐습니다.
- Spring Boot·pgvector로 만든 제품 파이프라인에서 같은 질문을 다시 실행해 기대 출처 7/7을 확인했습니다.
근거가 없는 질문에는 안내 문구를 보여 주고, 답하지 못한 질문으로 기록했다는 표시를 남깁니다.