본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 08. 03:36

충실도(Faithfulness) 분산 = 0.000: 셀프 채점(Self-grading) RAG 평가의 실제 모습

요약

RAG 시스템 평가 시 동일 모델을 사용하는 셀프 채점(Self-grading) 방식의 위험성을 경고합니다. 셀프 채점 시 분산이 0으로 나타나는 현상은 모델이 답변을 실제로 분석하지 않고 기계적으로 승인하고 있음을 나타내는 결정적 지표입니다.

핵심 포인트

  • 셀프 채점 시 분산이 0이면 모델이 답변을 읽지 않고 승인하고 있을 가능성이 높음
  • 독립적인 모델 계열을 판사(Judge)로 사용하는 것이 평가의 타당성 확보에 유리함
  • 분산(Spread) 값은 평가 모델이 답변의 품질 차이를 구별하는지 판단하는 핵심 지표임

설명: "저는 RAG 평가를 두 번 실행했습니다. 한 번은 동일한 모델이 스스로를 채점하게 했고, 다른 한 번은 다른 계열의 독립적인 판사(Judge)를 사용했습니다. 무엇이 변했는지, 그리고 왜 분산(spread) = 0.000이 결정적인 단서인지 소개합니다."

지난 포스트에서 저는 구체적인 내용을 주장했습니다. 충실도(faithfulness) 점수는 0.67이었지만, 독립적인 판사는 100개의 답변 중 33개가 문맥에 근거(grounded)하고 있음에도 여전히 사실적으로 틀렸다는 것을 발견했습니다.

타당한 질문입니다: 왜 그 판사를 신뢰해야 할까요?

저는 평가를 두 번 실행했기 때문에 구체적인 답변을 가지고 있습니다. 첫 번째 실행에서는 생성(generation)과 채점(judging) 모두에 동일한 모델을 사용했습니다 — 즉, 셀프 채점(self-grading)입니다. 두 번째 실행에서는 완전히 다른 모델 계열을 판사로 사용했습니다. 다음은 두 방식의 수치입니다.

전과 후

지표 (Metric)셀프 판사 (Self-judge, 동일 모델 qwenj)독립 판사 (Independent judge, gemma4:31b)
충실도 평균 (faithfulness mean)0.77510.6662
...

분산(spread) 행을 읽어보십시오. 셀프 판사는 정확히 0.0000의 분산을 반환했습니다 — "0에 가까운" 것이 아니라, 말 그대로 0입니다. 모든 쿼리가 동일한 충실도 분포를 반환했습니다. 판사가 답변을 읽고 있지 않았던 것입니다. 그저 기계적으로 승인(rubber-stamping)하고 있었습니다.

독립 판사는 0.05의 분산을 반환했습니다. 작지만 0은 아니었습니다. 즉, 판사가 실제로 더 나은 답변과 더 나쁜 답변을 구별하고 있었다는 뜻입니다.

그 단 하나의 차이로부터 다른 모든 결과가 도출됩니다.

왜 분산(spread) = 0.000이 결정적인 단서인가

진정으로 평가하는 판정자(Judge)라면 어떤 답변은 다른 답변보다 더 충실하다고 판단할 것이며, 쿼리(Query)에 따라 스스로의 판단이 달라질 것입니다. 반면, 단순히 승인만 하는(rubber-stamping) 상태로 전락한 판정자는 읽기를 중단했기 때문에 모든 것에 동일한 점수를 부여합니다. 이때 분산(Variance)은 평평해집니다.

0이 아닌 분산(Non-zero spread)은 좋은 판정자임을 나타내는 필요조건이지만 충분조건은 아닙니다. 무작위로 점수를 매기는 판정자 또한 분산을 가집니다. 분산 확인은 최악의 경우인 '판단의 완전한 붕괴'를 배제할 수 있는 것이지, 모든 경우를 배제하는 것은 아닙니다. 여전히 골드 스탠다드(Gold standard)는 샘플링된 하위 집합에 대한 인간 라벨링 일치도(Human-label agreement)입니다. 하지만 분산이 0이라는 것은 무언가 잘못되었다는 즉각적인 위험 신호(Red flag)입니다.

셀프 판정자(Self-judge)는 충실도(Faithfulness)를 0.7751로 부여했습니다. 이 수치는 거의 확실하게 부풀려진 것입니다. 동일한 모델이 답변을 생성하고 이를 다시 평가할 때, 모델은 자신의 문구(Phrasing)를 인식하고 이에 대해 보상을 주는 경향이 있습니다. 기술적 용어로는 자기 강화 편향(Self-enhancement bias)이라고 하며, 이는 모델의 능력에 따라 규모가 커지고 작성자가 숨겨져 있는 경우에도 지속되는 것으로 문서화된 효과입니다.

부풀려진 충실도가 하류(Downstream) 공정에 미치는 영향

충실도의 부풀려짐은 단 하나의 숫자만 바꾸는 것이 아닙니다. 이는 연쇄적으로 영향을 미칩니다.

셀프 판정자는 더 많은 답변을 "충실함"으로 점수 매겼습니다(부풀려진 0.7751 vs 0.6662). 충실한 풀(Pool)이 커진다는 것은 근거는 있지만 틀린(Grounded-but-wrong) 답변이 될 기회가 더 많아짐을 의미합니다. 이것이 셀프 판정자가 48개의 근거는 있지만 틀린 답변을 찾아낸 반면, 독립적 판정자(Independent judge)는 33개만을 찾아낸 이유입니다. 셀프 판정자는 독립적 판정자가 올바르게 거부한 답변들을 "근거 있음(Grounded)"으로 계산하고 있었습니다. 충실도에서의 거짓 양성(False positives)은 근거는 있지만 틀린 답변에서의 거짓 양성을 만들어냅니다.

독립적 판정자는 충실도에 대해 더 정확했기에, 두 숫자 모두를 현실에 가깝게 축소시켰습니다.

독립적 판정자를 구축한 방법

중요한 세 가지 요소는 다음과 같습니다:

교차 계열 분할 (Cross-family split). 제가 사용한 생성 모델(Generator)은 qwen3:32b (Qwen, Alibaba)입니다. 판정자(Judge)는 gemma4:31b (Gemma, Google)입니다. 서로 다른 모델, 서로 다른 계열, 서로 다른 학습 계보를 가집니다. 자기 선호 편향 (Self-preference bias)은 단순히 동일한 체크포인트뿐만 아니라 모델 계열 전체에 걸쳐 나타납니다. 따라서 다른 Qwen 체크포인트를 판정자로 사용하는 것도 여전히 의심스러울 수 있습니다. 핵심은 계열(Family)의 경계를 넘는 것입니다.

정답 기준점 (Ground-truth anchor). 자기 선호 편향은 비교할 정답이 없는 주관적인 작업에서 가장 심하게 나타납니다. JQaRA는 골드 답변 (Gold answers)을 제공합니다. 저의 정확성 검사 (Correctness check)는 판정자에게 모델의 답변을 골드 답변과 비교하도록 요청하며, 단순히 자유로운 의견을 내도록 하지 않습니다. 참조값에 기준을 고정 (Anchoring)함으로써 편향이 숨어들 수 있는 범위를 줄입니다.

온프레미스 (On-prem) 비용. 32GB VRAM을 갖춘 단일 RTX 5090 환경에서는 qwen3:32b (20GB)와 gemma4:31b (19GB)를 동시에 상주 시킬 수 없습니다. 그래서 저는 2패스 (Two-pass) 아키텍처를 구축해야 했습니다. 먼저 모든 생성을 수행한 다음, 명시적으로 VRAM을 언로드(Unload)하고, 그 후에 모든 판정을 진행하는 방식입니다. 또한 OpenAI 호환 엔드포인트를 우회하는 작업도 필요했습니다. 사고 능력이 있는 모델(Thinking-capable models)은 콘텐츠를 출력하기 전에 추론 토큰 (Reasoning tokens)으로 max_tokens를 소진해 버리기 때문에, Ollama의 네이티브 /api/chat을 사용하며 think=false 옵션을 적용했습니다. 이 과정들이 어려운 것은 아니지만, 온프레미스에서 이를 제대로 수행하기 위한 운영상의 현실이며, 이러한 마찰 때문에 대부분의 사람들이 단일 패스 방식의 셀프 채점 (Self-judging)을 기본값으로 선택하게 됩니다.

한계에 대한 솔직한 고백

0이 아닌 분산 값은 무조건적인 승인 (Rubber-stamping)을 배제합니다. 하지만 이것이 판정자가 보정(Calibrated)되었다는 것을 증명하지는 않습니다. 이를 위해서는 샘플에 대해 수동 레이블링 (Hand-label)을 해야 합니다. 즉, 30~50개의 답변을 직접 채점하고 판정자와 얼마나 자주 일치하는지 측정해야 합니다. 저는 이번 실행에 대한 해당 보정 데이터를 아직 공개하지 않았습니다. 분산 확인은 빠른 타당성 검사 (Sanity gate)일 뿐, 최종 목적지는 아닙니다.

RAG 평가의 통과 기준 설정하기

  1. 독립적인 판사(Independent judge) — 단순히 다른 체크포인트가 아닌, 다른 계열의 모델이어야 합니다. 셀프 채점(Self-judging) 수치는 보여주기식일 뿐입니다.
  2. 존재하는 경우 정답(Ground truth)을 활용하세요. 참조 답변(Reference answer)은 그 어떤 프롬프팅 기술보다 편향(Bias)의 범위를 줄여줍니다.
  3. 타당성 검사(Sanity check)로서 분산(Spread)을 확인하세요. 평균값과 함께 분산을 보고하십시오. 분산이 0이라면 즉시 중단하십시오. 무언가 잘못되었습니다.
  4. 운영 환경에서 판사를 신뢰하기 전에, 샘플에 대해 인간 라벨링 교정(Human-label calibration)을 수행하세요.

셀프 채점 실행 결과는 분산이 0인, 깨끗해 보이는 0.77의 충실도(Faithfulness)를 보여주었습니다. 하지만 독립적인 실행 결과는 0.05의 분산과 함께 0.67을 기록했으며, 근거는 있지만 틀린(grounded-but-wrong) 답변을 15개 더 적게 찾아냈습니다. 실제 시스템은 셀프 채점기가 주장한 것보다 성능이 낮았지만, 부풀려진 수치가 시사하는 것보다 더 정확하게 특성화되었습니다. 0.67이 더 신뢰할 수 있는 이유는 바로 그 수치가 더 낮기 때문입니다.

다음 단계

두 단계 모두를 포함한 전체 실행 과정 — 인프라 수정, 원시 점수(Raw scores) 포함 — 은 여기에서 확인할 수 있습니다: github.com/elvisyao007/eval-driven-llm. 다음 단계로 저는 동일한 독립적 설정으로 판단되는 하이브리드 검색(Hybrid retrieval)을 통해 context_recall = 0.41 문제를 해결하러 갑니다. 공개 빌드(Build in public)를 계속 지켜봐 주세요.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0