환각(hallucination) — 원인·유형·완화·시스템 설계
모델이 그럴듯하지만 틀린 말을 내놓을 때 왜 그런지, 무엇을 하면 실제로 줄고 무엇은 헛수고인지 찾아볼 때.
전제부터 못박는다. 환각은 완전히 없앨 수 없다. next-token 디코딩은 진실이 아니라 그럴듯함(plausibility)을 최적화하기 때문에, "0% 환각"을 목표로 삼는 설계는 잘못된 목표다. 목표는 제거가 아니라 완화 + 사람 검토 지점 배치 + 교정된 불확실성(calibrated uncertainty) 이다.
왜 생기나 (근본 원인)
- 디코딩 목표 자체. next-token 학습은 "정확히 불확실성을 전달하는 출력"이 아니라 "그럴듯한 사람 글처럼 보이는 출력"을 보상한다. 이게 1차 원인이다.
- 구조적 인센티브. 학습·벤치마크가 abstention("모른다")에 페널티를 주고, 불확실성 표현보다 자신 있는 추측을 보상한다. 그래서 모델은 모를 때도 확신 있게 지어낸다.
- 학습 데이터. 웹스케일 코퍼스의 노이즈·모순·오류를 그대로 흡수한다.
- 디코딩 랜덤성. temperature·sampling 이 매번 다른 토큰을 뽑는다 — 단, 이건 조연이지 주연이 아니다(아래 "헛수고" 참고).
- 롱컨텍스트 실패. 컨텍스트가 길수록 needle-in-haystack 실패로 관련 근거를 놓친다. → tokens-and-context-windows
- RAG 가 새 실패면을 추가. 검색 청크 무시·오독·근거 초과 추론. RAG 는 환각을 줄이지만 공짜가 아니다. → build-a-rag-pipeline
유형 분류
| 축 | 유형 | 정의 | 예 |
|---|---|---|---|
| 무엇에 어긋나나 | factuality(사실성) | 세상 사실에 어긋남 | 튜링 출생 1925 라고 함(실제 1912) |
| faithfulness(충실성) | 주어진 컨텍스트·프롬프트를 왜곡 | 문서에 없는 결론을 문서 근거라 우김 | |
| 입력과의 관계 | intrinsic | 입력과 직접 모순 | 제공된 표와 반대되는 수치 |
| extrinsic | 입력으로 검증 불가한 내용 생성 | 출처 없는 통계 창작 |
RAG·요약·문서 QA 같은 grounding 태스크에서 실무상 더 위험한 건 faithfulness 오류다. 근거를 붙여줘도 왜곡하기 때문에, 답이 그럴듯할수록 잡기 어렵다.
완화 기법 — 효과 순
위로 갈수록 효과가 크다. 오류 클래스가 서로 달라서 조합이 단일 기법보다 훨씬 낫다.
| 순위 | 기법 | 무엇을 자르나 | 비용/함정 |
|---|---|---|---|
| 1 | Grounding (RAG + 근거 제시) | extrinsic·factuality. 답을 검색된 정형 지식에 묶는다 | 검색 품질이 상한을 정함. 나쁜 검색 = 나쁜 근거 |
| 2 | 인용 강제 (span-level verification) | faithfulness. 각 주장을 검색 근거와 매칭, 미지원이면 flag | 인용을 붙이되 실제 지지 여부는 별도 검증해야 함 |
| 3 | 구조화 출력 (constrained output) | 형식 이탈·자유서술 창작. 스키마로 필드 강제 | 형식만 맞고 값은 여전히 틀릴 수 있음 → structured-output |
| 4 | 자기검증 (self-verification) | reasoning 단계 오류. Chain-of-Verification(CoVe): 검증 질문 생성→자답→최종 확정. self-consistency | 지연·비용 증가. 모델이 자기 오류를 못 볼 때도 있음 |
1순위 grounding 은 "답의 재료를 통제"하고, 나머지는 "재료를 어떻게 쓰는지 통제"한다. 재료가 틀리면 아래 셋이 다 무의미하므로 검색·임베딩 품질에 먼저 투자하라. → embeddings-and-vector-search
targeted finetuning 은 특정 도메인에서 환각률을 크게 낮춘 연구 결과가 있으나(NAACL 2025, 환각률 약 90~96% 감소·품질 유지 [MED], 재확인 필요), 대부분의 애플리케이션 개발자에겐 grounding·검증 조합이 먼저다.
효과 없거나 착각인 완화책
- temperature 낮추기. 디코딩 랜덤성만 줄일 뿐, factuality 오류를 못 잡는다. temperature 0 이어도 그럴듯한 거짓을 결정론적으로 반복한다. 게다가 Claude Opus 4.7/4.8/5·Fable 5 는
temperature자체가 400 에러다(verified 2026-07) — 애초에 못 돌린다. → anti-patterns - "환각하지 마 / 사실만 말해" 지시. 모델은 자기가 언제 환각하는지 모른다. 이 지시는 톤만 자신감 있게 만들 뿐 실제 사실성을 올리지 않는다. 오히려 hedging 을 줄여 더 위험할 수 있다.
- 더 큰 모델로 바꾸기. 빈도는 줄지만 구조적 원인이 그대로라 남는다. grounding 없는 "큰 모델"은 여전히 확신 있게 틀린다.
측정 / 모니터링
| 방법 | 외부자원 | 쓰는 곳 |
|---|---|---|
| SelfCheckGPT | 불필요(zero-resource, black-box) | 같은 프롬프트 여러 번 샘플링 → 응답 간 불일치로 환각 의심. 아는 주제면 일관된 사실을 냄 |
| span verification | 검색 근거 | 주장별로 근거 매칭, 미지원 span 카운트 |
| 후보 리랭킹 | 경량 factuality 지표 | 여러 후보 중 사실성 높은 것 선택 |
| 내부 프로브 | 모델 활성값 접근 | CLAP(활성값 분류기), MetaQA(프롬프트 변형). self-host 모델에서만 [MED] |
핵심 태도 전환: "환각 제로" 추구를 버리고 calibrated uncertainty + 투명한 신뢰도 신호로 간다. 모델이 "확실치 않음"을 표시하게 만들고, 그 신호로 사람 검토를 라우팅하는 편이 현실적이다.
"없앨 수 없다" 전제의 시스템 설계
완화로 빈도를 낮춘 뒤, 남는 환각을 사람 검토 지점으로 받아낸다. 되돌릴 수 없거나 비용 큰 출력일수록 검토를 앞에 둔다.
| 출력의 성격 | 검토 지점 |
|---|---|
| 되돌릴 수 없음 (자금 이체, 계약 문구, DB 삭제) | 실행 전 사람 승인 게이트 필수 |
| 사실 주장 (수치·인용·법령) | 인용 강제 + span 미지원이면 자동 flag → 사람 확인 |
| 탐색·초안 (브레인스토밍, 코드 초안) | 사후 검토로 충분, 게이트 불필요 |
| 저위험 대량 (분류·태깅) | 샘플링 모니터링 + 드리프트 알림 |
에이전트 루프에선 되돌릴 수 없는 툴(결제·삭제·전송) 앞에 확인 지점을 강제로 끼운다. → agent-design-patterns
언제 무엇을 쓰나
| 상황 | 우선 수단 |
|---|---|
| 회사 문서·KB 기반 답변 | grounding(RAG) + 인용 강제 |
| 출력이 다운스트림 시스템에 그대로 들어감 | 구조화 출력 + 스키마 검증 |
| 수치·사실 정확도가 핵심 | span verification + 사람 검토 게이트 |
| 되돌릴 수 없는 액션 | 사람 승인 게이트(완화 기법과 무관하게 항상) |
| temperature 로 "안정화"하고 싶음 | 하지 마라 — 근본 원인이 아니고 Claude 는 400 |
함정 (gotcha)
- 인용이 있다고 사실인 게 아니다. 모델은 그럴듯한 인용을 지어내거나, 진짜 근거에 없는 주장을 그 근거에 매달 수 있다. 인용은 검증의 시작이지 끝이 아니다.
- 자기검증의 순환. 환각한 모델에게 "맞는지 검토해줘" 하면 자기 답을 옹호할 수 있다. 검증은 다른 근거(검색)나 다른 관점(변형 프롬프트)으로 해야 한다.
- 구조화 출력의 착시. 스키마를 통과했다고 값이 맞는 건 아니다. 형식 강제와 사실성은 별개다.
- RAG 도입이 환각을 늘릴 수 있다. 검색이 무관한 청크를 물어오면 모델이 그걸 근거로 새 거짓을 만든다. 검색 품질 먼저.
- "큰 모델이니 괜찮겠지" 로 검토 게이트를 빼는 것. 빈도만 줄었지 0 이 아니다.
참고
- build-a-rag-pipeline — grounding 을 실제 파이프라인으로. 1순위 완화책의 구현
- embeddings-and-vector-search — grounding 의 상한을 정하는 검색 품질
- structured-output — 구조화 출력(3순위 완화)의 Claude 구현
- anti-patterns — temperature 조절·prefill 등 Claude 에서 400 나는 것들
- agent-design-patterns — 되돌릴 수 없는 액션 앞 사람 승인 게이트
- tokens-and-context-windows — 롱컨텍스트 needle 실패와 환각의 관계
출처: 원인·유형·완화·측정은 리서치 요약 기반 [MED], span·프로브·finetuning 수치는 재확인 필요. Claude temperature 400 은 first-party [HIGH]. 원본 → 2026-07-25-concepts-retrieval-quality