LLM 환각을 줄이는 그라운딩과 인용 설계

.cg-article{–accent:#4f46e5;–accent-soft:#eef2ff;–accent-line:#c7d2fe;–navy:#312e81;–warn:#d97706;–warn-soft:#fffbeb;line-height:1.75;color:#1f2937;font-size:17px;word-break:keep-all}
.cg-article h2{margin:2.2em 0 .7em;padding-left:.55em;border-left:5px solid var(–accent);font-size:1.42em;line-height:1.4;color:var(–navy)}
.cg-article h3{margin:1.6em 0 .5em;font-size:1.13em;color:var(–accent)}
.cg-article p{margin:.7em 0}
.cg-lead{background:var(–accent-soft);border:1px solid var(–accent-line);border-radius:12px;padding:18px 20px;margin:1.2em 0;font-size:1.02em}
.cg-lead strong{color:var(–accent)}
.cg-table{width:100%;border-collapse:collapse;margin:1.1em 0;font-size:.97em}
.cg-table th,.cg-table td{border:1px solid #e5e7eb;padding:11px 13px;text-align:left;vertical-align:top}
.cg-table th{background:var(–accent);color:#fff;font-weight:600}
.cg-table tr:nth-child(even) td{background:#f9fafb}
.cg-check{list-style:none;padding:0;margin:1.1em 0}
.cg-check li{position:relative;padding:9px 9px 9px 34px;margin:6px 0;background:var(–accent-soft);border-radius:8px}
.cg-check li::before{content:”✓”;position:absolute;left:12px;top:9px;color:var(–accent);font-weight:700}
.cg-warn{background:var(–warn-soft);border-left:5px solid var(–warn);border-radius:8px;padding:16px 18px;margin:1.3em 0}
.cg-warn strong{color:var(–warn)}
.cg-faq{margin:1.5em 0}
.cg-faq dt{font-weight:600;margin:1.1em 0 .3em;color:var(–accent)}
.cg-faq dd{margin:0 0 .6em}
.cg-article pre{background:#1e1b2e;color:#e9e7ff;border-radius:10px;padding:14px 16px;overflow-x:auto;font-size:.86em;line-height:1.55;margin:1.1em 0}
.cg-article pre code{background:none;color:inherit;padding:0}
.cg-article code{background:var(–accent-soft);color:var(–navy);padding:.1em .4em;border-radius:5px;font-size:.9em}
.cg-note{font-size:.9em;color:#6b7280;border-top:1px dashed #d1d5db;margin-top:2.4em;padding-top:1em}

LLM의 환각(hallucination)은 모델이 사실이 아니거나 근거 없는 내용을 그럴듯하게 생성하는 현상입니다. 모델이 거짓말을 하려는 의도가 있어서가 아니라, 다음 토큰을 확률적으로 예측하는 구조상 “그럴듯함”과 “사실임”이 분리돼 있기 때문에 발생합니다. 따라서 환각은 프롬프트 한 줄로 없앨 수 있는 버그가 아니라, 설계로 확률을 낮추고 검증으로 걸러야 하는 대상입니다. 핵심 전략은 세 가지입니다. 모델이 답할 근거를 컨텍스트로 직접 제공하는 그라운딩, 그 근거를 가리키도록 강제하는 인용 설계, 그리고 근거가 없을 때는 모른다고 답하게 유도하는 거부 설계입니다. 여기에 답변 후 검증 단계를 더해 신뢰도를 끌어올립니다.

환각은 왜 생기는가

LLM은 학습 데이터의 통계적 패턴을 압축해 다음에 올 토큰을 예측합니다. 이 과정에서 모델은 “참인 문장”과 “자연스러운 문장”을 따로 구분하지 않습니다. 그래서 학습에 없던 사실, 모호하게만 기억된 사실, 또는 존재하지 않는 항목(가짜 논문, 없는 API, 틀린 날짜)을 매끄러운 문장으로 만들어 냅니다.

환각이 잘 나오는 조건은 비교적 분명합니다. 모델이 충분히 학습하지 못한 희귀하거나 최신인 정보를 물을 때, 질문이 모호해 모델이 빈틈을 추론으로 메울 때, 컨텍스트에 답이 없는데도 답을 요구할 때, 그리고 매우 구체적인 수치·고유명사·인용을 요구할 때 빈도가 높아집니다. 반대로 답에 필요한 근거가 컨텍스트 안에 명확히 들어 있으면 환각은 크게 줄어듭니다. 이 지점이 모든 대책의 출발점입니다.

그라운딩 — 답할 근거를 직접 준다

그라운딩은 모델이 “기억”에 의존하지 않고, 요청과 함께 제공된 외부 근거 안에서만 답하도록 만드는 설계입니다. 검색 증강 생성(RAG)이 대표적인 형태로, 질문과 관련된 문서를 먼저 검색해 컨텍스트에 넣고 “이 자료만 근거로 답하라”고 지시합니다. 모델이 답을 지어내는 대신, 주어진 자료를 읽고 요약·발췌하는 작업으로 문제의 성격을 바꾸는 것이 핵심입니다.

방식근거 출처환각 경향
모델 내부 지식에만 의존학습된 파라미터높음(특히 최신·희귀 정보)
그라운딩(RAG·문서 첨부)제공된 외부 컨텍스트낮아짐(근거 범위 내)
그라운딩 + 인용 강제외부 컨텍스트 + 출처 표기더 낮아지고 검증 가능

그라운딩이 효과를 내려면 검색 품질이 받쳐 줘야 합니다. 질문과 무관하거나 잘못된 문서가 컨텍스트에 들어가면, 모델은 그 틀린 자료를 충실히 따라 틀린 답을 내놓습니다. 즉 그라운딩은 “검색이 옳다”는 전제 위에서 동작합니다. 그래서 RAG에서는 검색 정확도(retrieval) 자체가 환각률을 좌우하는 1차 변수입니다.

그라운딩 프롬프트의 골격

지시: 아래 [자료]에 있는 내용만 근거로 답하라.
자료에 없는 내용은 추측하지 말고 "자료에서 확인할 수 없음"이라고 답하라.
각 문장 끝에 근거가 된 자료 번호를 [1]처럼 표기하라.

[자료]
[1] ...(검색된 문서 조각)...
[2] ...(검색된 문서 조각)...

질문: {사용자 질문}

인용을 강제한다

인용 강제는 모델이 각 주장에 대해 어느 근거에서 나왔는지 출처를 명시하게 만드는 설계입니다. 효과는 두 가지입니다. 첫째, 모델이 출처를 댈 수 없는 주장을 하기 어려워져 환각 자체가 줄어듭니다. 둘째, 사람이나 후속 코드가 답을 검증할 수 있게 됩니다. 출처가 붙어 있으면 “이 문장이 정말 그 출처에 있는가”를 기계적으로 대조할 수 있기 때문입니다.

다만 인용 표기가 있다고 곧바로 신뢰할 수는 없습니다. 모델은 그럴듯한 출처 번호나 URL을 함께 지어낼 수도 있습니다. 그래서 인용은 “강제”에서 끝내지 말고, 인용된 근거가 실제로 그 주장을 뒷받침하는지 검증하는 단계와 짝을 이뤄야 합니다.

근거 없는 답변을 거부하게 한다

많은 환각은 “모른다고 말하지 못해서” 발생합니다. 모델은 기본적으로 도움이 되려 하기 때문에, 답을 모를 때도 빈칸을 추론으로 채웁니다. 이를 막으려면 “근거가 없으면 모른다고 답하는 것이 정답”이라는 선택지를 명시적으로 열어 줘야 합니다. 이처럼 “모른다”를 허용하고 직접 인용으로 근거를 잡는 기법은 Anthropic 공식 문서(환각 줄이기)에서도 권장하는 방식입니다.

  • “자료에서 확인할 수 없으면 ‘확인 불가’라고 답하라”는 거부 경로를 프롬프트에 명시한다.
  • 불확실할 때 추측을 금지하고, 추측이 필요하면 “추정”임을 라벨링하도록 요구한다.
  • 구조화 출력에 answerable 같은 불리언 필드를 두어 답변 가능 여부를 모델이 먼저 판단하게 한다.
  • 근거 인용이 비어 있으면 그 답변을 채택하지 않도록 후처리에서 차단한다.

“모른다”를 허용하지 않으면 환각이 늘어납니다.

거부 경로 없이 “반드시 답하라”고만 지시하면, 모델은 근거가 없는 질문에도 그럴듯한 답을 만들어 냅니다. 정확성이 중요한 시스템일수록 “확인 불가”를 정상적인 정답으로 설계하는 편이 안전합니다.

답변 후 검증 단계

생성 단계의 대책만으로는 부족합니다. 출력한 답을 다시 검사하는 검증 계층을 두면 신뢰도가 한 단계 올라갑니다. 대표적인 두 가지 방법이 self-check와 인용 검증입니다.

self-check — 모델에게 다시 검토시키기

self-check는 생성된 답을 같은(또는 다른) 모델에게 “이 답이 제공된 자료로 뒷받침되는가”를 다시 판정하게 하는 방식입니다. 답을 만드는 작업과 답을 검증하는 작업을 분리하면, 한 번에 생성하며 놓친 비약을 잡아낼 수 있습니다. 다만 같은 모델이 같은 약점을 공유할 수 있어 self-check가 만능은 아니며, 검증용 프롬프트를 “관대하게 통과”시키지 않도록 엄격히 설계해야 합니다.

# 생성 → 인용 검증 → 미검증 문장 표시(개념 예시)
answer = generate_with_citations(question, docs)

for claim in split_claims(answer):
    src = claim.cited_source            # 예: [2]
    supported = verify(claim.text, docs[src])   # 근거 대조(모델 또는 규칙)
    if not supported:
        flag(claim, reason="근거 미일치")
# 미검증 주장이 있으면 사용자에게 답을 그대로 노출하지 않거나 경고 표기

인용 검증 — 출처와 주장을 대조

인용 검증은 모델이 단 출처가 실제로 그 주장을 담고 있는지 기계적으로 확인하는 단계입니다. 인용된 문서 조각을 가져와 주장 문장과 의미적으로 일치하는지 비교하고(임베딩 유사도나 별도 판정 모델 활용), 일치하지 않으면 그 문장을 신뢰하지 않습니다. 출처가 컨텍스트에 없는 번호를 가리키거나 URL이 존재하지 않으면 곧바로 탈락 처리합니다. 이 단계가 있으면 “출처를 지어내는” 환각을 효과적으로 걸러낼 수 있습니다.

얼마나 줄었는지 평가하기

대책을 넣었다면 효과를 측정해야 합니다. 환각 감소는 주관적 인상이 아니라 데이터로 확인할 일입니다. 실무에서 쓰는 평가 축은 대체로 다음과 같습니다.

평가 축측정 대상방법(개념)
충실성(faithfulness)답이 제공 근거에서 벗어나지 않는 정도주장별 근거 대조, 판정 모델
정답 정확도정답이 있는 질문에서의 정오정답셋(gold set) 비교
거부 적정성답할 수 없는 질문을 옳게 거부하는지무답 질문셋으로 측정
인용 정확도인용이 실제 근거를 가리키는 비율인용-근거 대조

평가를 자동화할 때는 “LLM이 LLM을 채점”하는 판정 모델 방식이 흔히 쓰이지만, 판정 모델 자체도 오류가 있으므로 정답이 분명한 핵심 케이스는 사람이 검수한 정답셋으로 고정해 두는 편이 좋습니다. 또한 평가셋에는 일부러 “자료에 답이 없는 질문”을 섞어, 모델이 그것을 옳게 거부하는지까지 측정해야 거부 설계의 효과를 볼 수 있습니다.

평가는 한 번 만들고 끝낼 일이 아니라 회귀 방지 장치로 운영해야 합니다. 프롬프트를 수정하거나 모델 버전을 올릴 때마다 같은 평가셋을 다시 돌려, 충실성이나 거부 적정성이 떨어지지 않았는지 확인하는 것입니다. 환각 대책은 한쪽을 조이면 다른 쪽이 풀리는 경향이 있어, 거부를 강화하면 답할 수 있는 질문까지 과도하게 거부하고(과소응답), 반대로 응답률을 높이면 환각이 늘어나는 식의 맞교환이 일어납니다. 그래서 단일 지표가 아니라 충실성·정답률·거부 적정성을 함께 추적해 균형점을 잡아야 합니다.

한계 — 환각은 0이 되지 않는다

그라운딩·인용·검증을 모두 적용해도 환각은 완전히 사라지지 않습니다. 검색이 틀리면 그라운딩도 틀리고, 검증 모델도 같은 오류를 공유할 수 있으며, 자료 자체가 부정확하면 모델은 부정확한 자료에 충실할 뿐입니다. 따라서 의료·법률·금융처럼 오답의 비용이 큰 영역에서는 자동 출력만으로 의사결정을 내리지 말고, 사람 검토 단계를 반드시 두는 것이 원칙입니다. 환각 대책의 목표는 “완전 제거”가 아니라 “허용 가능한 수준으로 낮추고, 남은 위험을 사람이 통제할 수 있게 가시화”하는 것입니다.

자주 묻는 질문

프롬프트에 “사실만 말해, 지어내지 마”라고 쓰면 환각이 없어지나요?
줄어들 수는 있어도 없어지지는 않습니다. 환각은 확률적 생성 구조에서 비롯되므로 지시만으로 0이 되지 않습니다. 근거를 컨텍스트로 제공하는 그라운딩과 사후 검증을 함께 써야 의미 있게 낮아집니다.
RAG를 쓰면 환각이 사라지나요?
아닙니다. RAG는 검색이 정확하다는 전제에서만 효과가 있습니다. 관련 없거나 틀린 문서가 검색되면 모델은 그 자료를 충실히 따라 틀린 답을 냅니다. 검색 정확도 자체가 환각률을 좌우하는 핵심 변수입니다.
인용을 붙이게 하면 신뢰해도 되나요?
인용 표기만으로는 부족합니다. 모델이 출처 번호나 URL까지 지어낼 수 있기 때문입니다. 인용된 근거가 실제로 주장을 뒷받침하는지 대조하는 검증 단계와 반드시 함께 써야 합니다.
self-check로 같은 모델에게 검증시키는 게 의미가 있나요?
생성과 검증을 분리하면 한 번에 놓친 비약을 잡는 효과가 있습니다. 다만 같은 모델은 같은 약점을 공유할 수 있어 만능은 아니며, 검증 프롬프트를 엄격히 설계하고 가능하면 정답셋 기반 평가와 병행하는 것이 좋습니다.
환각 감소 효과는 어떻게 측정하나요?
충실성, 정답 정확도, 거부 적정성, 인용 정확도 같은 축으로 평가합니다. 정답이 분명한 케이스는 사람이 검수한 정답셋으로 고정하고, “답이 없는 질문”을 섞어 모델이 옳게 거부하는지까지 측정해야 합니다.

이 글은 검색 증강 생성(RAG)과 그라운딩, 인용·검증에 관한 공개된 일반 원리를 정리한 것입니다. 모델·제공사별 기능 명칭과 동작 세부는 다를 수 있고, 환각은 어떤 기법으로도 완전히 제거되지 않습니다. 오답의 비용이 큰 분야에서는 자동 출력에 의존하지 말고 사람 검토 절차를 두시기 바랍니다.

위로 스크롤