"Die RAG-Pipeline funktioniert" ist keine ausreichende Aussage. Ohne systematische Evaluation wissen Sie nicht, ob Ihre Pipeline halluziniert, irrelevante Kontexte nutzt oder richtige Antworten liefert. RAG-Evaluation ist komplex — aber unverzichtbar.
| Metrik | Was wird gemessen? | Frage |
|---|---|---|
| Faithfulness | Ist die Antwort treu zum Kontext? | Erfindet die Antwort Informationen? |
| Answer Relevance | Beantwortet die Antwort die Frage? | Ist die Antwort nützlich? |
| Context Precision | Sind die abgerufenen Kontexte relevant? | Wird Rauschen minimiert? |
| Context Recall | Wurden alle nötigen Kontexte gefunden? | Fehlen wichtige Informationen? |
Frage ──▶ Retriever ──▶ Kontext ──▶ LLM ──▶ Antwort
│ │ │
│ Context Precision ◀─┘ │
│ Context Recall ◀────┘ │
│ │
│ Answer Relevance ◀───────────────────────┘
│ Faithfulness ◀────── Kontext + Antwort ──┘
RAGAS (Retrieval Augmented Generation Assessment) ist das Standard-Framework für RAG-Evaluation:
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_precision,
context_recall
)
# Test-Dataset
eval_dataset = {
"question": ["Was ist DSGVO?", "Wie berechnet man ROI?"],
"answer": [generated_answer_1, generated_answer_2],
"contexts": [retrieved_contexts_1, retrieved_contexts_2],
"ground_truth": ["Die DSGVO ist...", "ROI = ..."]
}
results = evaluate(
dataset=eval_dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall]
)
print(results)
# {'faithfulness': 0.87, 'answer_relevancy': 0.92, ...}
Ein Golden Dataset enthält Fragen mit erwarteten Antworten und relevanten Kontexten:
golden_dataset = [
{
"question": "Welche Kündigungsfrist gilt in der Probezeit?",
"expected_answer": "2 Wochen",
"expected_sources": ["hr/arbeitsvertrag.pdf#page=4"],
"category": "hr"
},
# ... mindestens 50-100 Einträge
]
def test_rag_pipeline():
results = []
for item in golden_dataset:
answer = rag_pipeline.invoke(item["question"])
results.append({
"question": item["question"],
"expected": item["expected_answer"],
"actual": answer,
"faithfulness": evaluate_faithfulness(answer, retrieved_context),
"relevance": evaluate_relevance(answer, item["question"])
})
avg_faithfulness = mean([r["faithfulness"] for r in results])
avg_relevance = mean([r["relevance"] for r in results])
assert avg_faithfulness > 0.85, f"Faithfulness zu niedrig: {avg_faithfulness}"
assert avg_relevance > 0.80, f"Relevance zu niedrig: {avg_relevance}"
Ein LLM bewertet die Qualität der RAG-Antworten:
judge_prompt = """
Bewerte die folgende Antwort auf einer Skala von 1-5:
Frage: {question}
Kontext: {context}
Antwort: {answer}
Kriterien:
- Korrektheit (1-5): Stimmt die Antwort mit dem Kontext überein?
- Vollständigkeit (1-5): Werden alle relevanten Aspekte abgedeckt?
- Klarheit (1-5): Ist die Antwort verständlich formuliert?
Gib eine JSON-Bewertung zurück.
"""
Praxis-Tipp: Erstellen Sie ein Golden Dataset mit mindestens 50 Fragen aus Ihrem realen Use Case. Führen Sie Evaluationen nach jeder Änderung an der Pipeline durch (Prompts, Chunk-Size, Modell). Automatisierte Evaluation ist Ihr Sicherheitsnetz gegen Regressionen.