바쁘신 분은 이것만:
채점을 “답이 맞았냐”로만 봤더니, 정답 문서를 안 읽고도 합격하는 문제가 3주 넘게 숨어 있었습니다.
검색 성능 문제가 아니라 검색 후보를 자르는 지점이 원인이었습니다.
한 번은 엉뚱한 수정 후 점수가 올라서 “효과 있다”고 착각하기도 했습니다. 😇
문제 상황 😵
회사 업무 문 서 116개에 챗봇을 붙여 사용하고 있고, 매주 질문 102개를 자동 채점하고 있습니다.
점수는 계속 안정적이었는데 어느 날 “답변할 때 실제로 어떤 문서를 읽었나”를 확인해봤습니다.
출장비 정산 질문 하나가 10번 연속 정답 문서를 읽지 않았는데도 6번이나 합격하고 있었습니다.
이유는 채점 기준이 핵심 단어 3개 중 2개면 합격이었기 때문입니다. 엉뚱한 문서에서도 흔한 단어 두 개를 가져오면 합격할 수 있었습니다.
어떻게 찾았나 📖
Claude Code에 원인을 추측하지 말고 아래 숫자부터 보여달라고 했습니다.
검색 후보와 점수를 그대로 보여줘.
정답 문서가 몇 위인지, 후보를 몇 개에서 자르는지, 어디서 탈락하는지 숫자로 보여줘.
몇 주 동안 못 찾던 원인이 바로 나왔습니다.
정답 문서는 검색에서는 1등이었는데 최종 심사까지 올라가지 못하고 있었습니다.
앞단에서 후보를 자를 때 동점 문서가 몰려 있었고, 동점 순서를 정하는 기준이 없어 사실상 랜덤으로 잘리고 있었습니다.
그래서 문서 내용이 바뀌지 않아도 재등록으로 저장 순서가 달라지면 어떤 날은 맞고 어떤 날은 틀렸습니다.
수정한 것 🔧
두 가지만 바꿨습니다.
동점일 때 후보 순서를 고정
의미검색 상위 문서는 무조건 최종 심사에 포함
기존 후보 수는 줄이지 않았습니다. 후보를 줄이면 다른 질문의 성능이 조용히 깨질 수 있기 때문입니다.
수정 후 같은 질문에서 핵심 단어 3개를 모두 맞혔고, 정답 문서도 정상적으로 인용했습니다.
삽질했던 부분 ⚠️
3주 전에는 이 문제를 “검색이 안 된다”고 판단해서 문서에 키워드를 추가했습니다.
점수가 0% → 33%로 올라서 해결된 줄 알았는데, 이번에 확인해보니 그 수정은 원리적으로 효과가 없었습니다.
그날 우연히 후보 추첨이 잘 된 것이었습니다.
또 하나 발견한 것은 최종 심사가 4초 안에 끝나지 않으면 에러 없이 심사를 건너뛰고 기존 순서를 사용하고 있었다는 점입니다.
답변 자체는 계속 나오기 때문에 겉으로는 정상처럼 보였습니다.
배운 점 💡
1. “답이 맞았나”와 “정답 문서를 보고 맞았나”는 따로 봐야 합니다.
RAG 챗봇이라면 정답률뿐 아니라 실제 참조 문서도 같이 평가해야 합니다.
2. 부분점수 기준은 생각보다 위험합니다.
“3개 중 2개”처럼 평가하면 흔한 단어만 조합해도 합격할 수 있습니다.
3. AI에게 원인을 물을 때는 설명보다 숫자를 먼저 요구하는 게 좋았습니다.
검색 순위, 점수, 후보 개수, 컷오프 위치를 먼저 보면 추측을 크게 줄일 수 있습니다.
4. 실패했는데도 정상 결과를 내는 fallback을 확인해야 합니다.
에러가 없다고 정상 동작하는 것은 아니었습니다.
아직 전체 102문항을 다 확인한 것은 아닙니다.
그래도 이번에 가장 크게 바뀐 것은 성능보다 “왜 못 찾았는지를 숫자로 볼 수 있게 된 것”입니다.
다음에는 직원들이 실제로 많이 묻는 “이거 어느 메뉴에서 하나요?” 같은 질문군도 평가셋에 추가해볼 생각입니다.