본문으로 건너뛰기
AIPida
채택됨실전AI 개발

RAG 답변이 검색 청크엔 정답이 있는데 모델이 엉뚱하게 답합니다 (한국어 임베딩)

한국어 사내 문서로 RAG 챗봇 만드는 중입니다. 문제는 retrieval로 가져온 청크를 직접 까보면 정답 문장이 분명히 들어 있는데, LLM이 최종 답변에서 그걸 무시하고 일반 지식으로 대충 답하거나 "문서에 없다"고 합니다.

임베딩은 다국어 모델 쓰는 중이고, 청크는 500토큰 정도로 자르고 top-k=5로 넣습니다. recall은 직접 확인했을 때 나쁘지 않은데 generation에서 새는 느낌이에요.

프롬프트는 대충 "아래 문서를 참고해서 답하세요" + 청크 5개 + 질문 순서로 넣고 있습니다. 뭘 잘못하고 있는 걸까요?

답변 2

  • 채택된 답변에디터 검증

    retrieval 멀쩡한데 generation에서 샌다 — 이거 거의 항상 프롬프트랑 컨텍스트 배치 문제입니다. 모델 탓하기 전에 여기부터 보세요.

    제일 먼저 의심할 거: 지시가 약합니다. "참고해서 답하세요"는 모델한테 사전지식 써도 된다는 허락으로 읽혀요. 이렇게 못 박으세요.

    오직 아래 제공된 문서에만 근거해 답하라.
    문서에 근거가 없으면 "제공된 문서에서 찾을 수 없습니다"라고만 답하라.
    사전 지식으로 보충하지 말 것.
    

    그다음 효과 큰 거 두 개:

    • 청크마다 [문서 1], [문서 2] 번호 붙이고 인용 강제. "답변 근거가 된 문서 번호를 [문서 N]으로 표기하라" 한 줄 넣으면 모델이 실제로 청크를 읽기 시작합니다. 인용 강제가 환각도 같이 잡아줘서 가성비 최고예요. 저는 이거 하나로 "문서에 없다" 오답이 체감 절반 이하로 줄었어요
    • lost in the middle. 청크 5개 넣을 때 제일 관련 높은 게 한가운데 묻히면 모델이 잘 못 봅니다. 진짜로 위치 영향 있어요. 리랭커 점수 순으로 정렬해서 제일 중요한 걸 맨 앞이나 맨 뒤에 두세요

    그리고 500토큰 고정 분할이면 정답 문장이 두 청크에 걸쳐 반토막 났을 가능성도 있습니다. 검색은 반쪽만 걸려도 점수가 나오는데, generation 들어가면 잘린 문장이 오히려 모델을 헷갈리게 해요. overlap 50~100토큰 주거나 문장/문단 경계로 자르세요.

    순서 추천하면, 위 인용 강제 프롬프트부터 박아보고 그래도 새면 청킹 손보세요. 아마 프롬프트 선에서 대부분 잡힐 겁니다.

  • 한국어 특화 함정 하나. 다국어 임베딩은 한국어에서 어휘는 비슷한데 의미가 정반대인 문장을 가깝게 임베딩하는 경우가 꽤 있습니다. "환불 가능" vs "환불 불가" 같은 거. 부정어 한 글자 차이를 잘 못 잡아요.

    그래서 recall은 높아 보여도 정작 "정확히 맞는" 청크가 top-1이 아니라 top-4쯤 가 있고, 그 위에 헷갈리는 청크들이 깔려서 모델이 위에 거 보고 오답 내는 거죠. 까보면 정답이 들어는 있으니까 recall 통계는 좋게 나오고요. 질문자분 증상이랑 비슷할 듯.

    한국어 검색이면 dense만 쓰지 말고 BM25 같은 키워드 검색이랑 하이브리드로 묶은 뒤 리랭커 한 번 태우는 걸 권합니다. 사내 문서엔 제품명/고유명사 많아서 키워드 매칭이 의외로 셉니다.