RAG에서 발생하는 Knowledge Conflict를 Preference Learning으로 해결하는 연구
2026 이화여자대학교 캡스톤디자인 · 03팀 Alltology · 연구 트랙 · 지도교수: 황의원 교수님
AI가 검색한 문서와 자신이 학습한 지식이 다른 말을 할 때, 어느 쪽을 믿어야 할까?
기업 내부 문서 검색 시스템, 법률 정보 RAG, 의료 가이드라인 챗봇 — 이런 시스템에서 AI가 오래된 내부 지식을 고집하거나, 반대로 신뢰할 수 없는 검색 결과를 맹신하면 치명적인 오답이 나온다.
이 문제는 단순히 "더 좋은 모델"로 해결되지 않는다. 충돌 상황에서 어떤 근거를 우선할지 모델이 학습으로 내재화해야 한다.
RAG(Retrieval-Augmented Generation)는 외부 문서를 검색해 LLM 답변의 정확성을 높이는 방식이다. 그러나 검색된 문서와 LLM 내부 지식이 서로 다른 답을 가리킬 때 문제가 생긴다.
| 충돌 상황 | 바람직한 행동 | 현재 RAG의 문제 |
|---|---|---|
| 외부 문서가 최신·권위 정보 | 외부 근거 우선 | 모델이 내부 지식 고집 |
| 외부 문서가 부정확·모호 | 내부 지식 또는 불확실성 표현 | 외부 문서 맹신 |
| 둘 다 불확실 | abstention / 한계 명시 | 확신 있는 오답 |
실제 사례: 사내 RAG 시스템에서 직원이 재택근무 정책을 질문할 때, AI가 2024년 개정 문서 대신 학습 당시의 구버전 정책을 답하는 상황이 대표적이다.
기존 PA-RAG(Preference-Aligned RAG)는 informativeness·robustness·citation quality를 다루지만, context–memory conflict를 명시적 정렬 축으로 다루지 않는다 — 본 연구의 출발점.
DPO(Direct Preference Optimization) + LoRA로 Knowledge Conflict 처리 능력을 모델에 학습으로 내재화한다.
| # | 방법 | 학습 | 역할 |
|---|---|---|---|
| 1 | Base RAG | — | 하한선 |
| 2 | Conflict-Aware Prompting | — | 프롬프트만으로 충돌 처리 |
| 3 | PA-RAG-style LoRA | DPO + LoRA | conflict 없이 PA-RAG식 정렬 |
| 4 | Conflict-Aware RAG LoRA | DPO + LoRA | conflict preference만 학습 |
| 5 | Conflict-Aware PA-RAG LoRA ⭐ | DPO + LoRA | PA-RAG + conflict 통합 (제안 방법) |
핵심 주장: 프롬프트 수준의 conflict-aware 지시는 효과가 있으나(파일럿 결과 참조), preference learning으로 내재화하면 더 강건하고 일반화 가능한 conflict 처리가 가능할 것으로 가설 설정.
본 프로젝트는 Start 트랙으로 진행 중입니다.
| 단계 | 내용 | 상태 |
|---|---|---|
| Start (이번 학기) | Knowledge Conflict 문제 정의 · Base RAG vs Conflict-Aware Prompting 파일럿 실험 · 문제 존재 및 개선 가능성 검증 | ✅ 완료 |
| Growth (확장 방향) | Llama 3.1-8B 기반 DPO + LoRA 내재화 · 정량 벤치마크 (ClashEval, WikiContradict) | 🔄 진행 예정 |
이번 학기 평가 대상 범위: 본 프로젝트는 Start 트랙으로, DPO+LoRA 최종 학습 성능 검증이 아니라 Knowledge Conflict 문제 정의, RAG 파이프라인 구현, Base RAG vs Conflict-Aware Prompting 파일럿 실험, 데모 검증을 완료 범위로 한다. DPO+LoRA 코드는 dry-run 수준에서 동작 확인이 완료되었으며, 대규모 학습 및 정량 벤치마크는 Growth 방향이다.
flowchart LR
subgraph Input
D[📄 문서]
Q[❓ 질문]
end
subgraph Pipeline["RAG Pipeline (src/rag/)"]
L[Load] --> C[Chunk] --> E[Embed] --> V[(Vector\nStore)]
V --> R[Retrieve]
Q --> R
R --> P[Prompt\nBuilder]
P --> G[Generator\nLLM]
end
subgraph Conflict["Conflict Handling"]
CA[Conflict-Aware\nPrompt]
DPO[DPO + LoRA\nFine-tuning]
end
D --> L
P -.->|Base| G
CA -.->|Prompting Arm| G
DPO -.->|Learning Arm| G
G --> O[💬 Answer +\nSources]
API 모델(gpt-4o-mini, claude-haiku) 기반 파일럿. 본 연구 타겟인 Llama 3.1-8B 실험의 사전 탐색 단계. 상세:
experiments/2026-05-31/
exp1 — 거짓 문서 거부율 (gpt-4o-mini, 24케이스)
| Arm | 전체 | 거짓 문서 거부 |
|---|---|---|
| Base RAG | 75% | 3 / 6 |
| Conflict-Aware Prompting | 100% | 6 / 6 |
exp2 — 문서 구성별 분해 (claude-haiku, 36케이스)
| 문서 구성 | Base RAG | Conflict-Aware |
|---|---|---|
| A: 거짓만 (정답 없음) | 50% | 83% |
| B: 거짓 + 정답 공존 | 100% | 100% |
핵심 발견: 강한 API 모델은 temporal conflict를 프롬프트 없이도 ~100% 처리 (천장 효과). → Llama 3.1-8B에서 gap이 존재할 것으로 예상 — 본 연구의 핵심 측정 구간.
파이프라인 실행 결과물 (직접 확인 가능):
| 파일 | 내용 |
|---|---|
| smoke_test_conflict_base.json | Base RAG 실행 결과 |
| smoke_test_conflict_aware.json | Conflict-Aware RAG 실행 결과 |
| smoke_test_base_rag.json | 단독 Base RAG smoke test |
| 20260531T104426Z.json | ClashEval 파일럿 배치 실행 결과 |
AI / 학습
RAG / 검색
데모 / 배포
설치 없이 바로 체험하려면 → 📋 Self-Demo 가이드 를 따라하세요.
| 방법 | 링크 | 설명 |
|---|---|---|
| 🌐 연구 사이트 | alltology.zapto.org | 연구 소개 · 팀 정보 |
| 🤗 인터랙티브 데모 | HuggingFace Spaces | Base RAG vs Conflict-Aware 실시간 비교 |
| @alltology_rag_bot | 저장소 문서 기반 RAG 챗봇 | |
| 🎬 데모 영상 | YouTube 시연 영상 | 전체 시연 영상 |
| 📊 발표 슬라이드 | Google Slides · PDF · Marp 원본 | 기말 발표 자료 |
로컬 실행:
Step 1 — 레포 클론 및 의존성 설치
git clone https://github.com/Ontology0/Graduation-Project.git
cd Graduation-Project
pip install -r requirements.txtStep 2 — 환경변수 설정 (HuggingFace 모델 사용 시 API 키 불필요)
cp .env.example .env # 필요 시 ANTHROPIC_API_KEY 등 입력Step 3 — 파이프라인 실행
make demo # Base RAG smoke test
make demo-conflict # Base RAG vs Conflict-Aware 비교연구 설계와 구현의 상세 내용을 담은 문서입니다.
| 문서 | 내용 |
|---|---|
| 📋 Project Brief | 연구 동기 · 고객 · 솔루션 · 파일럿 결과 요약 |
| 🏗 Architecture | 시스템 구조 · 데이터 흐름 · 핵심 엔트리포인트 1페이지 요약 |
| 🎬 Demo & Evidence | CLI smoke test · 실제 실행 결과 · 파이프라인 동작 증빙 |
| ✅ Verification Checklist | 재현성 · 보안 · 운영 항목별 검증 기록 |
| 🤖 AI 투명성 리포트 | AI 도구 활용 내역 · 인간 판단 영역 명시 |
| 🗺 RQ ↔ 구현 매핑 | 연구 질문과 실제 코드의 1:1 대응 관계 |
| 🔬 실험 설계 | 5개 arm 비교 설계 · 데이터셋 · 평가 메트릭 |
| 📚 관련 연구 | PA-RAG · DPO · Knowledge Conflict 선행 연구 |
| 📊 Benchmark selection | 벤치마크 후보 검토 및 train/eval split (#55 반영) |
| 📝 Decision log | 확정·보류·제외 결정 |
벤치마크·데이터셋 전략 요약: train = 명확 라벨(버전·시간, true_doc/false_doc, context–memory); eval = held-out + 논쟁적(false-only, model_knows) + 자연/토론(WikiContradict 등). 상세는 docs/benchmark_selection.md, 근거는 docs/decision_log.md.
| 방향 | 내용 | 상태 |
|---|---|---|
| DPO+LoRA 코드 | src/training/train.py dry-run 구현 · 1-step 체크포인트 확인 (train_loss=0.693, epoch=0.5) |
✅ dry-run 완료 |
| Llama 3.1-8B 대규모 학습 | 파일럿에서 확인한 gap을 타겟 모델에서 측정 · conflict 처리 lower bound 확보 | 🔄 Growth |
| DPO 학습 데이터 확장 | synthetic conflict JSONL 확장 + ClashEval 활용 · preference pair 품질 개선 | 🔄 Growth |
| 정량 벤치마크 | WikiContradict · ClashEval 5-arm 비교 평가 | 🔄 Growth |
Graduation-Project/
├── src/
│ ├── rag/ # RAG 파이프라인 (핵심 구현)
│ │ ├── pipeline.py # 전체 파이프라인 오케스트레이터
│ │ ├── document_loader.py # 문서 로딩
│ │ ├── github_kb.py # GitHub repo KB ingest (Telegram 봇)
│ │ ├── pilot_dataset.py # 파일럿/배치용 데이터셋 헬퍼
│ │ ├── chunker.py # 텍스트 청킹
│ │ ├── embedder.py # 임베딩 생성
│ │ ├── vector_store.py # FAISS 벡터 스토어
│ │ ├── retriever.py # 검색 모듈
│ │ ├── prompt_builder.py # 프롬프트 빌더
│ │ ├── generator.py # LLM 생성 (HF / Anthropic)
│ │ ├── reporting.py # 실행 결과 JSON/MD 저장 (outputs/runs/)
│ │ └── config.py # 설정 로더
│ ├── chatbot/
│ │ └── telegram_bot.py # 텔레그램 RAG 봇 (Railway 배포)
│ ├── training/
│ │ └── train.py # DPO+LoRA dry-run 구현 완료 · 정식 대규모 학습은 Growth 범위
│ └── evaluation/
│ └── evaluate.py # 5-arm 평가 하네스 구현 완료 · 정식 벤치마크 평가는 Growth 범위
├── scripts/
│ ├── run_pipeline.py # RAG 파이프라인 실행 CLI
│ ├── run_batch.py # 배치 실행
│ └── telegram_bot.py # 텔레그램 봇 엔트리포인트
├── configs/
│ ├── experiments/ # 실험 설정 YAML (rag_base, prompting, lora_*, rag_github_bot)
│ └── prompts/ # 프롬프트 템플릿 (base_rag, conflict_aware, judge, github_bot)
├── data/
│ ├── schema/ # conflict·preference JSON Schema
│ ├── sample_docs/ # smoke test용 샘플 문서
│ ├── synthetic_conflicts/ # DPO 학습용 합성 conflict 데이터
│ ├── synthetic/ # 합성 데이터 (예정)
│ └── natural/ # 자연 conflict 케이스 (예정)
├── experiments/ # 파일럿 실험 (날짜별 폴더)
│ ├── pilot_2026-05-26/ # 로컬 sanity-check (config·prompt·batch 배선)
│ ├── api_pilot_2026-05-28/ # GPT-4o-mini API 파일럿
│ └── 2026-05-31/ # ClashEval 기반 exp1~4
├── outputs/
│ ├── runs/ # 파이프라인 실행 결과물 (JSON / MD)
│ └── checkpoints/ # DPO+LoRA dry-run 체크포인트
├── docs/ # 연구·운영 문서 (architecture, demo, verification 등)
├── course/ # 수업 제출물 (Project Brief, PMF, 팀 규칙 등)
├── tests/ # pytest 테스트 스위트
├── app.py # HuggingFace Spaces Gradio 데모
├── self_demo.md # 방문자용 5분 체험 가이드
├── Makefile # make demo / make demo-conflict
├── requirements.txt # RAG 파이프라인 패키지
├── requirements_bot.txt # 텔레그램 봇 배포 전용 패키지
├── Procfile # Railway 봇 배포 설정
└── railway.json # Railway 배포 구성
버그 리포트, 실험 아이디어, 코드 기여 모두 환영합니다.
dev브랜치에서 작업 브랜치를 생성합니다 (feat/,fix/,docs/등)- 변경 후
dev로 Pull Request를 올립니다 - 커밋 메시지 형식 · 브랜치 전략 · PR 절차는 CONTRIBUTING.md 참고
main ← 제출 / 배포 스냅샷
└── dev ← 일상 개발 · PR 통합
├── feat/ · docs/ · chore/ · fix/
상세 규칙: CONTRIBUTING.md
![]() |
![]() |
![]() |
|---|---|---|
| 박세령 | 손현경 | 이다영 |
| @ryeong03 | @bbberylll | @dev-ldy03 |
| Conflict 설계 · RAG 파이프라인 | DPO 학습 · LoRA fine-tuning | 데이터 파이프라인 · 평가 |
팀명: Alltology · 팀 번호: 03 · 트랙: 연구 · 지도교수: 황의원 교수님
AI 투명성 리포트: docs/ai_transparency_report.md
2026 이화여자대학교 캡스톤디자인






