[!NOTE] Automatische Übersetzung Dieser Artikel wurde automatisch aus der englischen Originalversion übersetzt.

Bewertung von RAG: Metriken für jede Phase eines produktiven RAG-Systems

Teil 1 der Produktionsreihe RAG

Ein RAG-System mit fehlerhaften Filtern kann monatelang ohne Auslösung eines Betriebsalarms weiterlaufen. Es liefert weiterhin Antworten und erfüllt sein Latency-Ziel, doch diese Antworten stützen sich auf unvollständige Belege. Ein Recall@k gegen den ursprünglichen Gold-Set macht diesen Verlust sichtbar; Latency- sowie Verfügbarkeits-Dashboards hingegen nicht.

Die Bewertung kann einen Fehler nur dann erkennen, wenn jede Pipeline-Phase über eigene Metriken verfügt. In diesem Artikel werden gängige Fehlermuster diesen Metriken zugeordnet – von der Dokumentanalyse bis hin zur Überwachung im Produktivbetrieb.

!!! Tipp „Möchten Sie direkt zum Code springen und ihn ausführen?“

Der ausführbare Code [`slavadubrov/rag-evals-demo`](https://github.com/slavadubrov/rag-evals-demo) Der Repository wendet die Metriken auf SciFact an. `make eval` führt das Suite aus und `make benchmark` Es werden die Konfigurationen von Chunking, Embedding und LLM verglichen. Die Notebooks 00–09 isolieren jeweils eine Metrik. Da die Demo ein eingebettetes Qdrant verwendet, ist kein Docker erforderlich.

Zusammenfassung

Die Abschnitte folgen der Reihenfolge von Pipeline. Beginnen Sie mit der Entscheidungstabelle und nutzen Sie die nachfolgenden Abschnitte anschließend als Referenz für jede Phase.


RAG-Bewertungsbeschluss-Tabelle

Verwenden Sie diese Tabelle als Ausgangspunkt, bevor Sie einen Framework auswählen. Die geeignete Metrik hängt vom zu erfassenden Fehlermodus ab und nicht vom Namen des Tools.

FrageMetrikfamilieVerwenden Sie dies, wennAchten Sie auf
Wurde die Quelldatei durch das Parsen unverändert beibehalten?Vollständigkeit der Extraktion, Abdeckung von Tabellen/AbbildungenPDFs, Präsentationsdiapositive, Scans sowie HTML-Seiten werden in das Korpus aufgenommen.Auch bei ansprechend gestaltetem Text können Untertitel, Fußnoten oder die Tabellenaufbaustruktur fehlen.
Hat Retrieval den richtigen Beweis gefunden?Recall@k, nDCG@k, MRR, Präzision/Recall im KontextSie können relevante Abschnitte oder Dokumente kennzeichnen.Ein strenger Metadatenfilter kann das richtige Dokument bereits vor Beginn der Rangliste entfernen.
Hat Reranking die Shortlist verbessert?Reranking-Verbesserung, Precision@1, nDCG-DeltaCross-Encoder oder LLM-Ranker befinden sich nach den Retrieval.Messen Sie Latency sowie die Kosten im Zusammenhang mit dem erzielten Qualitätszuwachs.
Hat die Antwort auf die Belege zurückgegriffen?Treue, Fundiertheit, Unterstützung bei der ZitierungDie Antwort verweist auf Dokumente oder bezieht sich auf Fakten aus dem Kontext.Die Treue des Modells kann keine fehlerhafte Parsing-Logik oder fehlerhafte Retrieval diagnostizieren.
Ist das System in der Produktion stabil?Drift, Regeneration, Fallback, p95 Latency, Kosten pro AntwortÄnderungen im Datenverkehr nach dem StartDie Telemetriedaten aus der Produktion benötigen eine gezielte menschliche Überprüfung, um stets kalibriert zu bleiben.

Für einen kürzeren Vergleich der Tools siehe Die besten Bewertungstools und Metriken für RAG im Jahr 2026.

Teil 1: Erfolg definieren, bevor die Architektur entworfen wird

Entwerfen Sie den Eval-Set vor dem Architekturdiagramm. Dadurch erhält jede spätere Komponentenauswahl ein messbares Ziel.

Man kann nicht einfach zwischen BM25 und dichten Retrieval-Modellen, rekursiven und semantischen Chunking-Ansätzen oder Cohere Rerank sowie BGE wählen, solange man nicht genau weiß, was optimiert werden soll. „Bessere Antworten“ ist keine messbare Kennzahl. Ein geeignetes Leistungsprofil sieht beispielsweise so aus: „Treuegrad ≥ 0,85 auf einer Testmengen von 200 Abfragen, die unsere drei wichtigsten Intentionen abdecken, wobei die p95 Latency-Wert unter 1,5 Sekunden liegt und die Rate falscher Ausklusionen unter 2 % beträgt.“ Die genannten Zahlen dienen lediglich als Platzhalter; entscheidend sind vielmehr klare Kriterien für Qualität, Abdeckung, Latency-Funktionen sowie das Filtern von Ergebnissen.

Definieren Sie den Harness vor dem Schreiben des Retrieval-Codes. Der erste Harness wird fehlerhaft sein, und Sie müssen ihn korrigieren. Die Anpassung einer Metrik ist weitaus kostengünstiger als die Überarbeitung eines bereits veröffentlichten Systems.

Drei Pipeline Schichten und zwei Betriebsmodi

Moderne RAG sind Pipeline, weshalb die Bewertung als Pipeline erfolgen muss. Keine einzige Zahl kann alle möglichen Fehlerfälle abdecken.

Die Produktivitätsbewertung umfasst drei Pipeline-Ebenen. Bei der Evaluierung der Dateneingabe wird geprüft, ob das Korpus sowie der Index die ursprünglichen Inhalte erhalten haben. Bei der Evaluierung zum Zeitpunkt der Abfrage wird überprüft, ob durch Umformulieren, Filtern, Retrieval, Reranking sowie Zusammenführung des Kontexts die richtigen Belege gefunden wurden. Schließlich prüft die Evaluierung der Antwort und der Produktivität, ob die Antwort tatsächlich auf diesen Belegen beruht und ob die Qualität unter echtem Nutzerverkehr gewährleistet bleibt. Wenn diese Ebenen zu einem einzigen Score zusammengefasst werden, kann ein Fehler bei der Normalisierung innerhalb eines akzeptablen Antwortwerts verborgen bleiben.

Die drei Situationen, in denen ein RAG-System Beweismittel verlieren kann

Diese Schichten beschreiben, an welcher Stelle ein Fehler auftritt. Offline und online geben an, zu welchem Zeitpunkt und mit welchen Daten die Überprüfung durchgeführt wird. Bei der Offline-Bewertung wird eine feste Dataset unter Verwendung bekannter Referenzwerte verwendet; sie ist reproduzierbar und eignet sich für die Auswahl von Komponenten, A/B-Vergleiche sowie CI-Gates. Die Online-Bewertung bewertet Samples aus dem Live-Traffic und erfasst Aspekte wie Regeneration, Verweildauer, explizite Rückmeldungen sowie tatsächliche Abweichungen der Anfragen. Sie weist mehr Rauschen auf und ist schwieriger zu instrumentieren.

Jede Pipeline Schicht kann sowohl Offline- als auch Online-Prüfungen durchführen. Ein fest definiertes Eingabekorpus erkennt Regressionen des Parsers bereits vor der Veröffentlichung, während Monitore für Aktualität und Parse-Fehler die Live-Updates überwachen. Eine feste Abfragesammlung dient dazu, Retrieval vor der Veröffentlichung zu messen, wohingegen stichprobenartige Live-Traces-Abfragen Abweichungen im Produktivumfeld aufdecken. Prüfungen ausschließlich im Offline-Modus übersehen Änderungen in Echtzeit; Prüfungen ausschließlich im Online-Modus erschweren es zudem, Regressionen nachzuvollziehen.

Komponentenebene versus End-zu-Ende

Es gibt zwei häufige Fehlerquellen. Eine Bewertung ausschließlich im End-to-End-Modus zeigt zwar an, dass das System fehlerhaft ist, nicht jedoch wo genau. Eine Bewertung nur der einzelnen Komponenten kann hingegen darauf hinweisen, dass alle Teile erfolgreich sind, obwohl das Gesamtsystem weiterhin versagt. Die Lösung besteht darin, einige zentrale End-to-End-Metriken zur Entscheidungsfindung über Erfolg oder Misserfolg zu verwenden und zusätzlich Komponentenmetriken für die Diagnose. Retrieval-Metriken erkennen Regressionen beim Retrieval-Modul, Generierungsmetriken erkennen Regressionen beim Generierungsmodul und die End-to-End-Korrektheit der Antworten zeigt Integrationsfehler auf.

Der Referenzweg Frameworks (vorgefertigter Tourplan)

FrameworkAm besten geeignet fürWo es versagt
RAGASReferenzlose RAG-Metriken (Treue, Relevanz der Antwort, Präzision/Zurückholrate im Kontext); das de facto-WortschatzverzeichnisLLM-Judge Kosten; unklare Komponenten der Bewertungskriterien bei der Fehlersuche; englischzentrierte Standardwerte
ARESEin trainierter Klassifikator Judges gemäß Pipeline; weniger Annotierungen im Vergleich zu Ansätzen im RAGAS-Stil; hohe Genauigkeit bei ähnlichen SystemenAufwändigere Konfiguration – man muss tatsächlich Models trainieren.
TruLensKomponierbare Rückkopplungsfunktionen mit hoher Erklärbarkeit; OpenTelemetry Traces; für die Produktion geeignetIn den spezifischen Metriken für RAG sind weniger Batterien enthalten als bei RAGAS.
DeepEvalPytest-basierte Unit-Tests für die Ausgaben von LLM; G-Eval, benutzerdefinierte Metriken sowie Lösungen, die direkt in CI/CD-Pipelines integrierbar sind.Hohe Nutzung von LLM-Judge führt zu starken Kostenanstiegen
Arize PhoenixStarke Visualisierung von Tracing und Embedding; visuelle Erkennung von Embedding-Abweichungen; OTEL-eigene LösungSie bringen Ihre eigenen Definitionen für die Metriken mit.
TREC 2024 RAG-TrackÖffentliche Benchmark-Ressource zur Bewertung von Nuggets (AutoNuggetizer), zur Unterstützung der Evaluierung sowie zur Messung der Flüssigkeit in MS MARCO Segment v2.1Kein Runtime-Tool, sondern ein Benchmark zur Kalibrierung dagegen

Mein Standard-Stack umfasst RAGAS für das Metrik-Wortschatz, DeepEval für CI-Gates, Phoenix für die Produktion Tracing sowie eigene Codebausteine für metrikenspezifische Anforderungen innerhalb der Ontologie. Jede Lösung, mit der man beginnt, wird irgendwann zu eng für die wachsenden Anforderungen. Wählen Sie daher den Framework, der die Erstellung von benutzerdefinierten Metriken erleichtert.

Für Benchmarks sollte man verwenden BEIR (Laut Thakur et al., NeurIPS 2021) für die zero-shot Retrieval-Generalisierung. MTEB für eine allgemeine Embedding-Qualität. MIRACL für mehrsprachige Retrieval-Systeme sowie die TREC 2024 RAG Spur zur end-to-end RAG-Bewertung.


Teil 2: Bewertungspunkte auf den Pipeline abbilden

Ein Produktivsystem RAG umfasst weitaus mehr als nur das Einbetten von Dokumenten, das Abrufen von Teilstücken sowie den Aufruf eines LLM. Jede Stufe zwischen der Dokumentenerfassung und der Bereitstellung der Antwort kann fehlschlagen.

Der vollständige RAG Pipeline inklusive Metrik-Anzeigen in jeder Phase

Jede Stufe im Diagramm verfügt über mindestens eine Metrik. Eine Stufe ohne Metrik kann fehlschlagen, ohne dass es jemand bemerkt.

Die drei Kanäle entsprechen den Bereichen, in denen Beweismittel verloren gehen können. Der Eingabekanal umfasst die Parsing-, Reinigungs-, Chunking-, Embedding- sowie Indexierungsprozesse. Der Kanal zur Abfragenzeit beinhaltet das Umformulieren, Filtern, Retrieval-, Reranking- sowie die Zusammenstellung des Kontexts. Der Kanal für Antworten und die Produktion kümmert sich um die Genauigkeit der Ergebnisse, die Überprüfung von Quellenangaben, Benutzersignale, Drift-Effekte, Latency sowie die Kosten.

Fehler kumulieren sich entlang der Verarbeitungskette. Eine fehlerhafte Parsing-Logik beschränkt Chunking. Fehlende Chunking begrenzen wiederum Retrieval. Mangelhafte Retrieval beeinträchtigen schließlich Reranking. Fehlerhafte Reranking hemmen zudem die Generierung von Ergebnissen. Die Treueprüfung misst lediglich das endgültige Ergebnis und nicht die ursprünglichen Auslöser.


Teil 3: Bewertung der Dateneingangsprozesse

Viele Fehlfälle bei RAG in der Produktion beginnen bereits in der Eingabephase. Das System funktioniert mit sauberen Testdokumenten einwandfrei, scheitert jedoch bei echten PDF-Dateien, Scans, Tabellen sowie unstrukturierten Seiten aus großen Datensätzen.

Dokumentbeschaffung und Parsing

Was gemessen werden sollte:

Vergleichen Sie verschiedene Parser-Familien – beispielsweise eine Tesseract-Baseline, einen auf VLM basierenden OCR Model sowie Ihren eigenen Kandidaten von einem Drittanbieter. Verwenden Sie dazu eine stratifizierte Stichprobe aus echten Dokumentenklassen bei einer festen DPI, wobei saubere Scans, Fotos, Tabellen, mehrsprachiger Text, Mathematikformeln und Handschrift berücksichtigt werden sollen. Berichten Sie den CER bzw. WER für jede Klasse sowie den TEDS für Seiten mit Tabellen.

Reinigung und Normalisierung

Chunking steuert die Qualität von Retrieval

Chunking kann selbst dann eine Mehrpunkte-Rückruflücke verursachen, wenn der Embedding Model konstant bleibt. In NVIDIAs Anbieter für das Jahr 2024 Benchmark, Die auf Seiteebene erfolgende Chunking-Verarbeitung erzielte bei paginierten Dokumenten die höchste Genauigkeit sowie die geringste Varianz. Dieses Ergebnis sollte als Beleg für den getesteten Datensatz betrachtet werden und nicht als allgemeingültiger Sieger angesehen werden.

Semantische Chunking-Gruppen ordnen benachbarte Sätze aufgrund von Embedding-Ähnlichkeit zusammen und trennen sie an unähnlichen Grenzen. LangChain’s SemanticChunker und der von LlamaIndex SemanticSplitterNodeParser Implementieren Sie diese Strategie. Sie kann die Recall-Rate bei festen Zeitfenstern verbessern, insbesondere dann, wenn thematische Grenzen eine entscheidende Rolle spielen.

Die rekursive Zeichensegmentierung versucht zunächst Absatztrennungen, anschließend Satzzeichen und danach Worttrennungen, bis jedes Segment die gewünschte Größe erreicht. LangChain’s RecursiveCharacterTextSplitter führt die Sequenz aus. Wählen Sie geeignete Fenster- und Überlappungswerte, die zur Struktur Ihres Dokuments passen, und überlassen Sie anschließend der „goldenen Menge“, die endgültigen Werte zu bestimmen.

Zu überwachende Metriken:

Meine Meinung: strukturelle Chunking Gliederung (Aufteilung nach Überschriften, Tabellen und Abschnitten – umgesetzt durch Parser wie unstructured.io oder durch das Durchlaufen des bereits von Ihrem Parser erzeugten ASTs) wird zu wenig genutzt. Wenn Ihre Dokumente eine Struktur aufweisen, sollten Sie diese zunächst nutzen, bevor Sie Ähnlichkeitsheuristiken anwenden. Die rekursive Zeichensegmentierung stellt die Grundlage dar; semantische Chunking-Verarbeitung lohnt sich hauptsächlich bei unstrukturiertem Prosa-Text.

Extraktion und Erweiterung von Metadaten

Embedding-Generierung

Indexerstellung


Teil 4: Bewertung zur Abfrageszeit

Der Abfragedauer-Bereich enthält die Metriken, mit denen ein Pfad von Retrieval diagnostiziert werden kann. Allein der Recall@k liefert keine Informationen darüber, ob das Versagen durch Umformulierung, Filtern, Reranking oder Kontextzusammenstellung verursacht wurde.

Abfragedurchsicht und -umformulierung

Retrieval-Metriken

Dies sind die Basismetriken. Wenn Sie diese nicht überwachen, können Sie nicht feststellen, ob sich Retrieval verbessert.

MetrikWas gemessen wirdWann anzuwenden ist
Recall@kder Anteil der relevanten Dokumente einer Abfrage, die in den ersten k Ergebnissen zurückgegeben werdenVerwenden, wenn das Fehlen eines Teils des jeweiligen Satzes von Bedeutung ist.
Precision@kProzentualer Anteil der relevanten Elemente aus dem Top-K-Setnützlich, wenn Context Window ein Bottleneck ist
MRRDurchschnitt des 1/Rank-Werts des ersten relevanten Dokumentswenn die Benutzer nur die Top-1- oder Top-3-Ergebnisse betrachten
nDCG@kgewichteter Gewinn unter Berücksichtigung der Positionen und Relevanzgradeder Standard-Metrik für bewertete Relevanz Retrieval
MAPDurchschnittliche Präzision über alle Abfragen hinwegwenn man sich um die gesamte sortierte Liste kümmert
Trefferquote@kob mindestens ein relevanter Dokument in den oberen k Dokumenten vorhanden istDer binäre Ergebniswert wird über alle Abfragen gewichtet, um einen schnellen Überprüfungsindikator zu erzeugen.
AbdeckungProzentualer Anteil der jemals über alle Abfragen abgerufenen „goldenen“ Dokumenteerkennt systematische Lücken im Index

Die Formeln zur Referenz (binäre Relevanz mit dem relevanten Mengensatz RqR_q für die Abfrage qq, wobei reli=1\text{rel}_i = 1 gilt, wenn das ii-te abgerufene Dokument zu RqR_q gehört):

Recall@k=Rqd1,,dkRq,Precision@k=Anzahl korrekter VorhersagenAnzahl aller generierten VorhersagenRqd1,,dkk\text{Recall@k} = \frac{|R_q ∩ {d_1, …, d_k}|}{|R_q|}, \quad \text{Precision@k} = \frac{\text{Anzahl korrekter Vorhersagen}}{\text{Anzahl aller generierten Vorhersagen}}|R_q ∩ {d_1, …, d_k}|{k} RRq=1Rang des ersten relevanten Dokuments,MRR=1QqQRRq\text{RR}_q = \frac{1}{\text{Rang des ersten relevanten Dokuments}}, \quad \text{MRR} = \frac{1}{|Q|} \sum_{q \in Q} \text{RR}_q DCG@k=i=1k2reli1log2(i+1),nDCG@k=DCG@kIDCG@k\text{DCG@k} = \sum_{i=1}^{k} \frac{2^{\text{rel}_i} - 1}{\log_2(i + 1)}, \quad \text{nDCG@k} = \frac{\text{DCG@k}}{\text{IDCG@k}}

Für die graduierte Relevanz gilt reli{0,1,2,}\text{rel}_i \in \{0, 1, 2, \dots\}; der binäre nDCG ist der spezielle Fall, der im untenstehenden Code verwendet wird. MAP ist der Mittelwert über alle Abfragen von APq=1Rqi:reli=1Precision@i\text{AP}_q = \frac{1}{|R_q|}\sum_{i: \text{rel}_i = 1} \text{Precision@}i. Siehe Manning, Raghavan, Schütze, Einführung in die Informationsbeschaffung, Kapitel 8: Herleitungen.

Für Produktionscode sollte man … verwenden. ranx, pytrec_eval, oder ir_measures — Sie implementieren die gesamte TREC-Metrikfamilie und bewältigen die Berechnung der graduierten Relevanz korrekt. Legen Sie die Freigabeziele anhand eines realistischen Referenzdatensatzes, der Qualität der Ergebnisse im Nachgang sowie des Kostenfaktors bei Fehlern fest. Übernehmen Sie keine Schwellenwerte aus Schulungsmaterialien.

Der Test für Harness ist in diesem Fall kurz. Er kann bereits aus einer Notebook-Umgebung ausgeführt werden, noch bevor ein Vector Database ausgewählt wurde.

from math import log2
from statistics import mean

# synthetic gold set: query_id -> set of relevant doc ids
gold = {
    "q1": {"d3"},
    "q2": {"d7", "d2"},
    "q3": {"d11"},
    "q4": {"d5"},
}

# ranked retrieval results: query_id -> ranked list of doc ids (top-10)
runs = {
    "q1": ["d8", "d3", "d1", "d4", "d2", "d9", "d6", "d10", "d12", "d13"],
    "q2": ["d2", "d6", "d4", "d7", "d1", "d3", "d8", "d11", "d5", "d9"],
    "q3": ["d11", "d2", "d3", "d4", "d1", "d6", "d7", "d8", "d10", "d12"],
    "q4": ["d1", "d2", "d3", "d6", "d8", "d9", "d10", "d12", "d13", "d14"],
}

def recall_at_k(ranked, gold_set, k):
    if not gold_set:
        return 0.0
    hit = sum(1 for d in ranked[:k] if d in gold_set)
    return hit / len(gold_set)

def reciprocal_rank(ranked, gold_set):
    # MRR contribution per query: 1/rank of the first relevant doc.
    for rank, d in enumerate(ranked, start=1):
        if d in gold_set:
            return 1.0 / rank
    return 0.0

def ndcg_at_k(ranked, gold_set, k):
    # binary relevance: rel ∈ {0, 1}
    gains = [1.0 if d in gold_set else 0.0 for d in ranked[:k]]
    dcg = sum(g / log2(i + 2) for i, g in enumerate(gains))
    # ideal DCG: all gold docs ranked first, capped by k
    n_gold_in_topk = min(k, len(gold_set))
    idcg = sum(1.0 / log2(i + 2) for i in range(n_gold_in_topk))
    return dcg / idcg if idcg else 0.0

K = 5
print(f"Recall@{K}: {mean(recall_at_k(runs[q], gold[q], K) for q in gold):.3f}")
print(f"MRR:       {mean(reciprocal_rank(runs[q], gold[q]) for q in gold):.3f}")
print(f"nDCG@{K}:  {mean(ndcg_at_k(runs[q], gold[q], K) for q in gold):.3f}")
# Recall@5: 0.750
# MRR:       0.625
# nDCG@5:    0.627

Das ist Ihre Retrieval CI-Gate. Verbinden Sie es mit einem auf Code-Coverage basierenden, schnellen Testumfang bei jedem Pull Request und führen Sie den vollständigen Testumfang auf der langsameren Release-Gate-Ausführung durch. Verhindern Sie eine Fusion, wenn eine im Voraus definierte Metrik ihren Regressionsbudget überschreitet.

Der begleitende Repository fixiert die genannten Werte exakt.Recall@5 = 0.750, MRR = 0.625, nDCG@5 = 0.627) als Unit-Test in tests/test_retrieval_metrics.py; Notizbuch 01 führt Recall@k / MRR / nDCG-Berechnungen anhand eines echten SciFact-Index durch, und die für die Produktion optimierte Harness-Implementierung befindet sich in evaluation/retrieval.py.

Hybride Fusion von Retrieval-Ranking und gegenseitigem Ranking

BM25 ist ein spärlicher lexikalischer Scorer, der die exakte Termeinstimmung, die Termwichtung sowie die Längennormalisierung kombiniert. Er ist verfügbar in rank_bm25Elasticsearch, OpenSearch sowie die meisten Suchmaschinen.

Reciproke Rangfusionsmethode (Cormack, Clarke und Buettcher, SIGIR 2009) kombiniert BM25 mit dichten Ranglisten nach Position. Die ursprüngliche k=60 Die Einstellung stellt eine nützliche Grundlage dar. RRF ist skorunabhängig, wodurch die für die lineare Interpolation erforderliche Normalisierung über verschiedene Kategorien vermieden wird. Bei einem ausreichend großen, gelabelten Datensatz, der es ermöglicht, einen stabilen Delta-Wert zu schätzen, sollte zudem eine konvexe Kombination getestet sowie der Parameter α abgestimmt werden.

Ein Hybrid aus Retrieval und einem Cross-Encoder-Reranker verbessert in der Regel technische, protokollbasierte sowie Code-Korpora. Bei stark semantisch strukturierten Korpora kann der Nutzen jedoch gering ausfallen. Es sollte mit den Ansätzen verglichen werden, die ausschließlich dichte oder ausschließlich spärliche Daten verwenden, da eine ungeeignete Fusionskonfiguration die Leistung beider Eingangsformate verschlechtern kann.

Die Implementierung passt in wenige Zeilen.

from collections import defaultdict

# two retrieval lanes: dense embeddings and BM25.
dense  = ["d3", "d7", "d1", "d4", "d2", "d9", "d10"]
sparse = ["d2", "d3", "d8", "d1", "d11", "d4", "d6"]

def rrf(rankings: list[list[str]], k: int = 60) -> list[tuple[str, float]]:
    """Reciprocal Rank Fusion (Cormack et al., SIGIR 2009).

    score(d) = sum over rankings of 1 / (k + rank(d))
    Score-agnostic: only rank position matters. k=60 is the canonical default.
    """
    scores: dict[str, float] = defaultdict(float)
    for ranking in rankings:
        for rank, doc in enumerate(ranking, start=1):
            scores[doc] += 1.0 / (k + rank)
    return sorted(scores.items(), key=lambda kv: kv[1], reverse=True)

fused = rrf([dense, sparse], k=60)
for doc, score in fused[:5]:
    print(f"{doc}  score={score:.5f}")
# d3  score=0.03252   <- rank 1 dense, rank 2 sparse
# d2  score=0.03178   <- rank 5 dense, rank 1 sparse
# d1  score=0.03150

Beachten Sie, was RRF nicht tut: Es betrachtet niemals die rohen Similaritätswerte. Ein dichter Retriever, der einen Kosinuswert von 0,98 liefert, und ein BM25-Algorithmus mit einem Score von 17,4 sind nicht direkt vergleichbar. Wenn man diese Werte mit Z-Scores oder Min-Max-Skalierung normalisiert, kann es dazu kommen, dass der Algorithmus den Datensatz bevorzugt, bei dem die Varianz am höchsten ist.

RRF verwendet ausschließlich die Rangfolge. Wenn ein Retriever ein Dokument auf Position 2 platziert, ist dieser Wert gleichbedeutend mit einem Stimmenwert von 1 / (60 + 2)unabhängig von der Rohwertzahl, die ihn erzeugt hat.

Hybrid-Modell mit RRF in SciFact: Notizbuch 02 vergleicht Dense, BM25 und RRF anhand von pro Abfrage ermittelten Deltas. Der für die Produktion optimierte Fuser befindet sich in retrieval/hybrid_rrf.py; tests/test_rrf.py fixiert den kanonischen Zustand d3 / d2 / d1 Bestellung aufgeben bei k=60.

Reranking

from sentence_transformers import CrossEncoder

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")

query = "How do I rotate database credentials in production?"
candidates = [
    "Production database credentials are rotated via Vault every 30 days.",
    "The new logo was unveiled at the all-hands meeting.",
    "To rotate prod DB creds, run the `rotate-secrets` GitHub Action.",
]

scores = reranker.predict([(query, c) for c in candidates])
ranked = sorted(zip(candidates, scores), key=lambda x: -x[1])
for doc, score in ranked:
    print(f"{score:+.3f}  {doc}")

Ein Reranker stellt ein hochpotentes Kandidat für eine grundlegende RAG Pipeline dar, ist jedoch keine garantierte Lösung. Messen Sie dessen ΔPrecision@1 sowie ΔnDCG an Ihrem Gold-Set und behalten Sie ihn nur dann bei, wenn der erzielte Gewinn sowohl die festgelegten Latency als auch den Kostenrahmen übertreffen. Vergleichen Sie diesen gemessenen Gewinn anschließend mit geringeren Änderungen durch Retrieval, bevor Sie zur nächsten Optimierung übergehen.

ΔnDCG und ΔPrecision@1 eines Cross-Encoders auf SciFact: Notizbuch 03; Modul: retrieval/reranker.py.

Kontextkonstruktion und Verlust im Mittelteil

Genau hier entstehen viele Fehler, bei denen es sich um „gute Retrieval, schlechte Antworten“ handelt.


Teil 5: Die Fehl-Ausschlussrate des Filters

Dieser Metrikwert erhält eigene Abschnitt, da aggregierte Retrieval-Werte keinen Fehlversuch dem Filter zuordnen können.

Ein strenger Metadatenfilter wie tenant_id = X AND product = Y AND locale = en-US Er kann die effektive Recall-Wertung auf Null senken. Eine korrekt implementierte Recall@k-Methode erfasst diesen Verlust, da ihr Nenner weiterhin aus der ursprünglichen Menge der relevanten Dokumente besteht. Sie gibt jedoch nicht an, ob der Filter, der Retriever oder der Ranker für das Ausbleiben einer Treffermeldung verantwortlich ist. Die Treuebewertung kann dennoch gut aussehen, da sie die Antwort anhand des unvollständigen, zurückgeholten Kontextes bewertet; der Model hat dabei zuverlässig „Ich weiß es nicht“ gesagt.

Der rote Zweig im Diagramm stellt den häufigsten Fehler dar: Das richtige Dokument existiert tatsächlich, wird jedoch vom Filter bereits vor Retrieval entfernt.

Taxonomie stiller Ausfälle mit der Metrik, die jeden Fehlermodus erfasst

Die Metrik

filter_false_exclusion_rate =
    (# queries where all gold docs were excluded by metadata filter) /
    (# queries with at least one gold doc)

Diese Definition auf Abfrageebene berücksichtigt katastrophale Ausschlüsse, bei denen kein relevanter Dokument übrig bleibt. Bei mehrfach-goldenen Abfragen führt Recall@k weiterhin zu einem teilweisen Verlust an Informationen; fügen Sie daher eine pro-Dokument-Ausschlussrate hinzu, falls dieser Wert von Bedeutung ist. Um eine dieser Raten zu berechnen, benötigen Sie (a) die echten Dokument-ID‑Werte für jede Eval-Abfrage sowie (b) eine Instrumentierung, die die angewandten Filterprädikate protokolliert – und nicht nur die endgültigen Ergebnisse. Legen Sie das Zielwert fest, indem Sie den Kosten eines Ausschlusses einer gültigen Antwort gegen den Konfidenzintervall Ihrer Produktionsstichprobe abwägen.

Hier ist eine funktionierende Implementierung. Sie vergleicht den korrekten Standard-Recall mit einem ungültigen Evaluator, der die Relevanz nach dem Filtern neu definiert.

# A small worked example where hard filters remove relevant documents.
docs = [
    {"id": "d1", "tenant": "acme",   "locale": "en-US"},
    {"id": "d2", "tenant": "acme",   "locale": "en-GB"},
    {"id": "d3", "tenant": "globex", "locale": "en-US"},
    {"id": "d4", "tenant": "acme",   "locale": "en-US"},
    {"id": "d5", "tenant": "acme",   "locale": "de-DE"},
]

queries = [
    # the gold doc lives in en-GB but the dynamic filter forced en-US
    {"qid": "q1", "gold": {"d2"}, "filter": lambda d: d["locale"] == "en-US"},
    # the gold doc is correctly within the tenant filter
    {"qid": "q2", "gold": {"d4"}, "filter": lambda d: d["tenant"] == "acme"},
    # the gold doc is in a different tenant and gets dropped
    {"qid": "q3", "gold": {"d3"}, "filter": lambda d: d["tenant"] == "acme"},
    # the gold doc passes the filter (de-DE locale match)
    {"qid": "q4", "gold": {"d5"}, "filter": lambda d: d["locale"] == "de-DE"},
]

def filter_false_exclusion_rate(queries, docs):
    n_with_gold, n_excluded = 0, 0
    for q in queries:
        if not q["gold"]:
            continue
        n_with_gold += 1
        survivors = {d["id"] for d in docs if q["filter"](d)}
        if not (q["gold"] & survivors):
            n_excluded += 1
    return n_excluded / n_with_gold if n_with_gold else 0.0

rate = filter_false_exclusion_rate(queries, docs)
print(f"filter_false_exclusion_rate = {rate:.2%}")
# filter_false_exclusion_rate = 50.00%

# Correct Recall@k keeps the original gold set as its denominator.
def standard_recall_at_k(queries, docs, k=10):
    recalls = []
    for q in queries:
        survivors = [d for d in docs if q["filter"](d)][:k]
        survivor_ids = {d["id"] for d in survivors}
        recalls.append(len(q["gold"] & survivor_ids) / len(q["gold"]))
    return sum(recalls) / len(recalls) if recalls else 0.0

print(f"standard recall@10 = {standard_recall_at_k(queries, docs):.2%}")
# standard recall@10 = 50.00%

# INVALID: rebuilding the gold set after filtering changes the question.
# It drops queries whose relevant documents did not survive, then scores 100%.
def invalid_recall_over_filtered_gold(queries, docs, k=10):
    recalls = []
    all_doc_ids = {d["id"] for d in docs}
    for q in queries:
        all_survivors = {d["id"] for d in docs if q["filter"](d)}
        filtered_gold = q["gold"] & all_doc_ids & all_survivors
        if not filtered_gold:
            continue
        top_k_ids = set(list(all_survivors)[:k])
        recalls.append(len(filtered_gold & top_k_ids) / len(filtered_gold))
    return sum(recalls) / len(recalls) if recalls else 0.0

invalid = invalid_recall_over_filtered_gold(queries, docs)
print(f"INVALID recall (filtered gold) = {invalid:.2%}")
# INVALID recall (filtered gold) = 100.00%

assert rate == 0.5
assert standard_recall_at_k(queries, docs) == 0.5
assert invalid == 1.0

Die Hälfte der Abfragen verliert aufgrund des Filters ihr Gold-Dokument, wodurch die korrekte Recall@10-Wertung auf 50 % sinkt. Dieser Wert zeigt zwar das Symptom auf, kann es jedoch nicht zuordnen. Der Fehlerausschlussgrad verdeutlicht, dass der Prädikat vor dem Ausführen des Retrievers bereits zwei Antworten entfernt hat. Die absichtlich ungültigen Evaluator-Einträge weisen lediglich 100 % aus, weil sie diese Fehlschläge aus ihrem Gold-Set ausschließen. Kein Model kann ein Dokument wiederherstellen, das bereits gefiltert wurde.

Der oben genannte Wert von 50 % wird als Unit‑Test im begleitenden Repository wiedergegeben: tests/test_filter_exclusion.py::test_50_percent_exclusion_rate. Notizbuch 04 erstellt damit eine Auswertung in SciFact unter Verwendung synthetischer Metadaten, sodass man beobachten kann, wie ein echter Filter die Recall-Werte auf Null reduziert; der Runtime-Metriker (zusammen mit den Begleitmetriken Präzision/Precision und Recall) wird dabei verwendet evaluation/filter_exclusion.py.

Begleitmetrik: Präzision und Recall des Prädikats

Wenn das Filtern dynamisch ist (zum Beispiel extrahiert ein LLM die Filterprädikate aus der Abfrage), sollte der Prädikatsextraktor als eine KlassifizierungsModel behandelt und entsprechend bewertet werden. Die Präzision sowie der Recall des Prädikats werden anschließend anhand einer gelabelten Datensammlung gemessen. (query, correct predicate) Paare. Ein Fehlerquotient für Prädikate entspricht nicht direkt dem gleichen Punktverlust bei der Retrieval-Rückrufrate; es muss ermittelt werden, wie oft solche Fehler ein Golddokument ausschließen. Sobald ein harter Filter das Golddokument bereits entfernt hat, hilft keine Menge an Reranking mehr.

Weicher Boost im Vergleich zum harten Filter

Dieser Metrikwert erzwingt eine Designentscheidung. Wenden Sie harte Filter an, wenn die Korrektheit binär ist – beispielsweise bei rechtlichen Zuständigkeitsbereichen, Grenzen von ACLs oder zwischen veröffentlichten und Entwurfsversionen. Verwenden Sie hingegen sanfte Aufwertungen, wenn die Relevanz in einem Gradmaß bewertet wird – wie bei Lokalvorlieben, Aktualität oder Versionen. Ohne Messung der Ausschlussrate fällt es schwer, die falsche Wahl zu erkennen.

Die Entscheidungsregel ist messbar:

For each filter predicate F:
  hard_recall_F  = retrieval_recall@k with F as a hard filter
  soft_recall_F  = retrieval_recall@k with F as a +0.X rerank boost
  hard_precision = relevant_in_top_k / k under hard filter
  soft_precision = relevant_in_top_k / k under soft boost
  exclusion_rate = % of queries where the gold doc was filtered out (hard)

Use hard filter only if exclusion_rate < ε AND hard_precision >> soft_precision.
Otherwise prefer soft boost.

Wählen Sie ε anhand des Schadens durch eine falsche Ausschlussentscheidung, des Nutzens einer erhöhten Präzision sowie der Größe der Bewertungsstichprobe aus. Ein spezieller Artikel in dieser Reihe geht dieser Abwägung genauer nach.


Teil 6: Bewertung der Generierung

Retrieval Metriken geben an, ob das System in der Lage wäre, korrekt zu antworten. Sie liefern jedoch keine Information darüber, ob es tatsächlich das auch getan hat. Generationsmetriken schließen diese Lücke.

Treue und Groundedness

RAGAS Treue er zerlegt die Antwort in atomare Aussagen (kurze, selbstständige faktische Erklärungen) und überprüft anschließend jede davon im Bezug auf den abgerufenen Kontext mithilfe von LLM Judge:

\text{Treuegrad} = \frac|\text{Von dem Kontext gestützte Behauptungen}|}{|\text{Gesamtklagen}|}

Der Prozentsatz der unterstützten Ansprüche stellt den Score dar. Diese Struktur ist nützlicher als eine einzelne Zahl, da sie angeben kann, welche Ansprüche nicht unterstützt werden. Der Produktionscode befindet sich in ragas package – die Verwendung sieht wie folgt aus:

from datasets import Dataset
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision

samples = Dataset.from_dict({
    "question": ["How many moons does Mars have?"],
    "answer":   ["Mars has two moons, Phobos and Deimos."],
    "contexts": [["Mars has two moons named Phobos and Deimos."]],
    "ground_truth": ["Mars has two moons."],
})

result = evaluate(samples, metrics=[faithfulness, answer_relevancy, context_precision])
print(result)

Unten ist derselbe Loop in seiner vollständigen Ausprägung dargestellt, wobei ein deterministischer Ersatzwert Judge verwendet wird, damit Sie die Struktur von Anfang bis Ende erkennen können.

def extract_claims(answer: str) -> list[str]:
    # Production: an LLM call that decomposes the answer.
    # Demo: split on sentence-final punctuation.
    return [c.strip() for c in answer.replace("?", ".").replace("!", ".").split(".") if c.strip()]

def verify_claim(claim: str, context: str) -> bool:
    # Production: an NLI (natural-language inference) model or LLM judge.
    # Demo: a deterministic stand-in so the example runs offline.
    entailed_pairs = {
        "Mars has two moons": True,
        "Phobos and Deimos orbit Mars": True,
        "Mars has a thick atmosphere": False,  # unsupported by context
        "Curiosity landed in 2012": True,
    }
    for k, v in entailed_pairs.items():
        if k.lower() in claim.lower() or claim.lower() in k.lower():
            return v
    words = [w.lower() for w in claim.split() if len(w) > 3]
    return all(w in context.lower() for w in words) if words else False

context = (
    "Mars has two moons, Phobos and Deimos. NASA's Curiosity rover "
    "landed on Mars in 2012."
)
answer = (
    "Mars has two moons. Phobos and Deimos orbit Mars. "
    "Mars has a thick atmosphere. Curiosity landed in 2012."
)

claims = extract_claims(answer)
verdicts = [(c, verify_claim(c, context)) for c in claims]
faithfulness = sum(1 for _, ok in verdicts if ok) / len(verdicts)
for c, ok in verdicts:
    print(f"  [{'✓' if ok else '✗'}] {c}")
print(f"faithfulness = {faithfulness:.2f}")
# faithfulness = 0.75   (one unsupported claim about the atmosphere)

Die Struktur ist von entscheidender Bedeutung. In der Produktion, verify_claim es wird entweder zu einem NLI Model oder zu einem LLM Aufruf. Der Rest des Harness bleibt unverändert: Extrahieren, Überprüfen, Aggregieren.

End-to-End-Extraktion und -Verifizierung von Anfragen an generierten SciFact-Antworten: Notizbuch 05; Modul: evaluation/faithfulness.py. Der Repository-Code führt außerdem im selben Zyklus einen auf dem Prinzip von HHEM basierenden Verifier für verschiedene Familien aus, sodass man erkennen kann, welche Judge-Familie mit welcher übereinstimmt.

Eine speziell entwickelte Alternative zu LLM als Judge HHEM-2.1-Offen (Hughes Hallucination Evaluation Model, Vectara) – ein für die Hallucination-Erkennung feinabgestimmter Klassifikator. Seine Model-Karte dokumentiert die Checkpoint, also die Standardentscheidungsgrenze, sowie die Ergebnisse bei AggreFact und RAGTruth. Diese sollten als Beweismittel im Rahmen von Model-Karten betrachtet werden und nicht als Garantie für die Qualität Ihres Korpus angesehen werden: Kalibrieren Sie den Schwellenwert anhand lokaler Etiketten und vergleichen Sie ihn mit dem von Ihnen gewählten Judge vor dem Einsatz in Deployment.

Bewertung atomarer Fakten

Faktorwert (Min et al., EMNLP 2023) zerlegt langformatige Generierungen in atomare Fakten, holt für jeden Fakt Beweise ab und kennzeichnet jeden davon supported / not-supportedund gibt den unterstützten Bruch an:

FActScore=unterstu¨tzte atomare FaktenGesamte atomaren Fakten\text{FActScore} = \frac{|\text{unterstützte atomare Fakten}|}{|\text{Gesamte atomaren Fakten}|}

Referenzimplementierung: shmsw25/FActScore. Es eignet sich hervorragend für Biografien, Zusammenfassungen sowie andere langformatige Ausgaben. Achten Sie jedoch darauf: wiederholte, triviale Fakten können die Bewertung erhöhen, und „MontageLie“-Angriffe (wahre Fakten in irreführender Reihenfolge) können das System überlisten. VeriScore bearbeitet Anfragen unter Verwendung der erforderlichen Modifikatoren; der Kern Filter helfen dabei, das Hinzufügen unnötiger Fakten zu verhindern.

Genauigkeit der Zitationen

Überwachen Sie die Präzision der Zitationen (die tatsächlich zitierten Spans stützen die jeweilige Behauptung) sowie die Rekallrate der Zitationen (die behauptet werden sollten und tatsächlich zitiert werden):

\text{cite\_precision} = \frac|\text{der zitierte Spans, der eine Behauptung stützt}|}{|\text{zitiert Spans}|}, \quad \text{cite\_recall} = \frac{\text{}|\text{Ansprüche mit mindestens einer unterstützenden, zitierten Span}|}{|\text{Behauptungen, die zitiert werden sollten}|}

Die TREC 2024 RAG-Sparte definiert ein reproduzierbares Protokoll für die Unterstützungsbeurteilung. Upadhyay et al. (SIGIR 2025) Es wird berichtet, dass GPT-4o bei manueller, von Grund auf durchgeführter Bewertung zu 56 % mit dem menschlichen Judges übereinstimmt, dieser Wert steigt auf 72 %, wenn die Vorhersagen von LLM nachträglich bearbeitet werden. Unter den jeweiligen Bedingungen kann dies als Verstärkungsmittel nützlich sein, ersetzt jedoch nicht die menschliche Beurteilung in hochriskanten Situationen. Es handelt sich dabei um eine automatisierte Annäherungslösung. ALCE (Gao et al., EMNLP 2023) wenden Zitatenpräzision/Zitatenauflösung unter Verwendung einer auf NLI basierenden Überprüfung an.

Richtigkeit, Vollständigkeit und Ablehnung der Antwort

Nachgenerierungsverifizierung

Die günstigsten Verbesserungen der Zuverlässigkeit ergeben sich in der Regel aus deterministischen Nachprüfungen und nicht aus größeren Models.


Teil 7: Bewertung auf Basis von Ontologien für RAG

Die oben genannten Standardmetriken decken das offene Korpus RAG ab. Ontologiebasierte Systeme benötigen hingegen weitere Kennzahlen. Wenn Ihr RAG auf einer strukturierten Ontologie, Taxonomie oder Wissensgraphik abruft – beispielsweise Produkte in einem Katalog, Bedingungen in SNOMED, Komponenten in einer BOM oder Sicherheitstechniken in MITRE ATT&CK – sind Standard-Metriken wie RAG zwar notwendig, reichen jedoch nicht aus. Zudem muss auch die Ebene der Ontologie selbst gemessen werden.

Genauigkeit der Entitätsverknüpfung

Die erste Aufgabe besteht darin, eine in einer Abfrage erwähnte Entität auf eine Ontologie-Entität abzubilden („Aspirin“ → wikidata:Q18216”der 737” aircraft:Boeing_737).

Hierarchiebewusste Bewertung

Die einfache Genauigkeit behandelt den Fall „vorausgesagter Sedan, wenn die Wahrheit Hatchback ist“ genauso wie den Fall „vorausgesagter Sedan, wenn die Wahrheit Submarine ist“. Solche Fehler sind jedoch nicht gleichwertig.

Rate der Falsch-Ausschluss-Filterung (Wiederholung – nun kritisch)

In ontologiebasierten Systemen stammen harte Filter häufig direkt aus der Ontologie selbst („Rufen Sie nur Dokumente ab, die mit der Kategorie X markiert sind“). Die Ausschlussrate-Metrik (definiert in Teil 5) Es wird zu einem primären Signal für die Korrektheit. Eine falsche Kategorievervollständigung kann die Trefferquote auf Null reduzieren; der Ausschlussgrad ordnet diesen Verlust dem Filter zu.

Konformität bei restriktiver Generierung

Wenn die Ausgabe einer Ontologie entsprechen muss (jeder Entitätsname in der Antwort muss ein gültiges Mitglied der Ontologie sein; jedes Prädikat muss aus einem geschlossenen Wortschatz stammen), messen Sie:

Constrained Decoding Frameworks (Übersichten, XGrammar, Leitfaden, OpenAI Structured Outputs) sind dafür konzipiert, die Gültigkeit des Schemas zu überwachen. JSONSchemaBench Es vergleicht Effizienz, Abdeckung und Qualität verschiedener Implementierungen. Führen Sie die entsprechenden Testfälle erneut aus, die mit Ihren Schemata sowie Serving Backend übereinstimmen, da sowohl die Abdeckung als auch Latency von diesen Faktoren abhängen.

Überprüfbarkeit

Für ontologiebasierte Systeme, bei denen die Antworten einer Überprüfung unterzogen werden:


Teil 8: Bewertung auf Systemebene

Gesamte Qualität der Antwort

LLM als Judge weist tatsächliche Voreingenommenheiten auf:

Praktischer Leitfaden: Wählen Sie einen Judge aus den von Menschen annotierten Calibration Data-Beispielen aus, randomisieren Sie die Reihenfolge der Antworten, maskieren Sie die Identitäten der Model-Instanzen und geben Sie in der Bewertungskriterienliste die Längenrichtlinie an. Wiederholen Sie Testfälle nur dann, wenn die hinzugefügten Beispiele die Unsicherheit erheblich verringern. Bei kritischen Evaluierungen sollten Judges-Werte aus verschiedenen Model-Familien miteinander verglichen werden, wobei Abweichungen im Vergleich zu den menschlichen Labels analysiert werden müssen.

Schema-gestütztes Reasoning für Judges

Freiform-Ausgaben stellen eine Quelle für Variationen bei den Ausführungen von Judge dar. Zwei Ausführungen gegenüber derselben Aufgabe können die Bewertungskriterien unterschiedlich anwenden und somit unterschiedliche Ergebniswerte erzeugen. Schema-gestütztes Reasoning (SGR) Stellen Sie diese Bewertungskriterien klar: Definieren Sie die Evaluierungsphasen als Pydantic-Schema und nutzen Sie anschließend eingeschränkte Ausgaben mithilfe von Outlines, XGrammar, vLLM Structured Outputs oder OpenAI. response_format Daher liefert jeder Ausführung die gleichen Felder in derselben Reihenfolge.

Für RAG Eval zerlegt das Schema das Urteil in explizite, überprüfbare Felder, anstatt es dem Model zu ermöglichen, direkt auf eine Zahl zuzugreifen:

from pydantic import BaseModel, Field
from typing import Literal

class FaithfulnessJudgment(BaseModel):
    extracted_claims: list[str] = Field(
        description="Atomic factual claims in the answer, one per item."
    )
    supported_claims: list[str] = Field(
        description="Subset of extracted_claims that are entailed by the context."
    )
    unsupported_claims: list[str] = Field(
        description="Subset that is NOT entailed by the context."
    )
    failure_mode: Literal[
        "none", "fabrication", "overgeneralization", "wrong_entity", "stale_fact"
    ]
    score: float = Field(ge=0.0, le=1.0)
    rationale: str

Durch die strukturierten Felder ist der Score wiederherstellbar. len(supported) / len(extracted) und zeigen genau an, über welche Behauptungen sich die beiden Judges nicht einig waren. Der Pydantic Model macht außerdem eine Änderung im Bewertungsschema als Code-Diff sichtbar. Durch die eingeschränkte Ausgabeform wird zwar die Struktur gewährleistet, doch kein unvoreingenommenes Urteil abgegeben; daher gelten weiterhin Positionsrandomisierung, cross-family Judges sowie menschliche Calibration Einflüsse.

Dies funktioniert für jedes auf Kriterien basierende Judge-System, nicht nur für solche, die auf Treueprinzipien beruhen. Sowohl die paarebene Präferenzbewertung, die Unterstützung bei Zitaten als auch die Richtigkeit von Ablehnungen profitieren alle vom gleichen Ansatz.

Ein G-Eval / paarweise / position-biases / cross-familienweiter Judge Harness existiert in Notizbuch 07; Modul: evaluation/llm_judge.py. Der Benchmark-Scanmake benchmark im Repository werden drei Agenten der Spitzenklasse Models vernetzt — gpt-5-mini, claude-haiku-4-5, gemini-2.5-flash — in einen rotierenden‑Judge paarweise A/B-Testung, sodass jeder Model Judges Die beiden anderen zeigen die numerischen Werte der Selbstpräferenz an.

Latency und Kosten

Die pro Phase angegebenen Werte für P50/P95/P99 zusammen mit einer detaillierten Aufschlüsselung nach Phasen sind bereits integriert. Notizbuch 08 und der Runner bei evaluation/latency.py; Der Bericht Benchmark vereint Latency mit hoher Genauigkeit in einer einzigen Matrix, die Sie erneut ausführen können. make benchmark.

A/B-Testing


Teil 9: Erstellung des Testsets

Eine Metrik ist nur so gut wie der Testdatensatz, auf dem sie ausgeführt wird. Wenn Ihr „Golden Set“ drei Intenten und der Produktivverkehr Spans zwölf umfasst, misst Recall@10 lediglich diese drei Intenten. Noch schlimmer ist es, wenn ein Testdatensatz zu leichten Fragen überanpasst wird („Wie lautet die Rückerstattungspolitik des Unternehmens?“), wodurch ein System genehmigt werden kann, das bei schwierigen Fällen versagt („Rückerstattungsfähigkeit bei teilweiser Stornierung gemäß dem EU-Digitaldienstegesetz von 2023, in EUR abgerechnet, aus Irland stammend?“). Der Gesamtwert steigt, obwohl das System weiterhin einen wichtigen Teil des Produktivverkehrs nicht bewältigen kann.

Dasselbe Problem tritt auch bei den Ground-Truth-Daten auf. Wenn KMU die offensichtlichen Dokumente annotieren, aber die weniger bekannten, relevanten Dokumente übersehen, führt dies dazu, dass Recall@k einen Suchalgorithmus, der diese tatsächlich gefunden hat, zu schlecht bewertet. Man optimiert somit in Richtung der Annotierungen und nicht in Richtung der wahren Realität.

Erstellen Sie zunächst den Testdatensatz unter Berücksichtigung der tatsächlichen Abfrageverteilung und Schwierigkeitsgrade. Wählen Sie anschließend Metriken aus, die auf die gewünschten Fehlermuster reagieren, und passen Sie das System entsprechend an.

Erzeugung synthetischer Abfragen

Verwenden Sie einen LLM, um aus Ihrem Korpus Fragen zu erzeugen:

RAGAS verfügt über eine integrierte Verteilung der Fragearten (Reasoning, bedingte, mehrkontextuelle). DataMorgana Es erzeugt konfigurierbare synthetische Benchmarks-Beispiele für verschiedene Kategorien von Benutzern und Fragen. Synthetische Daten sind nützlich bei der Initialisierung neuer Systeme sowie bei Tests zur Abdeckung aller möglichen Szenarien. Sie können jedoch keine echten Anfragen von Nutzern ersetzen.

Konstruktion nach dem Goldenen Dataset-Prinzip

Durch von Menschen überwachte Daten wird die Referenzmenge gesichert.

  1. Beispiele für tatsächliche Benutzeranfragen (oder simulierte, falls vor dem Launch), stratifiziert nach Absicht.
  2. Lassen Sie Fachexperten jede Frage beantworten und bestimmen, in welchem Dokument(en) sich die Antwort befindet.
  3. Legen Sie die Größe des Datensatzes anhand der Abdeckungsmatrix sowie des für Entscheidungen zum Release erforderlichen Konfidenzintervalls fest; die Abdeckungsrate ist wichtiger als die Anzahl der eingesammelten Anfragen.
  4. Führen Sie eine erneute Auswahl durch, wenn das Release-Rhythmus, Anzeichen für Abweichungen, Domänenrisiken oder die Annotationskapazitäten dies rechtfertigen.

Adversarische Testmengen

Abdeckung und kontinuierliche Bewertung


Teil 10: Produktionsüberwachung

Das von Ihnen bereitgestellte Eval-Paket beschreibt das System zum Zeitpunkt des Releases. Der Produktivverkehr ändert sich danach.

Implizite und explizite Rückmeldung

Abweichungserkennung

Schattenbewertung und Human-in-the-Loop

Führen Sie das Kandidatssystem parallel zur Produktivumgebung aus, vergleichen Sie die Ergebnisse offline miteinander und stellen Sie diese nicht den Nutzern zur Verfügung. Auf diese Weise werden Regressionen bereits vor dem Release erkannt. Dies verursacht zusätzliche Kosten für Inference, hat aber keinen Einfluss auf die Kunden.

Zur Überprüfung von Human-in-the-Loop (HITL):

Die minimale Guardrail-Menge

Warnung bei diesen Elementen, in Prioritätsreihenfolge:

  1. Der Faithfulness/HHEM-Score liegt bei einer rollierenden Produktionsstichprobe unter dem definierten Schwellenwert.
  2. Der p95 Latency überschreitet den festgelegten SLO-Wert.
  3. Die Rate falscher Ausschlüsse durch Filter liegt über dem definierten Schwellenwert (basierend auf Stichproben).
  4. Die Regenerationsrate befindet sich außerhalb eines lokal kalibrierten Kontrollbereichs, der Größen des Zeitfensters, Verkehrsmengen, saisonalen Schwankungen sowie dem Budget für falsche Alarme berücksichtigt.
  5. Die Kosten pro Abfrage liegen über dem zugewiesenen Budget.

Falls ein Alarm ausgelöst wird, ohne dass es einen entsprechenden Code oder eine Änderung von Model gibt, liegt vermutlich ein Drift vor. Tritt der Alarm hingegen nach einer Änderung auf, deutet dies wahrscheinlich auf eine Regression hin. In jedem Fall erhalten Sie frühzeitig ein Signal, noch bevor Support-Anfragen eintreffen.


Einschränkungen


Was in dieser Serie folgt

Dies war der Index. Die weiteren Dokumente sind Planning:


Referenzen

Frameworks und Benchmarks

Retrieval und Ranking

Generierung, Treue, Judges

Drift und Produktionseinsatz

Begleitcode