공부 노트
No.02 / RAG / 답의 신뢰

이 답을 믿어도 될까: 근거가 없으면 없다고 말하게 하기

검색이 맞는 조각을 가져와도, 모델은 그 조각에 없는 말을 그럴듯하게 이어 붙일 수 있어요. 「이 답을 믿어도 될까」를 사람이 매번 확인하지 않으려면 서버가 먼저 판정해야 한다고 생각했고, 그 장치를 세 가지로 나눠 만들어 봤어요.

By heysep6 min read근거 인용

Contents
  1. 세 가지 약속
  2. 왜 인용을 서버가 검증할까요
  3. 질문 종류마다 기대하는 행동이 달라요
  4. 답은 이렇게 보이게 했어요
  5. 측정해서 알게 된 것
  6. 확인 못 한 것

세 가지 약속#

답이 믿을 만하려면 최소한 이 세 가지는 지켜야 한다고 정했어요.

  1. 근거가 없으면 없다고 말해요. 자료에 없는 질문에 그럴듯한 답을 만들어 내지 않아요. 자료 밖의 일반 지식으로 답할 때는 「자료 밖」이라고 따로 표시해서, 내 자료에서 나온 말과 섞이지 않게 해요.
  2. 인용은 서버가 검증해요. 답에 붙은 인용 번호는, 서버가 모델에게 넘긴 근거 안에 있는 번호만 인정해요. 인용문도 모델이 쓴 문장이 아니라 원문에서 가져와요.
  3. 답이 안 되는 조각은 답으로 쓰지 않아요. 검색이 가져왔다고 해서 질문의 답이 되는 건 아니에요. 그 조각이 정말 답이 되는지 따로 판정해요.

왜 인용을 서버가 검증할까요#

처음에는 모델이 답과 함께 인용 번호와 인용문을 같이 쓰게 하면 충분하다고 생각하기 쉬워요. 그런데 모델이 쓴 인용문을 그대로 믿으면 인용은 장식이 돼요. 번호가 실제로 넘긴 근거에 없을 수도 있고, 인용문이 원문과 조금 달라질 수도 있어요. 이건 내가 겪은 사고가 아니라 구조에서 나온 걱정이에요. 모델의 출력은 확인하기 전에는 주장일 뿐이라서, 확인 가능한 것만 사실로 취급하기로 했어요.

그래서 서버가 두 가지를 해요. 하나는 모델이 말한 번호가 서버가 넘긴 근거 목록에 있는지 보고, 없는 번호는 지워요. 다른 하나는 화면에 보여 줄 인용문을 모델이 쓴 문장이 아니라 근거 조각의 원문에서 꺼내 와요. 지난 글에서 말한 것처럼, 우리가 덧붙인 글은 원문이 아니라서 근거로 인정하지 않아요.

질문 종류마다 기대하는 행동이 달라요#

「근거가 없으면 없다고 말한다」는 말은 생각보다 단순하지 않았어요. 질문을 몇 가지로 나누니 기대하는 행동이 서로 달랐어요.

질문 종류예시(지어낸 것)기대하는 행동
자료 안에 답이 있는 질문「라온 거래처 방문은 언제예요?」 (자료에 있음)근거를 붙여 답해요
자료에 없는 일반 질문「일반적으로 견적서에는 뭘 적나요?」「자료 밖」이라고 표시하고 일반 지식으로 답해요
비슷한 기록은 있지만 대상이 다른 질문「미르 거래처 방문은 언제예요?」 (자료에는 라온만 있음)없다고 말해요. 라온 일정으로 대신 답하면 안 돼요

세 번째가 제일 어려웠어요. 같은 속성(방문 일정)을 가진 다른 대상의 기록이 검색에 걸리면, 모델은 친절하게 그걸로 대신 답해 버려요. 형식은 답처럼 보이고 인용도 붙어 있어서 겉으로는 가장 믿음직해 보이는 오답이에요.

답은 이렇게 보이게 했어요#

장치가 서버 안에서만 돌면 사용자는 믿어도 되는지 알 수 없어요. 그래서 판정 결과가 화면에 그대로 드러나게 했어요. 지어낸 예시로 그리면 이런 모양이에요.

화면 예시
질문  라온 거래처 방문은 언제예요?
답    화요일 오후로 잡혀 있어요. [1]
[1]   "라온 방문은 화요일 오후로 확정" (방문 일정 메모에서 가져온 원문)

질문  일반적으로 견적서에는 뭘 적나요?
답    [자료 밖] 보통 품목, 수량, 단가, 유효 기간을 적어요.

첫 번째는 번호와 원문이 붙어 있어서 눌러 확인할 수 있어요. 두 번째는 번호가 없고 「자료 밖」 표시가 있어서, 내 자료가 아니라 일반 상식이라는 걸 한눈에 알 수 있어요. 둘을 섞어 쓰지 않는 게 핵심이에요. 일반 지식으로 답하는 게 나쁜 게 아니라, 어디서 나온 말인지 숨기는 게 문제라고 봤어요.

측정해서 알게 된 것#

구성을 네 가지로 나눠서 비교했어요. 벡터 검색만 쓰는 것, 단어 검색을 섞는 것, 거기에 재순위를 더한 것, 마지막으로 「답이 되나」 판정까지 더한 것이에요. 질문과 자료는 전부 지어낸 것이고, 같은 질문을 여러 번 돌렸어요.

  • 판정이 뚜렷하게 도운 곳은 하나였어요. 자료에 없는 일반 질문이에요. 판정이 없는 구성은 대부분 「찾지 못했어요」에서 멈췄고, 일반 지식으로 답을 넘기지 못했어요. 판정을 넣은 구성은 내가 만든 질문에서 모두 넘겼어요.
  • 나머지는 우열을 가리지 못했어요. 하이브리드 검색이나 재순위가 더 낫다고 말할 줄 알았는데, 질문 수가 적어서 신뢰구간이 모두 겹쳤어요. 겹치면 「구분할 수 없음」이라고만 쓰기로 했고, 그렇게 썼어요.
  • 대상이 다른 질문은 규칙을 넣어 크게 나아졌어요. 처음엔 절반 남짓만 거절했는데, 대상이 다르면 대신 답하지 말라는 규칙을 넣은 뒤 거의 다 거절했어요. 이때 정답을 잘못 거절하는 일이 늘지 않았는지도 함께 봤고, 정답 문항에서는 나빠지지 않았어요. 다만 별칭으로 묻는 질문 같은 곳에서 잘못 거절하는 경우가 몇 개 남았어요.

한계도 있었어요. 이 규칙은 모델이 거절하게 만들 뿐이에요. 「이 방에 미르라는 말은 없지만 라온 방문 얘기는 있어요」처럼 가까운 기록을 안내하고 싶어도, 지금은 모델이 쓴 문장을 버리고 정해 둔 거절 문구만 내보내서 그 안내는 사용자에게 가지 않아요. 고치려면 답의 형식을 바꿔야 해서 일단 남겨 뒀어요.

확인 못 한 것#

  • 지어낸 자료는 실제 문서보다 쉬워요. 문장이 깔끔하고 사실이 뚜렷해서, 점수는 실제 품질의 상한에 가깝다고 봐야 해요. 실제 데이터로는 재지 못했어요.
  • 한국어, 모델 하나, 임베딩 하나로만 쟀어요. 모델이 바뀌면 달라질 수 있어요.
  • 문장의 사실 정확성은 재지 않았어요. 부정어가 빠지거나 뜻이 살짝 바뀐 답은 인용 번호만 맞으면 통과할 수 있어요.
  • 사람이 검토하지 않은 문항이 일부 섞여 있어요.
  • 대화 기록 쪽은 같은 질문을 여러 번 돌렸을 때 답이 달라진 질문이 꽤 있었어요. 문서 쪽은 그렇지 않았고요. 왜 그런지는 확인 못 했어요.

정리하면, 인용 검증은 「틀린 인용을 막는 장치」이지 「틀린 답을 막는 장치」가 아니에요. 번호와 원문이 맞아도 모델이 근거를 잘못 읽을 수는 있어요. 그 틈을 줄이는 쪽은 거절 판정이고, 아직 갈 길이 남아 있어요.

다른 글

글 목록으로 돌아가기