콘텐츠로 이동

RAG 시스템의 환각 방지 (Preventing Hallucinations in RAG)

개요

RAG의 근본적인 목표는 환각(hallucination)을 줄이는 것입니다. 그러나 역설적이게도, RAG 시스템 자체도 환각 문제를 가질 수 있습니다. 검색된 정보가 있는데도 LLM이 거짓 정보를 생성하거나, 관련 없는 문서를 기반으로 답변하는 문제가 발생합니다. 이 페이지에서는 RAG 시스템의 환각을 예방하고 대응하는 전략을 다룹니다.

RAG 시스템에서 환각이 발생하는 이유

1. 검색 실패 (Retrieval Failure)

문제: 관련 문서를 찾지 못함

예시:
질문: "인공지능 윤리에서 공정성이란?"

검색 결과:
→ "AI의 성능 최적화 방법" (무관)
→ "머신러닝 알고리즘" (무관)
→ "컴퓨터 비전 기술" (무관)

결과:
LLM이 검색 결과를 바탕으로 할 수 없어
학습 데이터에서 임의로 생성 → 환각!

해결책: - 검색 품질 개선 (임베딩 모델, 벡터 DB) - 하이브리드 검색 (의미 + 키워드) - 다중 검색 전략 (다양한 쿼리로 재검색)

2. 컨텍스트 오염 (Context Confusion)

검색된 문서가 관련은 있지만 답변을 왜곡할 수 있습니다.

예시: 의료 정보 시스템

질문: "두통 증상의 원인은?"

검색 결과:
문서1: "스트레스로 인한 두통" (관련)
문서2: "뇌암 증상: 극심한 두통" (관련이지만 심각)
문서3: "감기 증상 중 두통" (관련)

문제:
LLM이 3개 문서를 혼합하여
"두통은 뇌암의 증상일 수 있습니다" ← 환각!
(드물지만 가능한 해석을 과장)

해결책: - 신뢰도 점수 기반 문서 선택 - 문서별 신뢰도 표시 (질병 가능성 등급) - 의료 RAG는 전문의 검증 추가

3. 컨텍스트 오버플로우 (Context Overflow)

문제: 너무 많은 문서로 혼동

시나리오:
- 검색된 문서: 20개
- 각 문서 길이: 500 단어
- 총 컨텍스트: 10,000 단어

결과:
LLM이 모든 문서를 처리하면서
정보 간의 모순 발생 → 환각!

해결책: - 상위 K개만 선택 (보통 3-5개) - 문서 요약 사용 - 단계별 검색 (멀티 홉)

4. 정보 충돌 (Information Conflict)

검색된 정보가 LLM의 학습 정보와 모순됩니다.

예시:
검색 문서: "2024년 최저임금 10,830원"
LLM 학습: "2023년 최저임금 9,620원"

모델의 불확실성:
→ 어느 것이 더 신뢰할 만한가?
→ 최신 정보를 우선할까?
→ 아니면 학습 데이터를 믿을까?

최악의 경우:
"최저임금은 약 10,000원 정도입니다" ← 환각!
(두 정보의 평균을 만들어냄)

한국 실무 예시: 의료 정보 시스템의 환각 방지

상황: 의료진을 위한 약물 상호작용 확인 시스템

1. 환각 위험 분석

높은 위험도 상황:

1. 드문 약물 조합
   - 일반적이지 않은 약물 → 학습 데이터 부족
   - 검색 결과 부족 → 환각 위험 높음

2. 새로운 약물
   - FDA 승인 직후 약물
   - 한국 시장 신규 진입 약물
   - 의료진이 모르는 약물

3. 약물 이름 혼동
   - 유사한 이름 약물 (한글명, 영문명, 성분명)
   - 여러 회사의 같은 성분 약물

2. 환각 방지 전략

A. 검색 품질 향상

청크 구성:
├─ 약물명 (한글, 영문, 성분명)
├─ 분류 (항생제, 진통제 등)
├─ 효능
├─ 금기 사항
├─ 상호작용 (A약물과의 조합)
└─ 메타데이터 (업데이트 날짜, 신뢰도)

B. 신뢰도 표시

# RAG 출력 형식

{
  "상호작용": "주의 필요",
  "심각도": "중간",
  "신뢰도": "높음 (공식 약물 정보)",
  "관련_문서": [
    {
      "제목": "약물 상호작용 데이터베이스",
      "출처": "FDA DrugInteractions",
      "신뢰도": "매우 높음",
      "업데이트": "2024년 2월"
    }
  ],
  "주의사항": "임상 사례 부족 시 주의",
  "확인_필요": false
}

C. 불확실성 표현

신뢰도 표시:

높음 (> 0.8): "확실하게 상호작용 있음"
중간 (0.5-0.8): "가능성 있음, 추가 확인 권장"
낮음 (< 0.5): "불확실, 전문가 상담 필수"

시스템 응답:
신뢰도 낮음 → "자세한 정보는 약사/의사와 상담하세요"
신뢰도 높음 → "확실히 상호작용 있습니다"

D. 검증 파이프라인

RAG 생성 답변
신뢰도 계산 (RAGAS)
신뢰도 < 0.6?
├─ YES → "정보 불충분, 전문가 상담" 표시
└─ NO → 계속
문서 출처 확인
├─ 공식 (FDA, 식약처) → 신뢰도 높음
├─ 학술지 → 신뢰도 중간
└─ 기타 → 신뢰도 낮음
최종 출력

3. 프롬프트 설계

!!! 💡 실전 팁 의료 시스템은 절대 환각을 허용할 수 없습니다!

medical_rag_prompt = """
당신은 의료용 약물 상호작용 조회 AI입니다.

절대 금지 사항:
1. 확실하지 않은 정보 생성 금지
2. 확률이나 추측 제시 금지
3. 임상 경험담 기반 답변 금지
4. 의료 조언 제시 금지

필수 규칙:
1. 공식 약물 정보만 인용
2. 신뢰도 명시
3. 출처 명확히 표시
4. 정보 없으면 "정보 없음" 표시
5. 의료진 상담 권장

검색 문서:
{context}

의료진 질문:
{question}

응답 형식:
{
  "상호작용_여부": "있음/없음/불확실",
  "심각도": "높음/중간/낮음/알 수 없음",
  "근거": "출처와 함께 구체적으로",
  "신뢰도": "높음/중간/낮음",
  "권고사항": "의료진이 취할 조치",
  "추가_확인": "필요한 경우만 언급"
}

응답:
"""

환각 방지 기술

1. 제약된 생성 (Constrained Generation)

LLM이 검색 문서의 정보만 사용하도록 강제합니다.

기본 방법:
"다음 문서에만 기반하여 답변하세요.
문서에 없는 정보는 '정보 없음'이라고 해야 합니다."

고급 방법:
- Token masking: 검색 문서의 단어들만 생성 허용
- Guided decoding: 구조화된 형식으로만 생성
- Beam search: 여러 경로 탐색 후 최상 선택

2. 근거 기반 생성 (Grounded Generation)

각 문장에 근거를 표시합니다.

일반 생성:
"한국의 GDP는 2023년 약 2조 달러입니다."

근거 기반:
"한국의 GDP는 2023년 약 2조 달러입니다.
[출처: 한국은행 경제통계, 2024년 1월 공시]"

더 나은 버전:
"한국의 GDP는 2023년 약 2조 달러입니다.
[출처: 한국은행 보도자료 2024-01-15]
[신뢰도: 높음 - 공식 통계]
[업데이트: 2024년 1월]"

3. 자체 확인 (Self-Verification)

LLM이 생성 직후 자신의 답변을 검증합니다.

Step 1: 생성
"최저임금은 12,000원입니다."

Step 2: 자체 확인
검색 문서에서 "12,000원"이 있나?
→ 없음 (실제는 10,830원)

Step 3: 수정
"최저임금은 10,830원입니다.
[확인됨: 2024년 공시]"

!!! === 구현 예제 (OpenAI API 사용)

```python
def verify_rag_output(answer, search_docs):
    """
    RAG 답변 검증
    """
    verification_prompt = f"""
    다음 답변이 검색된 문서에 기반하는지 확인하세요.

    답변: {answer}

    검색 문서:
    {search_docs}

    각 주장이:
    1. 문서에 명시되어 있는가?
    2. 정확한가?
    3. 완전한가?

    응답 형식:
    {{"신뢰도": 0.0-1.0, "오류": ["..."]}}
    """

    # Claude 4.6으로 검증
    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=500,
        messages=[
            {"role": "user", "content": verification_prompt}
        ]
    )

    return response.content[0].text
```

4. 다중 모델 앙상블 (Multi-Model Ensemble)

여러 모델의 답변을 결합합니다.

GPT-5.4 답변: "A인 가능성 70%"
Claude 4.6: "A인 가능성 75%"
Gemini 2.5: "A인 가능성 65%"

투표 결과:
→ 모두 A 동의: 신뢰도 높음
→ 의견 갈림: 신뢰도 낮음 (불확실성 표시)

환각 감지 및 완화

1. 환각 감지 기준

잠재적 환각 신호:

1. 과도한 구체성
   "3.14159..." ← 과도히 정확
   "약 3.14" ← 적절한 수준

2. 확률의 오류
   "99.9%의 확률로..." ← 추측?
   "가능성이 있습니다" ← 적절

3. 미래 예측
   "2025년 GDP는 3조 달러일 것입니다" ← 추측!
   "2024년 GDP는 2조 달러입니다" ← 기록

4. 출처 부재
   "많은 연구에 따르면..." ← 구체적 출처 없음
   "Nature 2024에 따르면..." ← 구체적

2. 환각 점수 (Hallucination Score)

hallucination_score = (
    0.2 * specificity_penalty +
    0.2 * temporal_consistency +
    0.3 * source_coverage +
    0.2 * contradiction_check +
    0.1 * uncertainty_awareness
)

점수 해석:
0.0 - 0.3: 환각 위험 매우 높음
0.3 - 0.6: 환각 위험 중간
0.6 - 0.8: 상대적으로 안전
0.8 - 1.0: 환각 위험 낮음

📝 핵심 정리

RAG 환각의 주요 원인

  1. 검색 실패: 관련 문서를 찾지 못함
  2. 컨텍스트 오염: 관련은 있지만 잘못된 정보
  3. 컨텍스트 오버플로우: 너무 많은 문서
  4. 정보 충돌: 모순된 정보 처리 실패

환각 방지 전략

  1. 검색 개선: 하이브리드 검색, 다중 전략
  2. 신뢰도 표시: 각 답변의 신뢰도 명확히
  3. 근거 제시: 모든 주장의 출처 명시
  4. 불확실성 표현: 정보 부족 시 명시
  5. 검증 파이프라인: 자동 검증 메커니즘

도메인별 주의사항

의료 시스템: - 환각 용인 불가 - 모든 답변 검증 필수 - 의료진 상담 명시

법률 시스템: - 정확한 법조문 인용 필수 - 판례와 규정 명확히 구분 - 개인 해석 금지

교육 시스템: - 팩트 체크 자동화 - 학생 오도 방지 - 출처 제시로 학습 강화

검사 체크리스트

  • 검색 품질 벤치마크 설정 (정확도 > 80%)
  • RAGAS 점수 기준 설정 (신뢰도 > 0.7)
  • 환각 감지 규칙 구현
  • 불확실 정보 처리 방안 수립
  • 정기적 환각 감시 (주 1회)
  • 사용자 피드백 수집 및 개선

최종 당부

RAG가 환각을 완전히 없앨 수는 없습니다. 하지만 위의 전략들을 체계적으로 적용하면 환각 위험을 크게 줄일 수 있습니다. 특히 의료, 법률, 금융처럼 정확성이 중요한 분야에서는 이러한 방지 기법이 필수입니다.