[AI Paper] ๐ RAGAS: Automated Evaluation of Retrieval Augmented Generation
๐ RAGAS: Automated Evaluation of Retrieval Augmented Generation
๐ ๋ฉํ ์ ๋ณด
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์ ์ | Shahul Es, Jithin James (Exploding Gradients), Luis Espinosa-Anke, Steven Schockaert (CardiffNLP, Cardiff University) |
| ๊ธฐ๊ด | Exploding Gradients, Cardiff University, AMPLYFI |
| ๋ฐํ์ฒ | EACL 2024 (18th Conference of the European Chapter of the Association for Computational Linguistics: System Demonstrations), pp. 150-158, St. Julians, Malta |
| ๋ฐํ ์ฐ๋ | 2023๋ 9์ (arXiv), 2024๋ 3์ (EACL) |
| arXiv | 2309.15217 |
| GitHub | explodinggradients/ragas |
| ๋ผ์ด์ ์ค | Apache-2.0 |
| PyPI | ragas |
๐ฏ ํ์ค ์์ฝ
Ground Truth ์์ด LLM์ ํ์ฉํ์ฌ RAG ํ์ดํ๋ผ์ธ์ ๊ฒ์ ํ์ง๊ณผ ์์ฑ ํ์ง์ ์๋์ผ๋ก ํ๊ฐํ๋ Reference-free ํ๊ฐ ํ๋ ์์ํฌ๋ก, Faithfulness(95%), Answer Relevance(78%), Context Relevance(70%)์ ์ธ๊ฐ ํ๊ฐ ์ผ์น์จ์ ๋ฌ์ฑ
๐ ์ฐ๊ตฌ ๋ฐฐ๊ฒฝ ๋ฐ ๋๊ธฐ
RAG ์์คํ ์ ๋ถ์
- RAG(Retrieval Augmented Generation)๋ ๊ฒ์(Retrieval) ๋ชจ๋๊ณผ LLM ๊ธฐ๋ฐ ์์ฑ(Generation) ๋ชจ๋์ ๊ฒฐํฉ
- ์ธ๋ถ ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ์ฌ LLM์ ํ ๋ฃจ์๋ค์ด์ (hallucination) ์ํ์ ์ค์
- ์ฌ์ฉ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ์์ฐ์ด ์ธํฐํ์ด์ค ์ญํ ์ํ
๊ธฐ์กด RAG ํ๊ฐ์ ๋ฌธ์ ์
- ๋ค์ฐจ์ ํ๊ฐ์ ๋ณต์ก์ฑ
- ๊ฒ์ ์์คํ ์ ๊ด๋ จ ์ปจํ ์คํธ ์๋ณ ๋ฅ๋ ฅ
- LLM์ ๊ฒ์๋ ์ปจํ ์คํธ ํ์ฉ ๋ฅ๋ ฅ (Faithfulness)
- ์์ฑ๋ ๋ต๋ณ์ ํ์ง
- ๊ธฐ์กด ๋ฉํธ๋ฆญ์ ํ๊ณ
- BLEU, ROUGE ๋ฑ ์ ํต์ ๋ฉํธ๋ฆญ์ ํ๋ฉด์ ํ ์คํธ ์ ์ฌ๋๋ง ์ธก์
- ์ฌ์ค์ ์ ํ์ฑ(factual accuracy)๊ณผ ์ปจํ ์คํธ ๊ด๋ จ์ฑ์ ํฌ์ฐฉํ์ง ๋ชปํจ
- RAG ํน์ฑ์ ๋ง์ง ์๋ ํ๊ฐ ๊ธฐ์ค
- Human Annotation ์์กด์ฑ
- ๊ธฐ์กด ํ๊ฐ ๋ฐฉ์์ ๋๊ท๋ชจ ์ธ๊ฐ ์ฃผ์ ๋ฐ์ดํฐ ํ์
- ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ์์
- ๋น ๋ฅธ ๊ฐ๋ฐ ์ฌ์ดํด์ ๋ถ์ ํฉ
RAGAS์ ํ์์ฑ
- LLM ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅธ ์ฑํ์ ๋ฐ๋ฅธ ์ ์ํ ํ๊ฐ ์ฌ์ดํด ์๊ตฌ
- Reference-free ํ๊ฐ๋ก ํ๊ฐ ๋น์ฉ ์ ๊ฐ
- RAG ํ์ดํ๋ผ์ธ์ ๊ฐ ๊ตฌ์ฑ์์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ๊ฐํ ์ ์๋ ์ฒด๊ณ์ ํ๋ ์์ํฌ ํ์
๐ก ํต์ฌ ์์ด๋์ด
Reference-Free ํ๊ฐ์ ๊ฐ๋
RAGAS์ ํต์ฌ์ Ground Truth ์์ด LLM์ Judge๋ก ํ์ฉํ์ฌ RAG ์์คํ ์ ํ๊ฐํ๋ ๊ฒ์ ๋๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ RAGAS ํ๊ฐ ํ๋ ์์ํฌ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ Question โโโ [Retriever] โโโ Contexts โโโ [Generator] โโโ Answer โ
โ โ โ โ โ โ
โ โ โ โ โ โ
โ โผ โผ โผ โผ โ
โ โโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโ
โ โContext โ โ Context โ โFaithfulnessโ โAnswer โโ
โ โRelevanceโ โ Precision โ โ โ โRelevanceโโ
โ โโโโโโโโโโ โ & Recall โ โโโโโโโโโโโโโโ โโโโโโโโโโโ
โ โโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโ Retriever ํ๊ฐ โโโโโโโถ โโโโโ Generator ํ๊ฐ โโโโโถ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
RAG Triad: ํต์ฌ ํ๊ฐ ์ฒ ํ
TruLens์์ ์ฒ์ ์ ์๋ RAG Triad ๊ฐ๋ ์ RAGAS๊ฐ ๋ฐ์ ์์ผฐ์ต๋๋ค:
| ๋ฉํธ๋ฆญ | ํ๊ฐ ๋์ | ํต์ฌ ์ง๋ฌธ | Ground Truth ํ์ |
|---|---|---|---|
| Faithfulness | Generation | ๋ต๋ณ์ด ์ปจํ ์คํธ์ ๊ทผ๊ฑฐํ๋๊ฐ? (ํ๊ฐ ๋ฐฉ์ง) | โ |
| Answer Relevance | Generation | ๋ต๋ณ์ด ์ง๋ฌธ์ ์ ์ ํ ๋์ํ๋๊ฐ? | โ |
| Context Relevance | Retrieval | ๊ฒ์๋ ์ปจํ ์คํธ๊ฐ ์ง์ค์ ์ธ๊ฐ? | โ |
๐๏ธ ํ๊ฐ ๋ฉํธ๋ฆญ ์์ธ
1. Faithfulness (์ถฉ์ค์ฑ) – 95% ์ธ๊ฐ ์ผ์น์จ
์์ฑ๋ ๋ต๋ณ์ ์ฌ์ค์ ์ผ๊ด์ฑ์ ์ธก์ ํฉ๋๋ค. ๋ต๋ณ์ ๋ชจ๋ ์ฃผ์ฅ์ด ๊ฒ์๋ ์ปจํ ์คํธ๋ก๋ถํฐ ์ถ๋ก ๊ฐ๋ฅํ์ง ํ๊ฐํฉ๋๋ค.
๊ณ์ฐ ๊ณผ์
Step 1: LLM์ ์ฌ์ฉํด ๋ต๋ณ์ ๊ฐ๋ณ ์ฃผ์ฅ(claims/statements)์ผ๋ก ๋ถํด
Step 2: ๊ฐ ์ฃผ์ฅ์ด ์ปจํ
์คํธ์์ ์ถ๋ก ๊ฐ๋ฅํ์ง LLM์ผ๋ก ๊ฒ์ฆ
Step 3: ์ง์ง๋๋ ์ฃผ์ฅ์ ๋น์จ๋ก Faithfulness ์ ์ ๊ณ์ฐ
์์
\text{Faithfulness} = \frac{|V|}{|S|}์ฌ๊ธฐ์:
– S = ๋ต๋ณ์์ ์ถ์ถ๋ ์ ์ฒด ์ฃผ์ฅ(statements)์ ์งํฉ
– V = ์ปจํ
์คํธ์ ์ํด ์ง์ง๋๋ ์ฃผ์ฅ์ ์งํฉ
์์
Question: "ํ์ด์ฌ์ ๋๊ฐ ๋ง๋ค์๋์?"
Context: "ํ์ด์ฌ์ ๊ท๋ ๋ฐ ๋ก์ฌ์ด 1991๋
์ ๊ฐ๋ฐํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์
๋๋ค."
Answer: "ํ์ด์ฌ์ ๊ท๋ ๋ฐ ๋ก์ฌ์ด 1989๋
์ ๋ง๋ค์์ต๋๋ค."
์ฃผ์ฅ ๋ถ์:
1. "ํ์ด์ฌ์ ๊ท๋ ๋ฐ ๋ก์ฌ์ด ๋ง๋ค์๋ค" โ ์ง์ง๋จ โ
2. "1989๋
์ ๋ง๋ค์๋ค" โ ์ง์ง๋์ง ์์ โ (์ปจํ
์คํธ๋ 1991๋
)
Faithfulness = 1/2 = 0.5
์ค๋ฌด์ ์๋ฏธ
- Faithfulness๊ฐ ๋ฎ๋ค๋ฉด: LLM์ด ํ ๋ฃจ์๋ค์ด์ ์ ์์ฑํ๊ณ ์์
- ํด๊ฒฐ์ฑ : ํ๋กฌํํธ์ “์ค์ง ์ ๊ณต๋ ์ ๋ณด๋ง ์ฌ์ฉํ๋ผ”๋ ์ง์ ์ถ๊ฐ
2. Answer Relevance (๋ต๋ณ ๊ด๋ จ์ฑ) – 78% ์ธ๊ฐ ์ผ์น์จ
์์ฑ๋ ๋ต๋ณ์ด ์๋ ์ง๋ฌธ์ ์ง์ ์ ์ด๊ณ ์ ์ ํ๊ฒ ์๋ตํ๋์ง ์ธก์ ํฉ๋๋ค.
ํต์ฌ ์์ด๋์ด
“๋ต๋ณ์ด ์ง๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ค๋ฉด, ๋ต๋ณ๋ง์ผ๋ก ์๋ ์ง๋ฌธ์ ์ฌ๊ตฌ์ฑํ ์ ์์ ๊ฒ์ด๋ค”
๊ณ์ฐ ๊ณผ์
Step 1: LLM์ ์ฌ์ฉํด ๋ต๋ณ์ผ๋ก๋ถํฐ N๊ฐ์ ์ง๋ฌธ ๋ณํ ์ญ์์ฑ (๊ธฐ๋ณธ๊ฐ N=3)
Step 2: ์๋ณธ ์ง๋ฌธ๊ณผ ์์ฑ๋ ์ง๋ฌธ๋ค์ ์๋ฒ ๋ฉ ๊ณ์ฐ
Step 3: ํ๊ท ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ Answer Relevance ์ ์๋ก ์ฌ์ฉ
์์
\text{Answer Relevance} = \frac{1}{N} \sum_{i=1}^{N} \cos(E_{g_i}, E_o)ํ์ฅํ๋ฉด:
\text{Answer Relevance} = \frac{1}{N} \sum_{i=1}^{N} \frac{E_{g_i} \cdot E_o}{|E_{g_i}| \times |E_o|}์ฌ๊ธฐ์:
– E_{g_i}: i๋ฒ์งธ ์์ฑ๋ ์ง๋ฌธ์ ์๋ฒ ๋ฉ
– E_o: ์๋ ์ง๋ฌธ์ ์๋ฒ ๋ฉ
– N: ์์ฑ๋ ์ง๋ฌธ ์ (๊ธฐ๋ณธ๊ฐ: 3, strictness ํ๋ผ๋ฏธํฐ๋ก ์กฐ์ )
์์
Original Question: "ํ์ด์ฌ์ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ์?"
Answer: "ํ์ด์ฌ์ ๋ฌธ๋ฒ์ด ๊ฐ๊ฒฐํ๊ณ ๋ฐฐ์ฐ๊ธฐ ์ฌ์ฐ๋ฉฐ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค."
Generated Questions (์ญ์์ฑ):
1. "ํ์ด์ฌ์ ํน์ง์ ๋ฌด์์ธ๊ฐ์?" โ ์ ์ฌ๋: 0.92
2. "ํ์ด์ฌ์ด ์ข์ ์ด์ ๋?" โ ์ ์ฌ๋: 0.89
3. "ํ์ด์ฌ์ ์ด์ ์ ์ค๋ช
ํด์ฃผ์ธ์" โ ์ ์ฌ๋: 0.95
Answer Relevance = (0.92 + 0.89 + 0.95) / 3 = 0.92
์ ์ ๋ฒ์ ์ฃผ์์ฌํญ
- ์ฝ์ฌ์ธ ์ ์ฌ๋ ํน์ฑ์ ์ํ์ ์ผ๋ก [-1, 1] ๋ฒ์
- ์ค์ ๋ก๋ ๋๋ถ๋ถ [0, 1] ๋ฒ์์ด๋ ์ํ์ ์ผ๋ก ๋ณด์ฅ๋์ง ์์
3. Context Relevance (์ปจํ ์คํธ ๊ด๋ จ์ฑ) – 70% ์ธ๊ฐ ์ผ์น์จ
๊ฒ์๋ ์ปจํ ์คํธ๊ฐ ์ง๋ฌธ์ ์ผ๋ง๋ ์ง์ค์ ์ด๊ณ ๊ด๋ จ์ฑ์ด ๋์์ง ์ธก์ ํฉ๋๋ค.
์ค์์ฑ
- ๋ถํ์ํ๊ฒ ๊ธด ์ปจํ ์คํธ๋ LLM ๋น์ฉ ์ฆ๊ฐ
- ์ค๊ฐ์ ์์นํ ์ ๋ณด๋ LLM์ด ์ ํ์ฉํ์ง ๋ชปํจ (“Lost in the Middle” ๋ฌธ์ )
- ์ง์ค๋ ์ปจํ ์คํธ๊ฐ ๋ ์ข์ ๋ต๋ณ ํ์ง๋ก ์ด์ด์ง
๊ณ์ฐ ๋ฐฉ๋ฒ
Step 1: LLM์๊ฒ ์ปจํ
์คํธ์์ ์ง๋ฌธ ๋ต๋ณ์ ํ์์ ์ธ ๋ฌธ์ฅ๋ค์ ์ถ์ถํ๋๋ก ์์ฒญ
Step 2: ์ถ์ถ๋ ๋ฌธ์ฅ ์์ ์ ์ฒด ๋ฌธ์ฅ ์์ ๋น์จ ๊ณ์ฐ
์์
\text{Context Relevance} = \frac{|S_{\text{extracted}}|}{|S_{\text{total}}|}์ฌ๊ธฐ์:
– S_{\text{extracted}} = ์ง๋ฌธ ๋ต๋ณ์ ํ์์ ์ธ ๋ฌธ์ฅ๋ค
– S_{\text{total}} = ์ปจํ
์คํธ์ ์ ์ฒด ๋ฌธ์ฅ ์
์ค๋ฌด์ ์๋ฏธ
- Context Relevance๊ฐ ๋ฎ๋ค๋ฉด: ๊ฒ์๋ ์ฒญํฌ์ ๋ถํ์ํ ์ ๋ณด๊ฐ ๋ง์
- ํด๊ฒฐ์ฑ : ์ฒญํน ์ ๋ต ๋๋ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์
4. ์ถ๊ฐ ๋ฉํธ๋ฆญ (RAGAS v0.1+)
| ๋ฉํธ๋ฆญ | ์ค๋ช | Ground Truth ํ์ | ์ฌ์ฉ ์๋๋ฆฌ์ค |
|---|---|---|---|
| Context Precision | ๊ด๋ จ ์ปจํ ์คํธ๊ฐ ์์ ๋ญํฌ์ ์๋์ง | Yes | ๊ฒ์ ๋ญํน ํ์ง ํ๊ฐ |
| Context Recall | ํ์ํ ์ ๋ณด๊ฐ ์ผ๋ง๋ ๊ฒ์๋์๋์ง | Yes | ๊ฒ์ ์ปค๋ฒ๋ฆฌ์ง ํ๊ฐ |
| Answer Correctness | ๋ต๋ณ์ ์ ํ์ฑ | Yes | ์ต์ข ๋ต๋ณ ํ์ง |
| Answer Semantic Similarity | ๋ต๋ณ๊ณผ ์ ๋ต์ ์๋ฏธ์ ์ ์ฌ๋ | Yes | ์๋ฏธ ๋ณด์กด ํ๊ฐ |
Context Precision ์์
\text{Context Precision@K} = \frac{\sum_{k=1}^{K} (\text{Precision@k} \times v_k)}{\text{์์ K๊ฐ ์ค ๊ด๋ จ ํญ๋ชฉ ์}}Context Recall ์์
\text{Context Recall} = \frac{|\text{์ปจํ ์คํธ์ ๊ท์ ๊ฐ๋ฅํ GT ์ฃผ์ฅ}|}{|\text{GT์ ์ด ์ฃผ์ฅ ์}|}๐ ์คํ ๋ฐ ๊ฒฐ๊ณผ
WikiEval ๋ฐ์ดํฐ์ ๊ตฌ์ถ
๊ธฐ์กด์ RAG ๋ฉํธ๋ฆญ๊ณผ ์ธ๊ฐ ํ๋จ์ ์๊ด๊ด๊ณ๋ฅผ ํ๊ฐํ ๊ณต๊ฐ ๋ฐ์ดํฐ์ ์ด ์์ด WikiEval ๋ฐ์ดํฐ์ ์ ์๋ก ๊ตฌ์ถํ์ต๋๋ค.
๋ฐ์ดํฐ์ ํน์ฑ
- 2022๋ ์ดํ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฃจ๋ 50๊ฐ Wikipedia ํ์ด์ง ์ ์
- ์ต๊ทผ ํธ์ง๋ ํ์ด์ง ์ฐ์ ์ ํ
- ๊ฐ ์ธ์คํด์ค๋ ๋ ๋ต๋ณ ๋๋ ๋ ์ปจํ ์คํธ ๋น๊ต (Pairwise Comparison)
์คํ ์ค๊ณ
- ๋ชจ๋ธ์ด ์ ํธํ๋ ๋ต๋ณ/์ปจํ ์คํธ์ ์ธ๊ฐ ํ๊ฐ์์ ์ ํ ์ผ์น ์ฌ๋ถ ์ธก์
- ์ ํ๋(Accuracy)๋ก ๊ฒฐ๊ณผ ๋ณด๊ณ
๋ฒ ์ด์ค๋ผ์ธ ๋น๊ต
| ๋ฐฉ๋ฒ | ์ค๋ช |
|---|---|
| GPT Score | ChatGPT์๊ฒ 0-10 ์ ์๋ฅผ ์ง์ ๋ถ์ฌํ๋๋ก ์์ฒญ |
| RAGAS | ๊ตฌ์กฐํ๋ ํ๊ฐ ํ๋ก์ธ์ค (์ฃผ์ฅ ์ถ์ถ, ๊ฒ์ฆ ๋ฑ) |
ํต์ฌ ์คํ ๊ฒฐ๊ณผ: ์ธ๊ฐ ํ๊ฐ์์ ์ผ์น์จ
| ๋ฉํธ๋ฆญ | ์ธ๊ฐ ์ผ์น์จ | ๋ถ์ |
|---|---|---|
| Faithfulness | 95% | ๊ฐ์ฅ ์ ๋ขฐํ ์ ์๋ ๋ฉํธ๋ฆญ, ํ๊ฐ ํ์ง์ ๋งค์ฐ ํจ๊ณผ์ |
| Answer Relevance | 78% | ๋ ๋ต๋ณ ๊ฐ ์ฐจ์ด๊ฐ ๋ฏธ๋ฌํ ๋ ํ๋ณ ์ด๋ ค์ |
| Context Relevance | 70% | ๊ฐ์ฅ ์ด๋ ค์ด ํ๊ฐ ์ฐจ์, ๊ธด ์ปจํ ์คํธ์์ ํต์ฌ ๋ฌธ์ฅ ์ ํ ์ด๋ ค์ |
์ฃผ์ ๋ฐ๊ฒฌ
- Faithfulness: RAGAS ์์ธก์ด ์ธ๊ฐ ํ๋จ๊ณผ ๋งค์ฐ ๋์ ์ผ์น๋ (95%)
- Answer Relevance: ๋ ํ๋ณด ๋ต๋ณ ์ฐจ์ด๊ฐ ๋ฏธ๋ฌํ ๊ฒฝ์ฐ ์ผ์น๋ ๋ค์ ๋ฎ์
- Context Relevance: ๊ธด ์ปจํ ์คํธ์์ ChatGPT๊ฐ ํต์ฌ ๋ฌธ์ฅ ์ ํ์ ์ด๋ ค์์ ๊ฒช์
๋ฐ์ดํฐ์ ๊ณต๊ฐ
- WikiEval: Hugging Face
๐ช ๊ฐ์ ๋ฐ ๊ธฐ์ฌ
ํ์ ์ ๊ธฐ์ฌ
- Reference-Free ํ๊ฐ ํจ๋ฌ๋ค์ ํ๋ฆฝ
- Ground Truth ์์ด RAG ํ๊ฐ ๊ฐ๋ฅ (Context Recall ์ ์ธ)
- ์ค๋ฌด ํ๊ฒฝ์์ ์ฆ์ ์ ์ฉ ๊ฐ๋ฅ
- RAG Triad ๊ฐ๋
๋ฐ์
- TruLens์ ๊ฐ๋ ์ ์ฒด๊ณํํ๊ณ ๊ฐ์
- ARES, DeepEval ๋ฑ ํ์ ์ฐ๊ตฌ์ ์ํฅ
- WikiEval ๋ฒค์น๋งํฌ ๊ณต๊ฐ
- RAG ํ๊ฐ ์ฐ๊ตฌ๋ฅผ ์ํ ์ฒซ ๊ณต๊ฐ ๋ฐ์ดํฐ์
์ค๋ฌด์ ๊ฐ์น
- ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ (Out-of-the-box)
pip install ragas๋ก ๋ฐ๋ก ์ค์นํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ- LangChain, LlamaIndex, Haystack ๋ฑ๊ณผ ์ฝ๊ฒ ํตํฉ
- ํ์ฅ์ฑ
- ๋๊ท๋ชจ ํ๊ฐ์ ์ ํฉ
- ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
- Langfuse, DataDog ๋ฑ Observability ๋๊ตฌ์ ํตํฉ
- Synthetic Data Generation
- ๋ฌธ์๋ก๋ถํฐ ์๋์ผ๋ก ํ ์คํธ ์ง๋ฌธ ์์ฑ ๊ฐ๋ฅ
- ๋ค์ํ ์ง๋ฌธ ์ ํ (simple, reasoning, multi_context) ์ง์
โ ๏ธ ํ๊ณ์ ๋ฐ ํฅํ ์ฐ๊ตฌ
ํ์ฌ ํ๊ณ์
- LLM ํ๊ฐ์ ์์กด์ฑ
- ํ๊ฐ ํ์ง์ด ์ฌ์ฉํ๋ LLM ์ฑ๋ฅ์ ์์กด
- LLM์ ํธํฅ์ด ํ๊ฐ์ ๋ฐ์๋ ์ ์์
- ๋๋ฉ์ธ ํนํ ํ๊ฐ์์ LLM Judge์ ์ ๋ฌธ ์ง์ ๋ถ์กฑ
- ๋น์ฉ ๋ฌธ์
- ๊ฐ ํ๋ก๋์ ํธ๋ ์ด์ค ํ๊ฐ์ LLM ํธ์ถ ํ์
- ๋๊ท๋ชจ ํธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น์ฉ ์ฆ๊ฐ
- Self-Evaluation Bias
- ๋์ผ ๋ชจ๋ธ๋ก ์์ฑ๊ณผ ํ๊ฐ ์ ํธํฅ ๋ฐ์ ๊ฐ๋ฅ
- ๋ค๋ฅธ ๋ชจ๋ธ ์ฌ์ฉ ๊ถ์ฅ
- Context Relevance์ ์๋์ ์ผ๋ก ๋ฎ์ ์ ํ๋ (70%)
- ๊ธด ์ปจํ ์คํธ์์ ํต์ฌ ๋ฌธ์ฅ ์ถ์ถ์ด ์ด๋ ค์
- ๊ฐ์ ์ฌ์ง ์์
- ๋ค๊ตญ์ด ์ง์ ์ ํ
- ์ฃผ๋ก ์์ด ์ค์ฌ์ผ๋ก ๊ฒ์ฆ๋จ
- ํ๊ตญ์ด ๋ฑ ๋ค๋ฅธ ์ธ์ด์ ๋ํ ์ถ๊ฐ ๊ฒ์ฆ ํ์
ํฅํ ์ฐ๊ตฌ ๋ฐฉํฅ
- ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ธฐ๋ฒ๊ณผ์ ๊ฒฐํฉ ํ๊ฐ (Lexical + Semantic)
- ๋๋ฉ์ธ ํนํ LLM์ ํ์ฉํ ํ๊ฐ ์ ํ๋ ํฅ์
- Deep Thinking ๋ชจ๋ธ (์: o1, DeepSeek-R1)๊ณผ์ ํตํฉ ํ๊ฐ
- ๋ค๊ตญ์ด ํ์ฅ ๋ฐ ๋ฒค์น๋งํฌ ๊ตฌ์ถ
- ํจ์จ์ ์ธ ํ๊ฐ ๋ฐฉ๋ฒ – ๋ ์๊ณ ๋น ๋ฅธ ํ๊ฐ ๋ชจ๋ธ ๊ฐ๋ฐ
๐ ๊ด๋ จ ๋ ผ๋ฌธ ๋ฐ ํ๋ ์์ํฌ
์ ํ ์ฐ๊ตฌ
| ๋ ผ๋ฌธ/ํ๋ ์์ํฌ | ๊ด๊ณ |
|---|---|
| TruLens | RAG Triad ๊ฐ๋ ์ ์์กฐ, RAGAS๊ฐ ์ด๋ฅผ ๋ฐ์ ์ํด |
| BERTScore | ํ ์คํธ ์ ์ฌ๋ ๊ธฐ๋ฐ ํ๊ฐ, RAGAS์ ์ํธ๋ณด์์ |
| BLEU/ROUGE | ์ ํต์ NLP ๋ฉํธ๋ฆญ, RAG์๋ ๋ถ์ ํฉ |
ํ์/์ ์ฌ ์ฐ๊ตฌ
| ๋ ผ๋ฌธ/ํ๋ ์์ํฌ | ํน์ง |
|---|---|
| ARES | RAGAS์ ์ ์ฌํ ์ ๊ทผ, Fine-tuned classifier judges ํ์ฉ |
| RAGChecker | ๋ ์ธ๋ฐํ ํ๊ฐ ํ๋ ์์ํฌ (NeurIPS 2024) |
| DeepEval | Pytest ์คํ์ผ, 14+ RAG ๋ฉํธ๋ฆญ, CI/CD ํตํฉ |
| Giskard | ๋ณด์ ๋ฐ ํธํฅ ํ ์คํธ ํฌํจ |
ํ๊ฐ ๋๊ตฌ ๋น๊ต (2025)
| ๋๊ตฌ | ํน์ง | GPT-4o ์ ํ๋ |
|---|---|---|
| RAGAS | Reference-free, ์คํ์์ค, ๊ฐํธํ ์ฌ์ฉ | ~100% |
| TruLens | LangChain/LlamaIndex ํตํฉ, ์ถ์ ๊ธฐ๋ฅ, Snowflake ์ง์ | 80%+ |
| Weights & Biases | MLOps ํตํฉ, ์คํ ์ถ์ | ~100% |
| DeepEval | ๋ค์ํ ๋ฉํธ๋ฆญ ํตํฉ | 80%+ |
๐ป ์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
์ค์น
# ๊ธฐ๋ณธ ์ค์น
pip install ragas
# ์ต์ ๊ฐ๋ฐ ๋ฒ์
pip install git+https://github.com/explodinggradients/ragas.git
# LangChain ํตํฉ ์
pip install ragas langchain-core langchain-openai
์๊ตฌ์ฌํญ: Python >= 3.9
๊ธฐ๋ณธ ์ฌ์ฉ ์์
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall
from datasets import Dataset
# ํ๊ฐ ๋ฐ์ดํฐ ์ค๋น
data = {
"question": ["ํ์ด์ฌ์ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ์?"],
"answer": ["ํ์ด์ฌ์ ๋ฌธ๋ฒ์ด ๊ฐ๊ฒฐํ๊ณ ๋ฐฐ์ฐ๊ธฐ ์ฌ์ฐ๋ฉฐ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค."],
"contexts": [["ํ์ด์ฌ์ 1991๋
๊ท๋ ๋ฐ ๋ก์ฌ์ด ๊ฐ๋ฐํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, "
"๊ฐ๊ฒฐํ ๋ฌธ๋ฒ๊ณผ ํ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ๊ฐ ํน์ง์
๋๋ค."]],
"ground_truth": ["ํ์ด์ฌ์ ๋ฌธ๋ฒ์ด ๊ฐ๊ฒฐํ๊ณ ํ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ฅ์ ์
๋๋ค."]
}
dataset = Dataset.from_dict(data)
# ํ๊ฐ ์คํ
result = evaluate(
dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall]
)
print(result)
# {'faithfulness': 0.95, 'answer_relevancy': 0.92,
# 'context_precision': 0.88, 'context_recall': 0.90}
๊ฐ๋ณ ๋ฉํธ๋ฆญ ๋น๋๊ธฐ ์ฌ์ฉ (v0.2+)
from ragas.metrics import Faithfulness
from ragas.llms import llm_factory
from openai import AsyncOpenAI
# LLM ์ค์
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
# Faithfulness ํ๊ฐ
scorer = Faithfulness(llm=llm)
result = await scorer.ascore(
user_input="์ํ ํ์ ์ธ์ ์๊ณต๋์๋์?",
response="์ํ ํ์ 1889๋
์ ์๊ณต๋์์ต๋๋ค.",
retrieved_contexts=[
"์ํ ํ์ 1889๋
ํ๋ฆฌ ๋ง๊ตญ๋ฐ๋ํ๋ฅผ ์ํด ๊ฑด์ค๋์๋ค."
]
)
print(f"Faithfulness Score: {result.value}") # 1.0
Context Precision Without Reference
from ragas import SingleTurnSample
from ragas.metrics import LLMContextPrecisionWithoutReference
# Reference ์์ด Context Precision ํ๊ฐ
context_precision = LLMContextPrecisionWithoutReference(llm=evaluator_llm)
sample = SingleTurnSample(
user_input="์ํ ํ์ ์ด๋์ ์๋์?",
response="์ํ ํ์ ํ๋ฆฌ์ ์์ต๋๋ค.",
retrieved_contexts=["์ํ ํ์ ํ๋ฆฌ์ ์์นํด ์์ต๋๋ค."],
)
score = await context_precision.single_turn_ascore(sample)
Self-Evaluation Bias ๋ฐฉ์ง
# ์์ฑ์ ์ฌ์ฉํ ๋ชจ๋ธ๊ณผ ๋ค๋ฅธ ๋ชจ๋ธ๋ก ํ๊ฐ
# ์: GPT-4๋ก ์์ฑ, Claude๋ก ํ๊ฐ
from ragas.llms import llm_factory
# ํ๊ฐ์ฉ LLM ๋ณ๋ ์ค์
evaluator_llm = llm_factory("claude-3-5-sonnet-20241022", provider="anthropic")
result = evaluate(
dataset,
metrics=metrics,
llm=evaluator_llm # ์์ฑ ๋ชจ๋ธ๊ณผ ๋ค๋ฅธ ๋ชจ๋ธ ์ฌ์ฉ
)
Synthetic Test Data ์์ฑ
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
# ๋ฌธ์๋ก๋ถํฐ ํ
์คํธ์
์๋ ์์ฑ
generator = TestsetGenerator.from_langchain(
generator_llm=generator_llm,
critic_llm=critic_llm,
embeddings=embeddings,
)
testset = generator.generate_with_langchain_docs(
documents,
test_size=10,
distributions={
simple: 0.5, # ๋จ์ ์ง๋ฌธ
reasoning: 0.25, # ์ถ๋ก ํ์
multi_context: 0.25 # ์ฌ๋ฌ ์ปจํ
์คํธ ํ์
}
)
๋ชจ๋ํฐ๋ง ํตํฉ (Langfuse ์์)
from langfuse import Langfuse
from ragas.integrations.langfuse import RagasCallbackHandler
# Langfuse ํด๋ผ์ด์ธํธ ์ค์
langfuse = Langfuse()
# RAGAS ์ฝ๋ฐฑ ํธ๋ค๋ฌ
handler = RagasCallbackHandler(langfuse)
# ํ๊ฐ ์คํ ๋ฐ ๊ฒฐ๊ณผ ์๋ ๊ธฐ๋ก
result = evaluate(dataset, metrics=metrics, callbacks=[handler])
ํ๊ฐ ์ ์ ํด์ ๊ฐ์ด๋
| ์ ์ ๋ฒ์ | ํด์ | ๊ถ์ฅ ์กฐ์น |
|---|---|---|
| 0.9 – 1.0 | ์ฐ์ | ํ์ ์ ์ง |
| 0.8 – 0.9 | ์ํธ | ๋ฏธ์ธ ์กฐ์ ๊ณ ๋ ค |
| 0.7 – 0.8 | ๊ฐ์ ํ์ | ํ๋กฌํํธ/๊ฒ์ ์ต์ ํ |
| < 0.7 | ์ฌ๊ฐํ ๋ฌธ์ | ๊ทผ๋ณธ์ ์ธ ์ฌ์ค๊ณ ํ์ |
๋ฌธ์ ์ง๋จ ๋ฐ ํด๊ฒฐ ๊ฐ์ด๋
| ๋ฎ์ ๋ฉํธ๋ฆญ | ์์ธ | ํด๊ฒฐ์ฑ |
|---|---|---|
| Faithfulness | LLM ํ ๋ฃจ์๋ค์ด์ | ํ๋กฌํํธ์ “์ค์ง ์ ๊ณต๋ ์ ๋ณด๋ง ์ฌ์ฉ” ์ง์ ์ถ๊ฐ |
| Context Relevance | ๊ฒ์ ํ์ง ์ ํ | ์ฒญํน ์ ๋ต, ์๋ฒ ๋ฉ ๋ชจ๋ธ, ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ |
| Answer Relevance | ๋ต๋ณ์ด ์ง๋ฌธ๊ณผ ๋๋จ์ด์ง | ํ๋กฌํํธ๋ฅผ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์์ |
| Context Precision | ๊ด๋ จ ์๋ ์ฒญํฌ๊ฐ ์์ ๋ญํฌ | Reranker ๋์ , ๊ฒ์ ํ๋ผ๋ฏธํฐ ์กฐ์ |
| Context Recall | ํ์ํ ์ ๋ณด ๋๋ฝ | Top-K ์ฆ๊ฐ, ๊ฒ์ ์ ๋ต ๋ค์ํ |
Privacy ์ค์
# ์ต๋ช
์ฌ์ฉ ๋ฐ์ดํฐ ์์ง ๋นํ์ฑํ
export RAGAS_DO_NOT_TRACK=true
๐ท๏ธ Tags
#RAG #Evaluation #RAGAS #LLM #Faithfulness #AnswerRelevance #ContextRelevance #ReferenceFree #LLMasJudge #Retrieval #Generation #NLP #MachineLearning #AIEvaluation #ExplodingGradients #CardiffNLP #EACL2024 #WikiEval #HallucinationDetection #RAGTriad