λ¬Έμ κΈ°λ° μ§μμλ΅μμ LLMμ hallucinationμ νμ§νκ³ , μ¬λ¬ λͺ¨λΈμ μλ΅ μ λ’°μ±μ μ λμ μΌλ‘ λΉκ΅ νκ°νλ νμ΄νλΌμΈ
LLMμ λ¬Έμ κΈ°λ° μ§λ¬Έμ νλ©΄ hallucination(κ·Όκ±° μλ λ΅λ³)μ μμ±νλ λ¬Έμ κ° μλ€. μ΄ νλ‘μ νΈλ RAGλ‘ κ΄λ ¨ λ¬Έμλ₯Ό κ²μνμ¬ LLMμ μ 곡νκ³ , 3λ¨κ³ νκ° νμ΄νλΌμΈμΌλ‘ μλ΅μ μ λ’°μ±μ μλ νκ°νλ€.
- Hybrid RAG: Vector Search + BM25 + Cross-Encoder Reranking
- λ©ν° LLM λΉκ΅: GPT-4o, Claude, Llama3 λμΌ μ‘°κ±΄ ν μ€νΈ
- 3λ¨κ³ μ λ’°μ± νκ°: RAGAS (μ λ) + LLM-as-a-Judge (μ μ±) + DeepEval (μμ μ±)
[Documents] [User Query]
β β
βΌ βΌ
ββββββββββββ βββββββββββββββ
β Document β β Query β
β Loader β β Engine β
β (PDF/TXT)β ββββββββ¬βββββββ
ββββββ¬ββββββ β
βΌ β
ββββββββββββ β
β Semantic β β
β Chunker β β
ββββββ¬ββββββ β
βΌ βΌ
ββββββββββββ βββββββββββββββ
βEmbedding βββββββββββββΆβ Hybrid β
β Model β β Retriever β
ββββββ¬ββββββ β Vector+BM25β
βΌ β +Reranker β
ββββββββββββ ββββββββ¬βββββββ
β ChromaDB β β
β (Vector β βΌ
β Store) β βββββββββββββββ
ββββββββββββ β LLM Layer β
β (LiteLLM) β
β GPT/Claude β
β /Ollama β
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββ
β Response β
β + Citation β
ββββββββ¬βββββββ
β
βββββββββββββββΌββββββββββββββ
βΌ βΌ βΌ
ββββββββββββ ββββββββββββ ββββββββββββ
β RAGAS β β LLM β β DeepEval β
β μ λνκ° β β Judge β β μμ μ± β
β β β μ μ±νκ° β β β
β Faith. β β G-Eval β β Halluc. β
β Relevancyβ β μΈμ©μ νμ±β β Toxicity β
β Ctx P/R β β μκ²°μ± β β β
ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ
ββββββββββββββΌβββββββββββββ
βΌ
βββββββββββββββ
β Dashboard β
β (Streamlit) β
βββββββββββββββ
| κ΅¬λΆ | κΈ°μ | μ ν μ΄μ |
|---|---|---|
| μΈμ΄ | Python 3.11+ | RAG μνκ³ μ€μ¬ |
| LLM ν΅ν© | LiteLLM | 1μ€λ‘ GPT/Claude/Ollama μ ν |
| μλ² λ© | OpenAI text-embedding-3-small | λΉμ© λλΉ μ±λ₯ μ΅μ |
| λ²‘ν° DB | ChromaDB | pip installλ§μΌλ‘ λ‘컬 μ€ν |
| BM25 | rank_bm25 | ν€μλ κ²μ 보μ |
| 리λ컀 | sentence-transformers (Cross-Encoder) | κ²μ μ λ°λ ν₯μ |
| PDF νμ± | PyMuPDF | λΉ λ₯΄κ³ μ νν ν μ€νΈ μΆμΆ |
| νκ° | RAGAS + DeepEval | νμ μ μΌλ‘ κ²μ¦λ RAG λ©νΈλ¦ |
| UI | Streamlit | λΉ λ₯Έ λ°λͺ¨ κ΅¬μΆ |
PDF/TXT βββΆ ν
μ€νΈ μΆμΆ βββΆ μλ§¨ν± μ²νΉ βββΆ μλ² λ© βββΆ ChromaDB μ μ₯
(PyMuPDF) (λ¬Έμ₯ κ²½κ³ (OpenAI (λ²‘ν° + λ©νλ°μ΄ν°)
κΈ°λ° λΆν ) API)
- μλ§¨ν± μ²νΉ: κ³ μ ν¬κΈ°κ° μλ λ¬Έμ₯ κ²½κ³ κΈ°λ° λΆν (μλ―Έ λ¨μ 보쑴)
- μ²ν¬ ν¬κΈ°: 512 ν ν° (256/1024μ λΉκ΅ μ€ν μμ )
- μ€λ²λ©: 50 ν ν° (컨ν μ€νΈ μ°κ²° μ μ§)
Query βββ¬βββΆ Vector Search (ChromaDB, μ½μ¬μΈ μ μ¬λ)
β βββΆ RRF λ³ν© βββΆ Reranking βββΆ Top-5
ββββΆ BM25 Search (ν€μλ λ§€μΉ)
Hybrid Searchκ° νμν μ΄μ :
| κ²μ λ°©μ | κ°μ | μ½μ |
|---|---|---|
| Vector Search | "μ‘Έμ μ건" β "νμ μ·¨λ 쑰건" (μλ―Έ μ μ¬) | μ νν κ³ μ λͺ μ¬/μ«μ κ²μ μ½ν¨ |
| BM25 | "μ 30μ‘°" μ νν λ§€μΉ | μ μμ΄/ν¨λ¬νλ μ΄μ¦ λͺ» μ°Ύμ |
| Hybrid (RRF) | λ λ°©μμ μ₯μ κ²°ν© |
Reciprocal Rank Fusion (RRF):
Score(doc) = Ξ£ 1/(k + rank_i) (k=60)
κ° κ²μ μμ€ν μ μμλ₯Ό μμλ‘ ν©μ°νμ¬ μ΅μ’ μμ κ²°μ .
Cross-Encoder Reranking: 1μ°¨ κ²μμμ 20κ° ν보 β Cross-Encoderλ‘ μ λ° μ¬νκ° β μμ 5κ° μ λ³.
# LiteLLMμΌλ‘ λͺ¨λΈ κ΅μ²΄λ 1μ€
from litellm import completion
# GPT-4o
response = completion(model="openai/gpt-4o", messages=[...])
# Claude Sonnet
response = completion(model="anthropic/claude-sonnet-4-20250514", messages=[...])
# Llama3 (λ‘컬, 무λ£)
response = completion(model="ollama/llama3.2", messages=[...])ν둬ννΈμ μΆμ² μΈμ©μ μ§μνμ¬ λ΅λ³μ [μΆμ²: λ¬Έμλͺ
, νμ΄μ§] νμ.
κ° νκ° λ°©μμ΄ μ‘λ λ¬Έμ κ° λ€λ₯΄λ€:
ββ RAGAS ββββββββ "컨ν
μ€νΈμ κ·Όκ±°νλκ°?" (μ λ)
β
RAG μλ΅ βββΆ νκ° ββββββββΌβ LLM Judge ββββ "λ΅λ³μ΄ μμ νκ³ μ ννκ°?" (μ μ±)
β
ββ DeepEval βββββ "λͺ
μμ μΌλ‘ νλ¦° λ΄μ©μ΄ μλκ°?" (μμ μ±)
RAGASλ RAGμ κ²μ νμ§κ³Ό μμ± νμ§μ ꡬλΆνμ¬ νκ°νλ€.
| λ©νΈλ¦ | μΈ‘μ λμ | λμ λ°©μ | Target |
|---|---|---|---|
| Faithfulness | μμ± | λ΅λ³βclaim λΆν΄β컨ν μ€νΈμμ NLI κ²μ¦ | β₯ 0.85 |
| Answer Relevancy | μμ± | λ΅λ³βμμ§λ¬Έ μμ±βμλ μ§λ¬Έκ³Ό μ μ¬λ λΉκ΅ | β₯ 0.80 |
| Context Precision | κ²μ | κ²μ λ¬Έμλ³ κ΄λ ¨μ± νμ βAverage Precision | β₯ 0.75 |
| Context Recall | κ²μ | μ λ΅βstatement λΆν΄β컨ν μ€νΈμμ νμΈ | β₯ 0.80 |
Faithfulness λμ μμ:
λ΅λ³: "μ‘Έμ
μλ 130νμ μ΄ νμνλ©°, GPA 2.0 μ΄μμ΄μ΄μΌ ν©λλ€."
β claim λΆν΄
Claim 1: "μ‘Έμ
μλ 130νμ μ΄ νμνλ€"
Claim 2: "GPA 2.0 μ΄μμ΄μ΄μΌ νλ€"
β 컨ν
μ€νΈ λμ‘°
Context: "νμμ μ΅μ 130νμ μ μ΄μν΄μΌ μ‘Έμ
ν μ μλ€."
β
Claim 1: β
Supported Claim 2: β Not Supported (hallucination)
β
Faithfulness = 1/2 = 0.50
κ°λ ₯ν LLM(GPT-4o)μ **μ±μ κ΄(judge)**μΌλ‘ μ¬μ©νμ¬ RAGASκ° μ‘μ§ λͺ»νλ μ μ±μ νμ§μ νκ°νλ€.
G-Eval λ°©μ:
- νκ° κΈ°μ€μ μ£Όλ©΄ LLMμ΄ νκ° μ μ°¨(Chain-of-Thought)λ₯Ό μλ μμ±
- μμ±λ μ μ°¨μ λ°λΌ λ΅λ³μ νκ°
- ν ν° νλ₯ λ‘ μ μλ₯Ό μ κ·ν (μ μκ° μλ μ°μ μ μ)
νκ° νλͺ©: μΈμ© μ νμ±, λ΅λ³ μκ²°μ±, κ°λ μ± (κ° 1-5μ )
Judge νΈν₯ μν:
| νΈν₯ | λ¬Έμ | μν λ°©λ² |
|---|---|---|
| Position Bias | μμμ λ°λΌ νμ λ€μ§ν (10-30%) | μμ λ°κΏ 2ν νκ° ν νκ· |
| Verbosity Bias | κΈ΄ λ΅λ³ μ νΈ (70%) | "κΈΈμ΄κ° μλ μ νμ± κΈ°μ€" λͺ μ |
| Self-Enhancement | μκΈ° λͺ¨λΈ λ΅λ³μ +10-25% | μμ± λͺ¨λΈκ³Ό λ€λ₯Έ λͺ¨λΈμ judgeλ‘ μ¬μ© |
RAGAS Faithfulnessμ λ€λ₯Έ κ΄μ μμ hallucinationμ νμ§νλ€.
RAGAS Faithfulness: "μ¦κ±° μμ" = λΆμΆ©μ€ (μ격)
DeepEval Hallucination: "λͺ
μμ λͺ¨μ" = hallucination (λͺ¨μλ§ νμ§)
μμ:
Context: "μ‘Έμ
νμ μ 130μ΄λ€"
λ΅λ³: "μ‘Έμ
νμ μ 130μ΄λ©°, μΈν΄μλ νμμ΄λ€"
Faithfulness: 0.50 ("μΈν΄μ" μ¦κ±° μμ β λΆμΆ©μ€)
Hallucination: 0.00 ("μΈν΄μ" λͺ¨μμ μλ β λ―Ένμ§)
β λ λ€ μ¬μ©ν΄μΌ μ νν μ λ’°μ± νκ° κ°λ₯
μ€ν 1: λͺ¨λΈ λΉκ΅ (κ²μ κ³ μ : Hybrid+Rerank)
GPT-4o-mini / GPT-4o / Claude Sonnet / Llama 3.2
Γ 100 QA μ = 400 νκ°
μ€ν 2: κ²μ μ λ΅ λΉκ΅ (λͺ¨λΈ κ³ μ : GPT-4o-mini)
Vector Only / BM25 Only / Hybrid / Hybrid+Rerank
Γ 100 QA μ = 400 νκ°
μ€ν 3: RAG vs No-RAG
컨ν
μ€νΈ μ 곡 vs LLM λ¨λ
Γ 100 QA μ = 200 νκ°
Model Faith. Relev. Halluc. Latency
ββββββββββββββββββββββββββββββββββββββββββββββββββ
GPT-4o 0.92 0.94 0.05 3.2s
Claude Sonnet 0.90 0.91 0.07 4.1s
GPT-4o-mini 0.87 0.89 0.10 1.8s
Llama 3.2 0.78 0.82 0.18 2.5s
Strategy C.Prec C.Rec Faith.
ββββββββββββββββββββββββββββββββββββββββ
Vector Only 0.72 0.75 0.85
BM25 Only 0.68 0.70 0.83
Hybrid (RRF) 0.82 0.84 0.87
Hybrid+Rerank 0.89 0.88 0.87 β Best
Faithfulness Hallucination
With RAG 0.87 0.10
Without RAG 0.45 0.52 β 52% hallucination!
| Phase | κΈ°κ° | λ΄μ© | ν΅μ¬ μ°μΆλ¬Ό |
|---|---|---|---|
| Phase 1 | Week 1 | λ¬Έμ μμ§ νμ΄νλΌμΈ | PDF β Chunks β Embeddings β ChromaDB |
| Phase 2 | Week 2 | κ²μ μμ€ν | Hybrid Search + Reranker |
| Phase 3 | Week 3 | λ΅λ³ μμ± | λ©ν° LLM νμ΄νλΌμΈ + μΆμ² μΈμ© |
| Phase 4 | Week 4 | νκ° νμ΄νλΌμΈ | RAGAS + LLM Judge + DeepEval |
| Phase 5 | Week 5-6 | UI + ν΅ν© | Streamlit λ°λͺ¨ + μ΅μ’ 리ν¬νΈ |
| νλͺ© | AWS | GCP | μΆμ² |
|---|---|---|---|
| μ± νΈμ€ν | App Runner ~$18/μ | Cloud Run ~$0/μ | GCP |
| λ¬΄λ£ ν¬λ λ§ | $200 (μ¨μ λΉμ© μ£Όμ) | $300 (μμ ) | GCP |
| LLM λ¬΄λ£ | μμ | Gemini 1M tokens/μ | GCP |
| μ μ΄ λΉμ© | ~$24-28 | ~$6-10 | GCP |
κ°λ°μ λ‘컬μμ μ§ν (λΉμ© $0), λ°λͺ¨ λ°°ν¬λ§ GCP Cloud Run μ¬μ© μΆμ². λΉ λ₯Έ λ°λͺ¨λ§ νμνλ©΄ Hugging Face Spaces (무λ£)λ μ’μ λμ.
Research_test/
βββ config/ # μ€μ
β βββ settings.py # μ μ μ€μ (μ²ν¬ ν¬κΈ°, λͺ¨λΈ λ±)
β βββ models.py # LLM λͺ¨λΈ μ€μ
βββ src/
β βββ ingestion/ # λ¬Έμ μμ§
β β βββ loader.py # PDF/TXT λ‘λ
β β βββ chunker.py # μλ§¨ν± μ²νΉ
β β βββ embedder.py # μλ² λ© μμ±
β βββ retrieval/ # κ²μ
β β βββ vector_store.py # ChromaDB λνΌ
β β βββ bm25_store.py # BM25 ν€μλ κ²μ
β β βββ hybrid.py # νμ΄λΈλ¦¬λ κ²μ (RRF)
β β βββ reranker.py # Cross-encoder 리λνΉ
β βββ generation/ # λ΅λ³ μμ±
β β βββ llm_client.py # LiteLLM λ©ν° λͺ¨λΈ λνΌ
β β βββ prompt.py # ν둬ννΈ ν
νλ¦Ώ
β β βββ pipeline.py # RAG μ€μΌμ€νΈλ μ΄μ
β βββ evaluation/ # νκ° (3λ¨κ³)
β β βββ ragas_metrics.py # RAGAS μ λ νκ°
β β βββ llm_judge.py # LLM-as-a-Judge μ μ± νκ°
β β βββ safety_metrics.py # DeepEval μμ μ± νκ°
β β βββ dataset.py # νκ° λ°μ΄ν°μ
κ΄λ¦¬
β β βββ report.py # μ’
ν© λΉκ΅ 리ν¬νΈ
β βββ ui/
β βββ app.py # Streamlit λ°λͺ¨ μ±
βββ data/
β βββ documents/ # μλ³Έ λ¬Έμ
β βββ eval/ # νκ° QA λ°μ΄ν°μ
β βββ results/ # νκ° κ²°κ³Ό
βββ tests/ # ν
μ€νΈ
βββ docs/ # μμΈ λ¬Έμ
# 1. ν΄λ‘ λ° μ€μΉ
git clone <repo-url>
cd Research_test
pip install -e ".[dev]"
# 2. νκ²½λ³μ μ€μ
cp .env.example .env
# .envμ OPENAI_API_KEY, ANTHROPIC_API_KEY μ
λ ₯
# 3. λ¬Έμ μ€λΉ
# data/documents/μ PDF/TXT νμΌ λ°°μΉ
# 4. ν
μ€νΈ
pytest tests/ -v
# 5. νμ΄νλΌμΈ μ€ν
python -m src.generation.pipeline --query "μ§λ¬Έ" --model "openai/gpt-4o-mini"
# 6. νκ° μ€ν
python -m src.evaluation.metrics --dataset data/eval/qa_pairs.json --models all
# 7. UI μ€ν
streamlit run src/ui/app.py| λ¬Έμ | λ΄μ© |
|---|---|
| 01-project-overview.md | νλ‘μ νΈ κ°μ, μν€ν μ², λ²μ |
| 02-development-plan.md | λ¨κ³λ³ κ°λ° κΈ°ν, μΈλΆ νμ€ν¬, μ€ν μ€κ³ |
| 03-requirements.md | κΈ°μ μ€ν, μμ‘΄μ±, API ν€, λΉμ© μΆμ |
| 04-research.md | κΈ°μ λΉκ΅ λΆμ (νλ μμν¬, 벑ν°DB, μλ² λ© λ±) |
| 05-cloud-deployment.md | ν΄λΌμ°λ λ°°ν¬ λΉκ΅ (AWS vs GCP) |
| 06-evaluation-methods.md | RAG νκ° λ°©λ²λ‘ μ¬μΈ΅ λΆμ (RAGAS, LLM-as-a-Judge) |