11장. 환각을 없애려 하지 말고 발견한다
“절대 틀리지 마”라고 쓰면 환각이 사라지지 않는다. 생성형 모델의 답은 비결정적이고, 자료가 부족해도 자연스러운 문장을 만들 수 있다. 실무에서는 오류를 예상하고 검출 지점을 만든다.
주장을 네 종류로 라벨링한다.
FACT: 제공된 자료나 실행 결과가 직접 지지
INFERENCE: 여러 사실에서 도출한 해석
PROPOSAL: 미래 행동에 대한 제안
UNKNOWN: 필요한 근거가 없거나 충돌
DecisionDesk의 “인터뷰 12명 중 9명이 원했다”는 FACT다. “따라서 100명 베타가 적절하다”는 INFERENCE와 PROPOSAL이다. 사용자 수 100명은 자료에서 자동으로 나온 정답이 아니라 운영 위험을 제한하기 위한 선택이다.
핵심 주장마다 다음 질문을 한다.
- 어떤 원문 구간이 이 문장을 직접 지지하는가?
- 수치의 분모, 단위, 기간, 통화, 시간대는 무엇인가?
- 출처가 서로 충돌하면 어떤 범위를 우선했는가?
- 자료에 없는 연결고리를 사실처럼 썼는가?
- 이 결론을 뒤집는 반대 사실은 무엇인가?
모델에게 자기 답을 다시 보라고만 하지 않는다. 별도 검토 프롬프트나 규칙 기반 검사로 역할을 분리한다.
초안에서 사실 주장만 추출한다.
각 주장에 source_id와 직접 지지 문장을 연결한다.
직접 지지가 없으면 UNSUPPORTED로 표시한다.
결론을 수정하지 말고 검증 표만 반환한다.
검증이 실패하면 문장을 더 그럴듯하게 고치지 않는다. 근거를 추가하거나 주장 범위를 줄이거나 확인 필요로 남긴다.
주장 원장을 만든다
중요한 보고서는 초안과 별도로 주장 원장을 만든다.
| claim_id | 주장 | 종류 | source_id | 직접 지지 구간 | 상태 |
|---|---|---|---|---|---|
| C-01 | 9/12가 기능을 원함 | FACT | SRC-01 | 문장 1 | verified |
| C-02 | 100명 베타가 적절 | PROPOSAL | C-01~03 | 해당 없음 | review |
원장은 “인용이 있다”와 “인용이 맞다”를 구분한다. source_id가 존재하지만 원문이 다른 내용을 말하면 실패다. 수정할 때 claim ID를 유지하면 보고서 버전 사이에 어떤 주장이 추가·삭제·약화되었는지 알 수 있다.
모든 문장을 검증할 필요는 없다. 결정에 영향을 주는 핵심 주장, 수치, 안전·법·비용 문장을 우선한다. 위험 기반 표본 검토로 비용을 통제하되, 검토하지 않은 항목을 검토 완료처럼 표시하지 않는다.