RAG 파이프라인을 붙였는데 환각 문제가 안 잡힙니다. 벡터 검색으로 관련 문서를 뽑아서 프롬프트에 컨텍스트로 넣고 답변을 생성하는데, 검색된 청크를 제가 눈으로 확인해보면 정답이 분명히 들어있어요. 그런데 모델은 그걸 무시하고 엉뚱한 걸 지어내서 답합니다.
프롬프트는 대략 "다음 문서를 참고해서 질문에 답하세요" 뒤에 검색 청크들 붙이고 마지막에 질문 넣는 구조예요. 컨텍스트가 프롬프트에 실제로 들어가는 것도 로그로 확인했고요.
모델이 컨텍스트를 아예 안 읽는 것도 아닌 게, 부분적으론 문서 내용을 반영하기도 해요. 근데 결정적인 숫자나 사실 부분에서 문서랑 다른 값을 자신있게 뱉습니다. 검색은 되는데 왜 근거를 안 쓰는 건지 모르겠어요.
댓글 4
1) 먼저 정말 그 청크에 답이 온전히 들어있는지 다시 보세요. 사람 눈엔 관련 문단으로 보여도, 청크가 문장 중간에 잘려서 결정적인 숫자가 다음 청크로 넘어가 있는 경우가 흔합니다. 그러면 모델 입장에선 근거가 반쪽이라 나머지를 지어내요. 청크 오버랩을 늘리거나 경계 기준으로 자르면 이게 줄어듭니다.
2) 프롬프트가 모델한테 사전지식 쓸 여지를 주고 있어요. "참고해서 답하세요"는 약합니다. "주어진 문서에 있는 내용만으로 답하고, 문서에 없으면 모른다고 말하라"고 명시적으로 못 박고, 컨텍스트를 구분자로 확실히 감싸세요. 가능하면 어느 문장을 근거로 썼는지 인용하게 하면 지어내기가 확 줄어요.
3) 청크를 너무 많이 넣으면 중간에 있는 정보를 흘립니다. 긴 컨텍스트에서 가운데가 묻히는 현상이에요. top-k를 줄이고 리랭커로 진짜 관련된 상위 몇 개만 남기세요.
숫자를 자신있게 틀리는 건 대부분 1번이나 2번입니다. 그 둘부터 잡아보세요.
그리고 이 증상 자체가 1번 문제(청크가 답을 반토막 낸다)의 신호이기도 해요. 답이 두 청크에 걸쳐 있으면 모델이 각각은 불완전하다고 보고 몸을 사리는 거예요. 오버랩을 좀 늘리거나 관련 청크를 top-k에서 넉넉히 확보해주면 한 프롬프트 안에 답 조각이 다 모여서 종합이 쉬워집니다. 지시 문구랑 청킹을 같이 만지면 균형이 잡혀요.