RAG 연습 (5) — 점수가 낮았는데 LLM 탓이 아니었다
RAG 연습 (4)에서 메트릭 읽는 법을 정리했으니, 이번엔 실제로 그 점수를 들고 디버깅한 얘기입니다. 결론부터 말하면, 0.47이라는 낮은 점수의 원인은 LLM도 검색 알고리즘도 아니었습니다. 데이터 문제였습니다.
처음 점수를 보고 멈칫했다
RAG 파이프라인 35개 체크리스트 테스트를 다 통과시킨 뒤 처음으로 Ragas를 돌렸습니다.
1
2
3
4
faithfulness : 0.473
context_precision : 0.599
context_recall : 0.553
평균 : 0.542
0.70 미만은 “검색 파이프라인 또는 데이터 품질 문제”라는 게 일반적인 기준입니다. 형식 테스트는 다 통과했는데 왜 이 점수가 나왔는지 한참 들여다봤습니다.
도메인별로 쪼개니 그림이 보였다
전체 30개 질문을 도메인별로 나눠서 키워드 매칭률을 봤습니다.
1
2
3
4
세무 리스크 72%
계약/판례 46%
수익인식 29%
부정 탐지 23%
같은 파이프라인, 같은 LLM인데 도메인 간 차이가 너무 큽니다. 처음엔 “부정 탐지 쪽 질문이 너무 어렵게 설계된 거 아닐까” 싶었습니다. 그런데 실제 답변을 하나씩 열어보니 전혀 다른 문제였습니다.
세무 도메인 답변 — 깔끔하게 잡힘
질문: “납부지연 가산세 요율과 한도는?”
1
2
3
4
5
국세기본법 제47조의3에 따라 납부지연 가산세는
미납세액 × 경과일수 × 0.022% / 1일로 계산합니다.
한도는 미납세액의 75%입니다.
[출처: 국세기본법 제47조의3]
조문 번호, 수치, 출처까지 정확합니다. 이유는 단순합니다. 국세기본법 제47조의3 원문이 코퍼스에 들어 있고, 검색이 그 청크를 찾아왔고, LLM은 그걸 그대로 요약했습니다. RAG가 의도대로 작동했습니다.
부정 탐지 답변 — 그럴듯하지만 근거가 없음
질문: “분기말 가공매입 패턴의 특징은?”
1
2
3
4
5
6
7
8
9
분기말 가공매입은 재무제표 마감 직전에 실제 거래 없이
세금계산서를 발급받아 매입 원가를 부풀리는 부정 유형입니다.
주요 특징:
- 분기 마감일 기준 2주 이내 매입 집중
- 동일 거래처에서 반복 고액 청구
- 물품 수령 기록 없음
[출처: 세금계산서 관련 부가가치세법 조항]
답변 자체는 그럴듯합니다. 틀린 말도 아닙니다. 그런데 faithfulness가 낮게 찍혔습니다.
이유를 찾으려 컨텍스트를 까봤더니, “분기 마감일 2주 이내”, “동일 거래처 반복”, “물품 수령 기록”이라는 내용이 컨텍스트 어디에도 없었습니다. 출처로 달린 부가가치세법은 세금계산서 발급 시기에 관한 조항이었습니다. 그게 검색에 잡혀 올라왔고, LLM은 그 조항을 근거로 답한 게 아니라 훈련 데이터에서 알고 있는 부정탐지 상식을 그냥 말한 것이었습니다.
Ragas는 이걸 잡아냈습니다. faithfulness가 낮다는 건 “답변 문장 중 컨텍스트에 근거 없는 것이 많다”는 뜻이고, 이 케이스의 진짜 원인은 LLM 환각이 아니라 코퍼스에 해당 내용이 없어서 LLM이 알아서 채운 결과였습니다.
K-IFRS도 같은 패턴
수익인식 도메인의 “SaaS K-IFRS 1115 수익인식 방법은?”을 물었더니 답변이 꽤 길고 정확하게 나왔습니다. 5단계 수익인식 프로세스를 잘 설명했습니다.
그런데 ground_truth의 핵심 키워드인 “over-time”, “제35조”, “기간 안분”이 답변에 없었습니다. 키워드 매칭 25%.
확인해 보니 K-IFRS 1115호 기준서 자체가 코퍼스에 없었습니다. 인제스트된 법령 15종은 세법 위주였습니다. LLM은 훈련 데이터에서 K-IFRS를 알고 있으니까 그럴듯하게 대답했지만, 우리 시스템이 “K-IFRS 제35조에 근거해서” 답변한 게 아니었습니다.
RAG의 목적이 “검색된 근거에 기반한 답변”인데, 이 경우엔 RAG가 사실상 작동 안 한 셈입니다. 그냥 LLM 직접 답변과 다를 바 없었습니다.
“LLM이 아는 것”과 “시스템이 검색한 것”은 다르다
이번 평가에서 가장 또렷하게 정리된 게 이거였습니다.
LLM은 훈련 데이터로 많은 걸 알고 있습니다. K-IFRS도 알고, 부정 탐지 패턴도 알고, 한국 세법도 어느 정도 압니다. 그래서 코퍼스가 없어도 그럴듯한 답을 냅니다.
RAG를 쓰는 이유는 그 답변의 근거를 추적 가능하게 만들기 위해서입니다. 어떤 문서의 어느 조항에서 나온 말인지 명시할 수 있어야 회계·법무 같은 도메인에서 쓸 수 있습니다.
코퍼스에 없는 주제를 LLM이 알아서 대답하면, 그건 RAG가 아니라 그냥 챗봇입니다. 출처를 달 수 없고, 잘못됐을 때 어디가 잘못됐는지 추적이 안 됩니다. faithfulness가 낮다는 건 그 신호였습니다.
Ragas 없었으면 못 알아챘을 것
35개 파이프라인 체크리스트 테스트는 “출처 형식이 올바른가”, “한국어로 답하는가” 같은 형식 검증입니다. “답변의 내용이 실제로 검색된 문서에서 나왔는가”는 눈으로 30개 답변을 일일이 대조하지 않으면 알기 어렵습니다. Ragas는 평가 LLM이 직접 그 대조를 수행합니다.
처음엔 0.47이라는 숫자가 실망스러웠는데, 오히려 어디가 문제인지 정확히 가리켜 줘서 다음 할 일이 명확해졌습니다.
점수를 올리는 방법은 단순하다
부족한 코퍼스를 채우면 됩니다.
- K-IFRS 1115호·1109호 인제스트 → 수익인식
context_recall회복 - 내부감사 체크리스트 또는 IIA 기준 인제스트 → 부정 탐지
context_recall회복 - 시스템 프롬프트에 “코퍼스에 없으면 없다고 말해라” 추가 →
faithfulness개선
LLM을 바꿀 일도, 검색 알고리즘을 뜯어고칠 일도 아니었습니다. 데이터 문제는 데이터로 푸는 게 맞았습니다.
RAG 평가 점수가 낮을 때, LLM 탓 하기 전에 코퍼스에 그 내용이 있는지 먼저 확인할 것.
이후 업데이트: K-IFRS 1115호 조문 7개(제35조 over-time, 제38조 point-in-time, 제27조 수행의무 구별, 제50조 변동대가, 제73조 SSP 배분, B34-B38 본인/대리인, 제18조 계약 수정)와 내부감사 부정탐지 가이드라인 7개(벤포드 법칙, 결재한도 분할, 라운드 넘버, 중복 거래, 비업무시간대, 거래 속도 이상, 분기말 기간귀속)를 인제스트하고 다시 돌렸더니 결과가 이렇게 움직였습니다.
1 2 3 4 faithfulness : 0.473 → 0.531 (+5.8p) context_precision : 0.599 → 0.813 (+21.4p) context_recall : 0.553 → 0.738 (+18.5p) 평균 : 0.542 → 0.694 (+15.2p)도메인별 키워드 매칭률은 더 또렷합니다.
1 2 3 4 부정 탐지 : 23% → 69% (+46p) 수익인식 : 29% → 56% (+27p) 세무 리스크 : 72% → 81% (+9p) 계약/판례 : 46% → 54% (+8p)진단이 맞았습니다. 코퍼스 갭을 채웠더니
context_recall이 0.553에서 0.738로 올랐습니다. 정답 사실의 26%가 더 검색됐다는 뜻입니다.context_precision은 21.4p로 더 크게 올랐는데, 관련 청크가 코퍼스에 들어오니 검색 상위에 잘 올라온 효과입니다.
faithfulness는 5.8p 상승에 그쳐 아직 0.531입니다. 채권양도(민법), 최저임금법 제28조, 이사회 결의(상법) 같이 여전히 코퍼스에 없는 영역에서 LLM이 훈련 데이터로 답을 채우고 있어서입니다. 평균 0.694는 Ragas 0.70 기준선 바로 아래라, 남은 코퍼스 두 종을 더 넣으면 통과할 것 같습니다.
(클로드 코드의 도움을 받았습니다.)