Field Log · Entry

LLM Hallucination과 Factuality: Claim·Evidence·Citation 평가 (5/10)

LLM 장문 답변을 atomic claim으로 분해하고 각 claim을 evidence span과 대조해 지원 모순 근거 부족으로 판정하며 citation 정확성과 coverage를 계산하는 구조

오늘의 결론

  • Hallucination을 답 전체의 yes/no label로만 보면 고칠 위치를 찾기 어렵습니다. 답을 독립적으로 검증 가능한 atomic claim으로 분해하고 각 claim을 supported, contradicted, insufficient evidence로 판정합니다.
  • Factuality, source-groundedness, citation correctness, citation coverage, answer completeness는 서로 다릅니다. 사실인 문장도 주어진 문서 밖 지식이면 strict RAG contract를 위반할 수 있고, 인용이 정확해도 중요한 답을 누락할 수 있습니다.
  • Citation 번호가 있다는 사실은 근거가 있다는 뜻이 아닙니다. Claim과 정확한 source span의 entailment, source quality·version·access, 인용 위치를 함께 평가합니다.
  • Retrieval failure와 generation failure를 분리합니다. Gold evidence를 줬을 때도 틀리면 generation/reasoning 문제이고, gold evidence에서는 맞지만 live retrieval에서 실패하면 retrieval 문제입니다.
  • LLM judge와 search-augmented evaluator는 규모를 늘려 주지만 ground truth가 아닙니다. Human-adjudicated set에서 claim extraction·entailment·citation score를 각각 calibration하고 critical false positive를 별도 gate로 둡니다.

앞 글에서는 uncertainty signal을 calibration해 답변·재검색·질문·중단으로 routing했습니다. 이번에는 이미 생성된 답의 어떤 문장이 실제 근거로 지지되는지 검사합니다.

response
  → atomic claims {c₁, c₂, ...}
  → evidence spans {e₁, e₂, ...}
  → relation(cᵢ, eⱼ)
       supported | contradicted | insufficient
  → claim metrics + citation metrics + error attribution
  → accept | repair | retrieve | abstain

LLM 장문 답변을 atomic claim으로 분해하고 versioned evidence span과 대조해 supported contradicted insufficient evidence로 판정하며 citation correctness coverage source quality와 retrieval generation 오류를 분리하는 구조

그림 1. RAG의 사실성은 “출처를 달았다”가 아니라 claim과 evidence 사이의 검증 가능한 관계다. 평가 단위를 작게 만들수록 검색·생성·인용 중 어느 단계가 실패했는지 보인다.


Hallucination을 Product Contract로 정의한다

“Hallucination이 없다”는 말은 범위가 너무 넓습니다. 먼저 어느 세계를 truth source로 삼는지 정합니다.

Open-world Factuality

세상의 사실과 맞는지 묻습니다.

claim: "논문 X는 2024년에 발표됐다."
truth source: authoritative publication record

최신성, source authority, web 변화가 중요합니다.

Closed-book Factuality

Model이 외부 context 없이 답한 사실이 reference와 맞는지 봅니다. SimpleQA처럼 단일하고 명확한 short fact를 평가할 수 있습니다.

Source-grounded Factuality

주어진 context가 answer claim을 지지하는지 묻습니다.

contract:
  answer only from policy-v12 supplied in context

세상에서는 사실이어도 context에 없으면 insufficient evidence입니다. Enterprise RAG에서는 이 strict contract가 필요할 때가 많습니다.

Episode Factuality

Tool과 environment가 반환한 현재 state에 맞는지 봅니다.

claim: "주문이 취소됐습니다."
truth source: cancellation API result + transaction state

Model의 기억이나 문서가 아니라 실행 결과가 authoritative합니다.

Intrinsic·Extrinsic 표현보다 Relation을 기록한다

문헌에서는 source와 모순되는 intrinsic hallucination, source에서 검증되지 않는 extrinsic hallucination처럼 분류하기도 합니다. Production trace에는 더 직접적인 세 label이 유용합니다.

Label의미예시 행동
supportedEvidence가 claim을 함의유지
contradictedEvidence가 claim의 반대를 지지제거·수정
insufficient evidence지지도 반박도 못 함추가 검색·질문·abstain

insufficientfalse로 강제하지 않습니다. 근거 부족과 실제 거짓은 다른 실패입니다.


Factuality·Faithfulness·Grounding을 구분한다

Factuality

Claim이 외부 현실이나 정한 reference truth와 맞는가?

Groundedness

Claim이 제공된 evidence에서 도출되는가?

Faithfulness

답이 source·tool result·instruction을 왜곡하지 않고 반영하는가?

Correctness

Task가 요구한 최종 판단이나 결과가 맞는가?

Completeness

요청에 필요한 중요 claim을 충분히 포함하는가?

다음 조합이 가능합니다.

factually true but not grounded:
  context 밖의 올바른 배경지식을 추가

grounded but incomplete:
  문서 한 조항은 정확히 인용했지만 예외를 누락

fully cited but incorrect:
  모든 문장에 citation은 있으나 span이 claim을 지지하지 않음

correct decision with unfaithful reason:
  결론은 맞지만 잘못된 조항을 이유로 제시

한 개 “hallucination score”로 합치면 이 차이를 잃습니다.

Atomic Claim이 평가 단위다

장문 한 문장에 여러 사실이 들어갈 수 있습니다.

원문 답:
  "환불은 구매 후 14일 이내 가능하고,
   디지털 상품도 미사용이면 동일하며,
   처리는 영업일 3일이 걸립니다."

이를 독립적으로 검증할 claim으로 나눕니다.

c1: 일반 환불 기한은 구매 후 14일이다.
c2: 미사용 디지털 상품에도 같은 기한이 적용된다.
c3: 환불 처리는 영업일 3일이 걸린다.

문서가 c1만 지지한다면 답 전체를 supported로 처리하면 안 됩니다.

좋은 Atomic Claim의 조건

  • 주어·관계·목적어가 명확합니다.
  • 시간·지역·단위·조건을 보존합니다.
  • 대명사를 원래 entity로 복원합니다.
  • 하나의 독립 truth condition을 가집니다.
  • 원문에 없던 정보를 분해 과정에서 추가하지 않습니다.
  • Opinion과 factual assertion을 구분합니다.

Claim Decomposition의 함정

  • “A이므로 B”를 A와 B만 나누고 인과 관계 claim을 잃습니다.
  • Negation이나 exception을 떨어뜨립니다.
  • 수식어를 삭제해 더 넓은 claim으로 만듭니다.
  • 같은 사실을 여러 claim으로 중복 생성합니다.
  • Generator의 모호한 문장을 evaluator가 임의로 명확하게 고칩니다.

Claim extractor도 human-labeled decomposition set으로 precision·recall을 평가합니다.

Required Claim Set도 필요하다

Generated claim만 평가하면 model이 한 문장만 안전하게 답해 높은 precision을 얻을 수 있습니다. 질문을 충족하는 데 필요한 claim set을 따로 정의합니다.

user asks:
  "환불 가능한지와 처리 기간을 알려줘"

required:
  eligibility decision
  applicable conditions
  processing duration
  uncertainty / missing information

이 set으로 completeness를 측정합니다. Open-ended task에서는 rubric과 human adjudication이 필요합니다.


Claim–Evidence 관계를 판정한다

Evidence e가 claim c를 지지하는지 세 가지 관계로 봅니다.

relation(e, c) ∈ {
  entailment,
  contradiction,
  not_enough_information
}

Entailment

Evidence가 참이라면 claim도 참이어야 합니다. 단순 단어 overlap이 아닙니다.

e: "구매일로부터 14일 이내, 미사용 상품은 청약철회 가능"
c: "미사용 상품은 구매 후 14일 안에 철회 가능"
→ supported

Contradiction

조건을 맞춘 같은 사건에서 claim과 반대입니다.

e: "디지털 콘텐츠를 다운로드한 경우 철회 불가"
c: "다운로드한 디지털 콘텐츠도 철회 가능"
→ contradicted

Not Enough Information

Evidence에 판단에 필요한 정보가 없습니다.

e: "환불 승인 후 카드사에 전달된다"
c: "환불은 영업일 3일 안에 완료된다"
→ insufficient evidence

조건을 정규화한다

Entailment 오류는 수식어에서 자주 생깁니다.

  • 날짜와 timezone
  • 지역과 법 적용 범위
  • 상품 유형
  • 사용자 자격
  • 일반 규칙과 예외
  • 상한·하한·근사값
  • 부정과 이중 부정
  • 과거 version과 현재 version

Claim representation에 이 slot을 보존합니다.

{
  "subject": "digital_content_refund",
  "predicate": "eligible",
  "conditions": {
    "downloaded": false,
    "days_since_purchase_lte": 14,
    "region": "KR"
  },
  "source_version": "policy-v12"
}

자연어 NLI score만 쓰지 않고 중요 domain은 rule·schema 검사를 결합합니다.

Evidence Span은 최소 충분해야 한다

문서 전체를 citation으로 붙이면 evaluator가 관련 문장을 찾아야 하고 사용자도 검증하기 어렵습니다.

좋은 evidence span:

  • Claim을 지지하는 데 필요한 문장을 포함합니다.
  • 조건과 exception을 잘라내지 않습니다.
  • 불필요한 주변 text를 최소화합니다.
  • Document id, section, version, page/span offset이 있습니다.
  • Table header와 footnote 같은 구조를 보존합니다.
{
  "document_id": "refund-policy",
  "version": "12",
  "section": "3.1",
  "page": 7,
  "start_char": 428,
  "end_char": 612,
  "content_hash": "sha256:..."
}

Offset만 저장하고 document가 수정되면 같은 위치가 다른 text를 가리킬 수 있습니다. Snapshot hash를 함께 둡니다.


Citation을 네 축으로 평가한다

1. Citation Correctness

인용한 source가 바로 앞이나 연결된 claim을 실제로 지지하는가?

citation correctness
  = supported cited claims / cited claims

여러 citation 중 하나만 지지하거나 여러 source를 함께 봐야 entail되는 경우를 rubric에 정의합니다.

2. Citation Coverage

검증 가능한 factual claim 중 citation이 필요한 claim을 얼마나 인용했는가?

citation coverage
  = cited factual claims / factual claims requiring citation

모든 문장에 citation을 강제할 필요는 없습니다. 사용자 입력 재진술, 계산 과정, 명시적 의견을 구분합니다.

3. Citation Completeness

질문의 핵심 required claim이 근거와 함께 포함됐는가?

required claim coverage
  = supported required claims / all required claims

4. Citation Quality

Source가 authoritative, current, accessible한가?

  • 공식 정책과 2차 블로그
  • 최신 version과 폐기된 version
  • 원문과 search snippet
  • Public source와 권한 없는 source
  • 정확한 page/span과 homepage 링크

정확한 claim을 낮은 품질 source가 지지할 수 있으므로 correctness와 quality를 분리합니다.

Citation Placement

어느 citation이 어느 claim을 지지하는지 모호하지 않아야 합니다.

좋음:

미사용 상품은 구매 후 14일 이내 철회할 수 있습니다.[policy-v12 §3.1]

모호함:

환불 정책은 여러 조건이 있으며 처리 기간도 다릅니다. 자세한 내용입니다.[문서1][문서2][문서3]

Sentence나 claim id에 citation을 연결합니다.


Factual Precision과 Completeness를 함께 본다

Atomic claim 중 supported 비율:

claim precision
  = # supported generated claims
    / # verifiable generated claims

높은 precision만 최적화하면 짧고 빈 답이 유리합니다. Required claim recall을 함께 봅니다.

required recall
  = # supported required claims present
    / # required claims

필요하면 harmonic mean을 쓸 수 있습니다.

F1 = 2 · precision · recall / (precision + recall)

그러나 critical claim은 평균에 섞지 않습니다.

hard gate:
  unsupported critical claim = 0

soft metrics:
  claim precision · required recall · citation coverage

Unsupported와 Incorrect를 구분한다

  • Unsupported: 현재 evidence로 확인 불가
  • Incorrect: Authoritative evidence와 모순

둘 다 strict grounded answer에서는 제거 대상일 수 있지만, root cause와 repair가 다릅니다.

unsupported → retrieve / ask / qualify
incorrect   → correct / block / investigate source

FActScore·SAFE·ALCE가 주는 설계 관점

FActScore

Long-form generation을 atomic fact로 나누고 knowledge source에서 각 fact의 support를 확인하는 방향을 제시합니다. Biography처럼 많은 사실을 포함한 답을 claim 단위로 평가하는 데 유용한 관점을 줍니다.

SAFE

Search-Augmented Factuality Evaluator는 long-form answer를 fact로 분해하고 search와 LLM을 사용해 각 fact를 검사합니다. 자동화 규모의 장점이 있지만 search result와 evaluator model의 오류, source authority, 비용을 함께 봐야 합니다.

ALCE

Citation이 포함된 long-form generation에서 citation correctness·completeness·quality를 분리하는 관점을 제공합니다. Citation 생성 자체와 답의 품질을 함께 평가해야 합니다.

SelfCheckGPT

외부 database 없이 여러 sample 사이의 일관성을 이용해 hallucination risk를 추정합니다. High agreement가 truth를 보장하지 않는다는 54편의 경계를 그대로 적용합니다.

FACTS Grounding

긴 input document에 대한 long-form response가 user request를 충족하면서 context에 fully grounded되는지를 평가합니다. Judge ensemble과 held-out validation을 쓰더라도 자동 judge가 ground truth가 되는 것은 아닙니다.

SimpleQA

단일하고 명확한 short factual question에 correct, incorrect, not attempted를 구분합니다. Long-form claim coverage나 RAG citation을 대신하는 benchmark가 아니라 “아는 것과 모르는 것”의 짧은 사실 평가입니다.

Benchmark의 score를 product quality로 바로 대체하지 않고 task 구조를 가져옵니다.


Retrieval과 Generation 오류를 분리한다

RAG pipeline에는 적어도 네 실패가 있습니다.

corpus failure:
  authoritative fact is absent or stale

retrieval failure:
  fact exists but required evidence was not retrieved

context selection failure:
  retrieved but truncated / filtered / misplaced

generation failure:
  sufficient evidence was supplied but answer misused it

Oracle Evidence 실험

각 질문에 gold evidence를 직접 제공합니다.

live retrieval answer wrong
gold evidence answer correct
  → retrieval/context bottleneck

gold evidence answer wrong
  → generation/reasoning/prompt bottleneck

Oracle Generation 실험

Retrieved evidence로 사람이 만든 grounded answer가 가능한지 확인합니다. 가능하지 않다면 corpus나 retrieval 문제입니다.

Stage Trace

{
  "query_id": "q-104",
  "corpus_snapshot": "policy-2026-07-01",
  "retrieved_ids": ["d7#3.1", "d7#3.4"],
  "selected_spans": ["..."],
  "claims": [
    {"id": "c1", "relation": "supported", "evidence": ["d7#3.1"]},
    {"id": "c2", "relation": "insufficient", "evidence": []}
  ],
  "decision": "repair_and_abstain_on_c2"
}

이 trace로 “model hallucination”이라는 넓은 label을 실제 owner에게 연결합니다.

RAG Factuality Gate

Production pipeline 예시입니다.

draft answer
  → extract atomic claims
  → bind cited evidence spans
  → deterministic checks for numbers/dates/entities
  → entailment/contradiction classifier
  → required-claim coverage check
  → source quality and ACL check
  → accept / repair / retrieve / abstain

Claim-level Repair

전체 답을 다시 생성하면 이미 맞는 claim이 바뀔 수 있습니다. 실패 claim만 수정합니다.

repair:
  keep: [c1, c4]
  remove: [c3]
  retrieve_more_for: [c2]
  must_not_add_new_claims: true

수정 후 claim extraction과 verification을 다시 실행합니다. Infinite repair loop를 막는 상한이 필요합니다.

Unsupported Critical Claim은 차단한다

의료·법률·재무·안전·권한처럼 오류 비용이 큰 claim은 평균 score로 통과시키지 않습니다.

if critical_claim relation != supported:
  do not assert
  ask / cite uncertainty / escalate

Current Fact는 Tool을 사용한다

가격, 재고, 주문 상태, 최신 규정, 오늘 날짜처럼 변하는 값은 training memory보다 authoritative API와 current document를 사용합니다.


Evaluator도 평가한다

Claim pipeline은 여러 model 오류가 합성됩니다.

response
  → claim extraction error
  → evidence retrieval error
  → entailment error
  → aggregation error

End-to-end score만 보면 어느 evaluator stage가 문제인지 모릅니다.

Claim Extraction Eval

  • Atomicity
  • Coverage of factual claims
  • No invented claims
  • Condition·negation preservation
  • Duplicate rate

Entailment Eval

  • Supported precision·recall
  • Contradiction recall
  • Insufficient-evidence false positive
  • Critical false support
  • Language·domain slice

Citation Eval

  • Correctness
  • Coverage
  • Required-claim completeness
  • Source quality
  • Placement accuracy

Human Adjudication

Judge disagreement과 high-risk case를 domain expert가 판정합니다. Automated evaluator가 자신이 생성한 search query와 같은 model family에 의존하면 shared bias가 생길 수 있습니다.

Threshold Calibration

Entailment probability를 그대로 truth로 쓰지 않습니다. Human-labeled set에서 threshold별 false support와 coverage를 측정합니다.

high-risk gate:
  optimize for very low false support

low-risk draft review:
  tolerate more false negatives to preserve coverage

Use case별 threshold가 다릅니다.

최신 2026 Preprint를 읽는 법

2026년 5월 공개된 Teaching Language Models to Check Grounded Claim Factuality with Human Test-Taking Strategies는 grounded claim checking을 true/false reading comprehension으로 구성하고 더 작은 model로 비용을 줄이는 방향을 제안합니다. 아직 preprint이며 “acceptance 전 code와 dataset 공개 예정”이라고 명시돼 있으므로 production 표준이나 확립된 결과로 취급하지 않습니다. 재현 artifact가 공개되면 기존 entailment baseline과 같은 locked set에서 검증합니다.


흔한 실패와 처방

1. Answer 전체를 하나의 Hallucination Label로 평가한다

일부 맞고 일부 틀린 장문을 진단할 수 없습니다.

처방: Atomic claim과 required claim 단위로 평가합니다.

2. Citation이 있으면 Grounded라고 본다

Source가 claim을 지지하지 않을 수 있습니다.

처방: Claim–span entailment와 citation placement를 검사합니다.

3. 세상에서 사실이면 Strict RAG에도 허용한다

Context-only contract를 위반하고 provenance가 사라집니다.

처방: Open-world truth와 source-groundedness label을 분리합니다.

4. Unsupported를 False로 강제한다

근거 부족과 반증을 혼동합니다.

처방: Supported·contradicted·insufficient 세 관계를 유지합니다.

5. Precision만 높인다

한 문장짜리 빈 답이 유리해집니다.

처방: Required-claim recall과 task completion을 함께 봅니다.

6. 긴 문서 전체를 Evidence로 연결한다

Evaluator와 사용자가 실제 근거를 찾기 어렵습니다.

처방: 조건을 포함한 최소 충분 span과 stable location을 저장합니다.

7. 모든 실패를 Generator 탓으로 돌린다

Gold evidence에서는 맞을 수 있습니다.

처방: Corpus·retrieval·selection·generation oracle 실험을 합니다.

8. LLM Judge를 Ground Truth로 쓴다

Claim extraction과 entailment도 hallucinate할 수 있습니다.

처방: Human-labeled calibration, disagreement audit, critical hard set을 둡니다.

Production 체크리스트

  • Truth source와 open/closed/source-grounded contract를 정의했다.
  • Hallucination을 supported·contradicted·insufficient로 기록한다.
  • Factuality·groundedness·faithfulness·completeness를 구분한다.
  • Answer를 조건·부정·단위를 보존한 atomic claim으로 분해한다.
  • Claim extractor의 atomicity와 coverage를 human set에서 평가했다.
  • 질문별 required claim rubric이 있다.
  • Generated claim precision과 required claim recall을 함께 본다.
  • Critical unsupported claim은 weighted average가 아니라 hard gate다.
  • Citation correctness·coverage·quality·placement를 분리한다.
  • Evidence에 document id·version·section·offset·hash가 있다.
  • Table header·footnote·exception이 span에서 보존된다.
  • Authoritative current fact는 API나 최신 source로 확인한다.
  • Gold evidence 실험으로 retrieval과 generation 오류를 분리한다.
  • Corpus·retrieval·context selection·generation stage trace가 있다.
  • Claim-level repair 뒤 verifier를 다시 실행한다.
  • Repair·retrieve loop의 횟수와 deadline이 제한돼 있다.
  • Automated claim·entailment·citation evaluator를 각각 평가했다.
  • Judge threshold를 language·domain·risk slice별로 calibration했다.
  • Evaluator disagreement와 critical case를 human이 adjudicate한다.
  • Prompt injection text가 source authority나 control instruction이 되지 않는다.
  • Corpus와 policy version 변경이 evaluation을 trigger한다.
  • 최신 preprint는 공개 artifact와 재현 전까지 잠정 evidence로 표시한다.

스스로 확인하기

  1. Open-world factuality와 source-grounded factuality가 다른 예시는 무엇인가?
  2. Supported, contradicted, insufficient evidence를 왜 세 label로 유지해야 하는가?
  3. 한 문장에 세 사실이 있을 때 answer-level label이 어떤 정보를 잃는가?
  4. Atomic claim 분해에서 조건과 negation을 보존해야 하는 이유는 무엇인가?
  5. Citation correctness와 coverage는 어떻게 다른가?
  6. Claim precision만 최적화하면 왜 짧고 불완전한 답이 유리한가?
  7. Required claim set은 누가 어떤 기준으로 만들어야 하는가?
  8. Gold evidence에서 정답이 되는 사례는 어느 stage의 실패를 가리키는가?
  9. Evidence span에 content hash가 필요한 이유는 무엇인가?
  10. Unsupported critical claim을 평균 점수로 통과시키면 안 되는 이유는 무엇인가?
  11. Search-augmented factuality evaluator도 왜 human calibration이 필요한가?
  12. 2026 preprint의 결과를 production default로 바로 쓰면 안 되는 이유는 무엇인가?

작은 실습

장문 RAG 답변 50개와 각 질문의 gold evidence를 준비합니다.

  1. 답을 atomic claim으로 분해하고 사람이 수정합니다.
  2. 각 claim에 supported·contradicted·insufficient를 label합니다.
  3. Citation correctness·coverage와 required-claim recall을 계산합니다.
  4. Live retrieval와 gold evidence 두 조건에서 동일 generator를 실행합니다.
  5. Corpus·retrieval·selection·generation 실패 비율을 분해합니다.
  6. Automated entailment judge의 critical false support를 측정합니다.
  7. Unsupported claim만 제거·재검색하는 repair loop를 구현합니다.
  8. Repair 전후 task success, claim precision, latency, cost를 비교합니다.

목표는 hallucination score 하나를 낮추는 것이 아닙니다. 어느 claim이 어떤 evidence로 확인됐고, 확인되지 않은 claim을 시스템이 어떻게 처리했는지 재현 가능하게 만드는 것입니다.

다음 글은 Structured Generation: JSON Schema·FSM·CFG로 출력 강제하기입니다. 사실성 검사 결과와 tool call을 parser가 확실히 읽도록 syntax를 decoding 단계에서 보장하는 법을 다룹니다.

참고자료