RAG-Systeme mit Vertex AI bewerten

1. Übersicht

In diesem Lab erfahren Sie, wie Sie eine Evaluierungspipeline für ein RAG-System (Retrieval-Augmented Generation) erstellen. Sie verwenden den Vertex AI Gen AI Evaluation Service, um benutzerdefinierte Bewertungskriterien zu erstellen und ein Bewertungsframework für eine Question-Answering-Aufgabe zu entwickeln.

Sie arbeiten mit Beispielen aus dem Stanford Question Answering Dataset (SQuAD 2.0), um Bewertungs-Datasets vorzubereiten, referenzfreie und referenzbasierte Bewertungen zu konfigurieren und die Ergebnisse zu interpretieren. Am Ende dieses Labs wissen Sie, wie Sie RAG-Systeme bewerten und warum bestimmte Bewertungsansätze gewählt werden.

Dataset-Grundlage

Wir arbeiten mit sorgfältig ausgewählten Beispielen aus mehreren Bereichen, die im SQuAD 2.0-Dataset für Frage-Antwort-Systeme enthalten sind:

  • Neurowissenschaften: Überprüfung der technischen Richtigkeit in wissenschaftlichen Kontexten
  • Geschichte: Bewertung der sachlichen Richtigkeit in historischen Erzählungen
  • Geografie: Bewertung von territorialem und politischem Wissen

So können Sie nachvollziehen, wie sich die Bewertungsansätze auf verschiedene Themenbereiche verallgemeinern lassen.

Verweise

Lerninhalte

Aufgaben in diesem Lab:

  • Bewertungs-Datasets für RAG-Systeme vorbereiten
  • Implementieren Sie eine referenzfreie Bewertung mit Messwerten wie Fundierung und Relevanz.
  • Referenzbasierte Bewertung mit semantischen Ähnlichkeitsmessungen anwenden.
  • Benutzerdefinierte Bewertungs-Messwerte mit detaillierten Bewertungskriterien erstellen
  • Bewertungsergebnisse interpretieren und visualisieren, um die Modellauswahl zu treffen.

2. Projekt einrichten

Google-Konto

Wenn Sie noch kein privates Google-Konto haben, müssen Sie ein Google-Konto erstellen.

Verwenden Sie stattdessen ein privates Konto.

In der Google Cloud Console anmelden

Melden Sie sich mit einem privaten Google-Konto in der Google Cloud Console an.

Abrechnung aktivieren

Google Cloud-Guthaben im Wert von 5 $einlösen (optional)

Für diesen Workshop benötigen Sie ein Rechnungskonto mit Guthaben. Wenn Sie Ihre eigene Abrechnung verwenden möchten, können Sie diesen Schritt überspringen.

  1. Klicken Sie auf diesen Link und melden Sie sich mit einem privaten Google-Konto an. Sie sehen etwa Folgendes: Zur Seite „Guthaben“
  2. Klicken Sie auf die Schaltfläche CLICK HERE TO ACCESS YOUR CREDITS (HIER KLICKEN, UM AUF IHR GUTHABEN ZUZUGREIFEN). Sie werden auf eine Seite weitergeleitet, auf der Sie Ihr Abrechnungsprofil einrichten können. Seite zum Einrichten des Abrechnungsprofils
  3. Klicken Sie auf Bestätigen. Sie sind jetzt mit einem Google Cloud Platform-Testrechnungskonto verbunden. Screenshot der Abrechnungsübersicht

Privates Rechnungskonto einrichten

Wenn Sie die Abrechnung mit Google Cloud-Guthaben eingerichtet haben, können Sie diesen Schritt überspringen.

Klicken Sie hier, um die Abrechnung in der Cloud Console zu aktivieren und ein privates Rechnungskonto einzurichten.

Hinweise:

  • Die Kosten für Cloud-Ressourcen für dieses Lab sollten weniger als 1 $betragen.
  • Sie können die Schritte am Ende dieses Labs ausführen, um Ressourcen zu löschen und so weitere Kosten zu vermeiden.
  • Neuen Nutzern steht die kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.

Projekt erstellen (optional)

Wenn Sie kein aktuelles Projekt haben, das Sie für dieses Lab verwenden möchten, erstellen Sie hier ein neues Projekt.

3. Was ist Retrieval-Augmented Generation (RAG)?

RAG ist eine Technik, mit der die faktische Richtigkeit und Relevanz von Antworten von Large Language Models (LLMs) verbessert werden kann. Es verbindet das LLM mit einer externen Wissensdatenbank, um seine Antworten auf spezifische, überprüfbare Informationen zu stützen.

Der Prozess umfasst die folgenden Schritte:

  1. Die Frage eines Nutzers in eine numerische Darstellung (eine Einbettung) umwandeln.
  2. Die Wissensdatenbank wird nach Dokumenten mit ähnlichen Einbettungen durchsucht.
  3. Diese relevanten Dokumente werden dem LLM zusammen mit der ursprünglichen Frage als Kontext zur Verfügung gestellt, um eine Antwort zu generieren.

RAG

Warum ist die RAG-Bewertung so komplex?

Die Bewertung von RAG-Systemen unterscheidet sich von der Bewertung herkömmlicher Sprachmodelle.

Die Multi-Component Challenge: RAG-Systeme kombinieren drei Vorgänge, die jeweils einen Fehlerpunkt darstellen können:

  • Abrufqualität: Hat das System die richtigen Kontextdokumente gefunden?
  • Kontextnutzung: Hat das Modell die abgerufenen Informationen effektiv genutzt?
  • Qualität der Generierung: Ist die endgültige Antwort gut formuliert, hilfreich und korrekt?

Eine Antwort kann fehlschlagen, wenn eine dieser Komponenten nicht wie erwartet funktioniert. Das System ruft beispielsweise den richtigen Kontext ab, das Modell ignoriert ihn aber. Oder das Modell generiert eine gut formulierte Antwort, die falsch ist, weil der abgerufene Kontext irrelevant war.

4. Vertex AI Workbench-Umgebung einrichten

Zuerst erstellen wir eine neue Notebook-Umgebung, in der wir den Code ausführen, der zum Bewerten von RAG-Systemen erforderlich ist.

  1. Rufen Sie in der Cloud Console die Seite APIs & Dienste auf.
  2. Klicken Sie für die Vertex AI API auf Aktivieren.Vertex-Dashboard

Auf Vertex AI Workbench zugreifen

  1. Klicken Sie in der Google Cloud Console auf das Navigationsmenü ☰ > Vertex AI > Workbench, um zu Vertex AI zu gelangen.
  2. Erstellen Sie eine neue Workbench-Instanz.Workbench erstellen
  3. Geben Sie der Workbench-Instanz den Namen evaluation-workbench.
  4. Wählen Sie Ihre Region und Zone aus, falls diese Werte noch nicht festgelegt sind.
  5. Klicken Sie auf Erstellen.Workbench benennen
  6. Warten Sie, bis die Workbench eingerichtet ist. Dies kann einige Minuten dauern.Await Workbench
  7. Wenn die Workbench bereitgestellt wurde, klicken Sie auf JupyterLab öffnen.Workbench öffnen
  8. Erstellen Sie in der Workbench ein neues Python3-Notebook.Notebook erstellen

Weitere Informationen zu den Funktionen und Möglichkeiten dieser Umgebung finden Sie in der offiziellen Dokumentation zu Vertex AI Workbench.

Vertex AI Evaluation SDK installieren

Installieren wir nun das spezielle Evaluierungs-SDK, das die Tools für die RAG-Bewertung bereitstellt.

  1. Fügen Sie in der ersten Zelle Ihres Notebooks die folgende Importanweisung ein und führen Sie sie aus (UMSCHALTTASTE + EINGABETASTE), um das Vertex AI SDK (mit den Bewertungs-Komponenten) zu installieren.
    %pip install --upgrade --user --quiet google-cloud-aiplatform[evaluation]
    
    Dadurch wird das Vertex AI SDK mit Erweiterungen für die Evaluierung installiert, die Folgendes umfassen:
    • EvalTask: Die Hauptklasse zum Ausführen von Auswertungen
    • MetricPromptTemplateExamples: Vordefinierte Bewertungsmesswerte
    • PointwiseMetric: Framework zum Erstellen benutzerdefinierter Messwerte
    • notebook_utils: Visualisierungstools für die Ergebnisanalyse
  2. Wichtig: Nach der Installation müssen Sie den Kernel neu starten, um die neuen Pakete verwenden zu können. Klicken Sie in der Menüleiste oben im JupyterLab-Fenster auf Kernel > Kernel neu starten.

5. SDK initialisieren und Bibliotheken importieren

Bevor Sie die Auswertungspipeline erstellen können, müssen Sie Ihre Umgebung einrichten. Dazu müssen Sie Ihre Projektdetails konfigurieren, das Vertex AI SDK initialisieren, um eine Verbindung zu Google Cloud herzustellen, und die speziellen Python-Bibliotheken importieren, die Sie für die Auswertung verwenden.

  1. Definieren Sie die Konfigurationsvariablen für Ihren Bewertungsjob. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus, um PROJECT_ID, LOCATION und einen EXPERIMENT-Namen für diesen Lauf festzulegen.
    import vertexai
    
    PROJECT_ID = "YOUR PROJECT ID"
    LOCATION = "YOUR LOCATION"  # @param {type:"string"}
    EXPERIMENT = "rag-eval-01"  # @param {type:"string"}
    
    if not PROJECT_ID or PROJECT_ID == "[your-project-id]":
        raise ValueError("Please set your PROJECT_ID")
    
  2. Initialisieren Sie das Vertex AI SDK. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus.
    vertexai.init(project=PROJECT_ID, location=LOCATION)
    
    In diesem Schritt wird Ihr Notebook authentifiziert und mit Ihrem Google Cloud-Projekt verbunden.
  3. Importieren Sie die erforderlichen Klassen aus dem Evaluation SDK, indem Sie den folgenden Code in der nächsten Zelle ausführen:
    import pandas as pd
    from vertexai.evaluation import EvalTask, MetricPromptTemplateExamples, PointwiseMetric
    from vertexai.preview.evaluation import notebook_utils
    
    Hier finden Sie eine Zusammenfassung der einzelnen Importe:
    • pandas: Zum Erstellen und Verwalten von Daten in DataFrames.
    • EvalTask: Die Kernklasse, mit der ein Bewertungsjob ausgeführt wird.
    • MetricPromptTemplateExamples: Bietet Zugriff auf die vordefinierten Bewertungsstatistiken von Google.
    • PointwiseMetric: Das Framework zum Erstellen eigener benutzerdefinierter Messwerte.
    • notebook_utils: Eine Sammlung von Tools zum Visualisieren von Ergebnissen.

6. Bereiten Sie das Bewertungs-Dataset vor.

Ein gut strukturiertes Dataset ist die Grundlage jeder zuverlässigen Auswertung. Für RAG-Systeme sind für jedes Beispiel zwei Schlüsselfelder in Ihrem Dataset erforderlich:

  • Prompt: Dies ist die gesamte Eingabe, die dem Sprachmodell zur Verfügung gestellt wird. Sie müssen die Frage des Nutzers mit dem Kontext kombinieren, der von Ihrem RAG-System abgerufen wurde (prompt = User Question + Retrieved Context). Das ist wichtig, damit der Bewertungsdienst weiß, welche Informationen das Modell zum Erstellen seiner Antwort verwendet hat.
  • Antwort: Dies ist die endgültige Antwort, die von Ihrem RAG-Modell generiert wurde.

Für statistisch zuverlässige Ergebnisse wird ein Dataset mit etwa 100 Beispielen empfohlen. In diesem Lab verwenden Sie ein kleines Dataset, um den Prozess zu demonstrieren.

Erstellen wir die Datasets. Sie beginnen mit einer Liste von Fragen und dem retrieved_contexts aus einem RAG-System. Anschließend definieren Sie zwei Antwortgruppen: eine von einem Modell, das gut zu funktionieren scheint (generated_answers_by_rag_a), und eine von einem Modell, das schlecht funktioniert (generated_answers_by_rag_b).

Schließlich kombinieren Sie diese Teile in zwei Pandas-DataFrames, eval_dataset_rag_a und eval_dataset_rag_b, gemäß der oben beschriebenen Struktur.

  1. Fügen Sie in einer neuen Zelle den folgenden Code ein und führen Sie ihn aus, um die Fragen und die beiden Gruppen von „generated_answers“ zu definieren.
    questions = [
        "Which part of the brain does short-term memory seem to rely on?",
        "What provided the Roman senate with exuberance?",
        "What area did the Hasan-jalalians command?",
    ]
    
    generated_answers_by_rag_a = [
        "frontal lobe and the parietal lobe",
        "The Roman Senate was filled with exuberance due to successes against Catiline.",
        "The Hasan-Jalalians commanded the area of Syunik and Vayots Dzor.",
    ]
    
    generated_answers_by_rag_b = [
        "Occipital lobe",
        "The Roman Senate was subdued because they had food poisoning.",
        "The Galactic Empire commanded the state of Utah.",
    ]
    
    Hier werden die Kernkomponenten Ihres Datasets definiert: die Fragen, die langen Kontextpassagen, die von einem RAG-System für jede Frage abgerufen werden, und die Antworten, die von zwei verschiedenen Modellen (einem leistungsstarken Modell A und einem leistungsschwachen Modell B) generiert werden.
  2. Definieren Sie die retrieved_contexts. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus.
    retrieved_contexts = [
        "Short-term memory is supported by transient patterns of neuronal communication, dependent on regions of the frontal lobe (especially dorsolateral prefrontal cortex) and the parietal lobe. Long-term memory, on the other hand, is maintained by more stable and permanent changes in neural connections widely spread throughout the brain. The hippocampus is essential (for learning new information) to the consolidation of information from short-term to long-term memory, although it does not seem to store information itself. Without the hippocampus, new memories are unable to be stored into long-term memory, as learned from patient Henry Molaison after removal of both his hippocampi, and there will be a very short attention span. Furthermore, it may be involved in changing neural connections for a period of three months or more after the initial learning.",
        "In 62 BC, Pompey returned victorious from Asia. The Senate, elated by its successes against Catiline, refused to ratify the arrangements that Pompey had made. Pompey, in effect, became powerless. Thus, when Julius Caesar returned from a governorship in Spain in 61 BC, he found it easy to make an arrangement with Pompey. Caesar and Pompey, along with Crassus, established a private agreement, now known as the First Triumvirate. Under the agreement, Pompey's arrangements would be ratified. Caesar would be elected consul in 59 BC, and would then serve as governor of Gaul for five years. Crassus was promised a future consulship.",
        "The Seljuk Empire soon started to collapse. In the early 12th century, Armenian princes of the Zakarid noble family drove out the Seljuk Turks and established a semi-independent Armenian principality in Northern and Eastern Armenia, known as Zakarid Armenia, which lasted under the patronage of the Georgian Kingdom. The noble family of Orbelians shared control with the Zakarids in various parts of the country, especially in Syunik and Vayots Dzor, while the Armenian family of Hasan-Jalalians controlled provinces of Artsakh and Utik as the Kingdom of Artsakh.",
    ]
    
    Nachdem Sie nun alle Rohkomponenten haben, kombinieren Sie sie in die strukturierten Pandas-DataFrames, die für den Auswertungsdienst erforderlich sind.
  3. Fügen Sie in einer neuen Zelle den folgenden Code ein und führen Sie ihn aus, um eval_dataset_rag_a und eval_dataset_rag_b zu erstellen.
    eval_dataset_rag_a = pd.DataFrame(
        {
        "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
        ],
        "response": generated_answers_by_rag_a,
        }
    )
    
    eval_dataset_rag_b = pd.DataFrame(
        {
        "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
        ],
        "response": generated_answers_by_rag_b,
        }
    )
    
  4. Führen Sie den folgenden Code in einer neuen Zelle aus, um sich die ersten Zeilen des Datasets für Modell A anzusehen.
    eval_dataset_rag_a
    
    So können Sie prüfen, ob die Datei korrekt erstellt wurde.

7. Messwerte auswählen und erstellen

Nachdem die Datasets fertig sind, können Sie entscheiden, wie Sie die Leistung messen möchten. Sie können einen oder mehrere Messwerte verwenden, um Ihr Modell zu bewerten. Jeder Messwert bewertet einen bestimmten Aspekt der Antwort des Modells, z. B. die sachliche Richtigkeit oder Relevanz.

Sie können zwei Arten von Messwerten kombinieren:

  • Vordefinierte Messwerte: Sofort einsatzbereite Messwerte, die vom SDK für gängige Bewertungsaufgaben bereitgestellt werden.
  • Benutzerdefinierte Messwerte: Messwerte, die Sie definieren, um Qualitäten zu testen, die für Ihren Anwendungsfall relevant sind.

In diesem Abschnitt sehen Sie sich die vordefinierten Messwerte an, die für RAG verfügbar sind.

Vordefinierte Messwerte ansehen

Das SDK enthält mehrere integrierte Messwerte zur Bewertung von Frage-Antwort-Systemen. Bei diesen Messwerten wird ein Sprachmodell als „Evaluator“ verwendet, um die Antworten Ihres Modells anhand einer Reihe von Anweisungen zu bewerten.

  1. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus, um die vollständige Liste der vordefinierten Messwertnamen aufzurufen:
    MetricPromptTemplateExamples.list_example_metric_names()
    
    Dadurch wird eine Liste der verfügbaren Messwerte ausgegeben, die Sie sofort verwenden können.
  2. Wenn Sie wissen möchten, wie diese Messwerte funktionieren, können Sie sich die zugrunde liegenden Promptvorlagen ansehen. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus, um die Anweisungen zu sehen, die der LLM des Evaluators für den Messwert question_answering_quality gegeben wurden.
    # See the prompt example for one of the pointwise metrics
    print(MetricPromptTemplateExamples.get_prompt_template("question_answering_quality"))
    

8. Benutzerdefinierte Messwerte erstellen

Zusätzlich zu vordefinierten Messwerten können Sie benutzerdefinierte Messwerte erstellen, um Kriterien zu bewerten, die für Ihren Anwendungsfall spezifisch sind. Um einen benutzerdefinierten Messwert zu erstellen, schreiben Sie eine Promptvorlage, in der das Evaluator-LLM angewiesen wird, wie eine Antwort bewertet werden soll.

Das Erstellen eines benutzerdefinierten Messwerts umfasst zwei Schritte:

  1. Prompt-Vorlage definieren: Ein String, der Ihre Anweisungen für das LLM des Evaluators enthält. Eine gute Vorlage enthält eine klare Rolle, Bewertungskriterien, eine Scoring-Rubrik und Platzhalter wie {prompt} und {response}.
  2. PointwiseMetric-Objekt instanziieren: Sie umschließen den String der Promptvorlage mit dieser Klasse und geben Ihrem Messwert einen Namen.

Sie erstellen zwei benutzerdefinierte Messwerte, um die Relevanz und Nützlichkeit der Antworten des RAG-Systems zu bewerten.

  1. Definieren Sie die Prompt-Vorlage für den Relevanzmesswert. Diese Vorlage enthält eine detaillierte Rubrik für das LLM des Prüfers. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus:
    relevance_prompt_template = """
    You are a professional writing evaluator. Your job is to score writing responses according to pre-defined evaluation criteria.
    
    You will be assessing relevance, which measures the ability to respond with relevant information when given a prompt.
    
    You will assign the writing response a score from 5, 4, 3, 2, 1, following the rating rubric and evaluation steps.
    
    ## Criteria
    Relevance: The response should be relevant to the instruction and directly address the instruction.
    
    ## Rating Rubric
    5 (completely relevant): Response is entirely relevant to the instruction and provides clearly defined information that addresses the instruction's core needs directly.
    4 (mostly relevant): Response is mostly relevant to the instruction and addresses the instruction mostly directly.
    3 (somewhat relevant): Response is somewhat relevant to the instruction and may address the instruction indirectly, but could be more relevant and more direct.
    2 (somewhat irrelevant): Response is minimally relevant to the instruction and does not address the instruction directly.
    1 (irrelevant): Response is completely irrelevant to the instruction.
    
    ## Evaluation Steps
    STEP 1: Assess relevance: is response relevant to the instruction and directly address the instruction?
    STEP 2: Score based on the criteria and rubrics.
    
    Give step by step explanations for your scoring, and only choose scores from 5, 4, 3, 2, 1.
    
    
    # User Inputs and AI-generated Response
    ## User Inputs
    ### Prompt
    {prompt}
    
    ## AI-generated Response
    {response}
    """
    
    
  2. Definieren Sie die Promptvorlage für den Messwert „Nützlichkeit“ auf dieselbe Weise. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    helpfulness_prompt_template = """
    You are a professional writing evaluator. Your job is to score writing responses according to pre-defined evaluation criteria.
    
    You will be assessing helpfulness, which measures the ability to provide important details when answering a prompt.
    
    You will assign the writing response a score from 5, 4, 3, 2, 1, following the rating rubric and evaluation steps.
    
    ## Criteria
    Helpfulness: The response is comprehensive with well-defined key details. The user would feel very satisfied with the content in a good response.
    
    ## Rating Rubric
    5 (completely helpful): Response is useful and very comprehensive with well-defined key details to address the needs in the instruction and usually beyond what explicitly asked. The user would feel very satisfied with the content in the response.
    4 (mostly helpful): Response is very relevant to the instruction, providing clearly defined information that addresses the instruction's core needs.  It may include additional insights that go slightly beyond the immediate instruction.  The user would feel quite satisfied with the content in the response.
    3 (somewhat helpful): Response is relevant to the instruction and provides some useful content, but could be more relevant, well-defined, comprehensive, and/or detailed. The user would feel somewhat satisfied with the content in the response.
    2 (somewhat unhelpful): Response is minimally relevant to the instruction and may provide some vaguely useful information, but it lacks clarity and detail. It might contain minor inaccuracies. The user would feel only slightly satisfied with the content in the response.
    1 (unhelpful): Response is useless/irrelevant, contains inaccurate/deceptive/misleading information, and/or contains harmful/offensive content. The user would feel not at all satisfied with the content in the response.
    
    ## Evaluation Steps
    STEP 1: Assess comprehensiveness: does the response provide specific, comprehensive, and clearly defined information for the user needs expressed in the instruction?
    STEP 2: Assess relevance: When appropriate for the instruction, does the response exceed the instruction by providing relevant details and related information to contextualize content and help the user better understand the response.
    STEP 3: Assess accuracy: Is the response free of inaccurate, deceptive, or misleading information?
    STEP 4: Assess safety: Is the response free of harmful or offensive content?
    
    Give step by step explanations for your scoring, and only choose scores from 5, 4, 3, 2, 1.
    
    
    # User Inputs and AI-generated Response
    ## User Inputs
    ### Prompt
    {prompt}
    
    ## AI-generated Response
    {response}
    """
    
  3. Instanziieren Sie PointwiseMetric-Objekte für die beiden benutzerdefinierten Messwerte. Dadurch werden Ihre Prompt-Vorlagen in wiederverwendbare Komponenten für den Bewertungsjob verpackt. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    relevance = PointwiseMetric(
        metric="relevance",
        metric_prompt_template=relevance_prompt_template,
    )
    
    helpfulness = PointwiseMetric(
        metric="helpfulness",
        metric_prompt_template=helpfulness_prompt_template,
    )
    

Für Ihren Bewertungsjob stehen jetzt zwei neue, wiederverwendbare Messwerte (relevance und helpfulness) zur Verfügung.

9. Bewertungsjob ausführen

Nachdem die Datasets und Messwerte bereit sind, können Sie die Auswertung ausführen. Dazu erstellen Sie für jedes Dataset, das Sie testen möchten, ein EvalTask-Objekt.

Ein EvalTask fasst die Komponenten für einen Bewertungsdurchlauf zusammen:

  • dataset: Der DataFrame mit Ihren Prompts und Antworten.
  • metrics: Die Liste der Messwerte, anhand derer Sie die Leistung bewerten möchten.
  • experiment: Das Vertex AI-Experiment, in dem die Ergebnisse protokolliert werden, damit Sie Ausführungen nachverfolgen und vergleichen können.
  1. Erstellen Sie für jedes Modell eine EvalTask. In diesem Objekt werden das Dataset, die Messwerte und der Name des Tests zusammengefasst. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus, um die Aufgaben zu konfigurieren:
    rag_eval_task_rag_a = EvalTask(
        dataset=eval_dataset_rag_a,
        metrics=[
            "question_answering_quality",
            relevance,
            helpfulness,
            "groundedness",
            "safety",
            "instruction_following",
        ],
        experiment=EXPERIMENT,
    )
    
    rag_eval_task_rag_b = EvalTask(
        dataset=eval_dataset_rag_b,
        metrics=[
            "question_answering_quality",
            relevance,
            helpfulness,
            "groundedness",
            "safety",
            "instruction_following",
        ],
        experiment=EXPERIMENT,
    )
    
    Sie haben jetzt zwei EvalTask-Objekte konfiguriert, eines für jede Gruppe von Modellantworten. Die von Ihnen bereitgestellte Liste metrics veranschaulicht eine wichtige Funktion des Evaluierungsdienstes: vordefinierte Messwerte (z.B. safety) und die benutzerdefinierten PointwiseMetric-Objekte.
  2. Nachdem Sie die Aufgaben konfiguriert haben, führen Sie sie durch Aufrufen der Methode .evaluate() aus. Die Aufgaben werden dann zur Verarbeitung an das Vertex AI-Backend gesendet. Das kann einige Minuten dauern. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus:
    result_rag_a = rag_eval_task_rag_a.evaluate()
    result_rag_b = rag_eval_task_rag_b.evaluate()
    

Nach Abschluss der Auswertung werden die Ergebnisse in den Objekten result_rag_a und result_rag_b gespeichert. Wir können sie dann im nächsten Abschnitt analysieren.

10. Ergebnisse analysieren

Die Ergebnisse der Auswertung sind jetzt verfügbar. Die Objekte result_rag_a und result_rag_b enthalten aggregierte Werte und detaillierte Erklärungen für jede Zeile. In dieser Aufgabe analysieren Sie diese Ergebnisse mit Hilfsfunktionen aus notebook_utils.

Aggregierte Zusammenfassungen ansehen

  1. Verwenden Sie die Hilfsfunktion display_eval_result(), um einen allgemeinen Überblick über die durchschnittliche Punktzahl für jeden Messwert zu erhalten. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus, um die Zusammenfassung für Modell A aufzurufen:
    notebook_utils.display_eval_result(
        title="Model A Eval Result", eval_result=result_rag_a
    )
    
  2. Wiederholen Sie den Vorgang für Modell B. Fügen Sie diesen Code in eine neue Zelle ein und führen Sie ihn aus:
    notebook_utils.display_eval_result(
        title="Model B Eval Result",
        eval_result=result_rag_b,
    )
    

Bewertungsergebnisse visualisieren

Diagramme können den Vergleich der Modellleistung erleichtern. Sie verwenden zwei Arten von Visualisierungen:

  • Radardiagramm: Hier wird die Gesamtleistung jedes Modells dargestellt. Eine größere Form weist auf eine bessere Gesamtleistung hin.
  • Balkendiagramm: Für einen direkten, nebeneinanderliegenden Vergleich der einzelnen Messwerte.

Mithilfe dieser Visualisierungen können Sie die Modelle anhand subjektiver Kriterien wie Relevanz, Fundiertheit und Nützlichkeit vergleichen.

  1. Kombinieren Sie die Ergebnisse in einer einzigen Liste von Tupeln, um sie für das Erstellen von Diagrammen vorzubereiten. Jedes Tupel sollte einen Modellnamen und das entsprechende Ergebnisobjekt enthalten. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus:
    eval_results = []
    eval_results.append(("Model A", result_rag_a))
    eval_results.append(("Model B", result_rag_b))
    
  2. Erstellen Sie nun ein Radardiagramm, um die Modelle anhand aller Messwerte gleichzeitig zu vergleichen. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    notebook_utils.display_radar_plot(
        eval_results,
        metrics=[
        "question_answering_quality",
        "safety",
        "groundedness",
        "instruction_following",
        "relevance",
        "helpfulness",
        ],
    )
    
    Eine größere Form deutet auf eine bessere Gesamtleistung hin.
  3. Für einen direkteren Vergleich der einzelnen Messwerte können Sie ein Balkendiagramm erstellen. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus:
    notebook_utils.display_bar_plot(
        eval_results,
        metrics=[
        "question_answering_quality",
        "safety",
        "groundedness",
        "instruction_following",
        "relevance",
        "helpfulness",
        ],
    )
    
    In dieser Visualisierung lässt sich die Leistungslücke zwischen den beiden Modellen leicht erkennen.

Die Visualisierungen zeigen deutlich, dass die Leistung von Modell A (die große Form im Radardiagramm und die hohen Balken im Balkendiagramm) besser ist als die von Modell B.

Detaillierte Erklärung für eine einzelne Instanz ansehen

Zusammengefasste Werte geben die Gesamtleistung an. Wenn Sie nachvollziehen möchten, warum ein Modell eine bestimmte Leistung erbracht hat, müssen Sie sich die detaillierten Erklärungen ansehen, die vom Evaluator-LLM für jedes Beispiel generiert wurden.

  1. Mit der Hilfsfunktion display_explanations() können Sie einzelne Ergebnisse prüfen. Wenn Sie die detaillierte Aufschlüsselung für das zweite Beispiel (num=2) aus den Ergebnissen von Modell A sehen möchten, fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    notebook_utils.display_explanations(result_rag_a, num=2)
    
  2. Sie können diese Funktion auch verwenden, um alle Beispiele nach einem bestimmten Messwert zu filtern. Das ist nützlich, um Fehler in einem bestimmten Bereich mit schlechter Leistung zu beheben. Wenn Sie sehen möchten, warum Modell B beim Messwert groundedness so schlecht abgeschnitten hat, fügen Sie diesen Code in eine neue Zelle ein und führen Sie ihn aus:
    notebook_utils.display_explanations(result_rag_b, metrics=["groundedness"])
    
    So erhalten Sie konkretes Feedback dazu, wo das Modell Fehler macht. Das ist wichtig für iterative Verbesserungen.

11. Referenzierte Bewertung anhand einer „goldenen Antwort“

Bisher haben Sie eine referenzfreie Bewertung durchgeführt, bei der die Antwort des Modells nur auf Grundlage des Prompts bewertet wurde. Diese Methode ist nützlich, aber die Bewertung ist subjektiv.

Jetzt verwenden Sie die referenzierte Bewertung. Mit dieser Methode wird dem Dataset eine „richtige Antwort“ (auch als Referenzantwort bezeichnet) hinzugefügt. Wenn Sie die Antwort des Modells mit einer Ground-Truth-Antwort vergleichen, erhalten Sie ein objektiveres Maß für die Leistung. So können Sie Folgendes messen:

  • Faktische Richtigkeit: Entspricht die Antwort des Modells den Fakten in der Golden Answer?
  • Semantische Ähnlichkeit: Hat die Antwort des Modells dieselbe Bedeutung wie die Referenzantwort?
  • Vollständigkeit: Enthält die Antwort des Modells alle wichtigen Informationen aus der Referenzantwort?

Referenziertes Dataset vorbereiten

Für eine referenzierte Bewertung müssen Sie jedem Beispiel in Ihrem Dataset eine „richtige Antwort“ hinzufügen.

Beginnen wir mit der Definition einer golden_answers-Liste. Ein Vergleich der Referenzantworten mit den Antworten von Modell A zeigt den Wert dieser Methode:

  • Frage 1 (Brain): Die generierte Antwort und die Musterantwort sind identisch. Modell A ist richtig.
  • Frage 2 (Senat): Die Antworten sind semantisch ähnlich, aber unterschiedlich formuliert. Ein guter Messwert sollte dies berücksichtigen.
  • Frage 3 (Hasan-Jalalians): Die Antwort von Modell A ist laut Kontext sachlich falsch. Der golden_answer gibt diesen Fehler aus.
  1. Definieren Sie in einer neuen Zelle die Liste der golden_answers.
    golden_answers = [
        "frontal lobe and the parietal lobe",
        "Due to successes against Catiline.",
        "The Hasan-Jalalians commanded the area of Artsakh and Utik.",
    ]
    
  2. Erstellen Sie die referenzierten DataFrames für die Auswertung, indem Sie diesen Code in der folgenden Zelle ausführen:
    referenced_eval_dataset_rag_a = pd.DataFrame(
        {
            "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
            ],
            "response": generated_answers_by_rag_a,
            "reference": golden_answers,
        }
    )
    
    referenced_eval_dataset_rag_b = pd.DataFrame(
        {
            "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
            ],
            "response": generated_answers_by_rag_b,
            "reference": golden_answers,
        }
    )
    
    In diesem Code werden die golden_answers mit den vorhandenen Variablen kombiniert, die Sie zuvor erstellt haben.

Die Datasets sind jetzt für die referenzierte Bewertung bereit.

Benutzerdefinierten Referenzmesswert erstellen

Sie können auch benutzerdefinierte Messwerte für die Referenzbewertung erstellen. Der Prozess ist ähnlich, aber die Promptvorlage enthält jetzt den Platzhalter {reference} für die beste Antwort.

Bei einer eindeutigen „richtigen“ Antwort können Sie eine strengere, binäre Bewertung verwenden (z.B. 1 für richtig, 0 für falsch), um die sachliche Richtigkeit zu messen. Erstellen wir einen neuen question_answering_correctness-Messwert, in dem diese Logik implementiert wird.

  1. Definieren Sie die Prompt-Vorlage. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus:
    question_answering_correctness_prompt_template = """
    You are a professional writing evaluator. Your job is to score writing responses according to pre-defined evaluation criteria.
    
    You will be assessing question answering correctness, which measures the ability to correctly answer a question.
    
    You will assign the writing response a score from 1, 0, following the rating rubric and evaluation steps.
    
    ### Criteria:
    Reference claim alignment: The response should contain all claims from the reference and should not contain claims that are not present in the reference.
    
    ### Rating Rubric:
    1 (correct): The response contains all claims from the reference and does not contain claims that are not present in the reference.
    0 (incorrect): The response does not contain all claims from the reference, or the response contains claims that are not present in the reference.
    
    ### Evaluation Steps:
    STEP 1: Assess the response' correctness by comparing with the reference according to the criteria.
    STEP 2: Score based on the rubrics.
    
    Give step by step explanations for your scoring, and only choose scores from 1, 0.
    
    
    # User Inputs and AI-generated Response
    ## User Inputs
    ### Prompt
    {prompt}
    
    ## Reference
    {reference}
    
    ## AI-generated Response
    {response}
    
    """
    
    Diese Vorlage weist das LLM für die Bewertung an, einen strengen Vergleich zwischen der {response} des Modells und der goldenen {reference}-Antwort durchzuführen und sie entweder als richtig (1) oder falsch (0) zu bewerten.
  2. Schließen Sie den Prompt-Vorlagenstring in ein PointwiseMetric-Objekt ein. Dadurch erhält Ihr Messwert einen formalen Namen und wird zu einer wiederverwendbaren Komponente für den Bewertungsjob. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    question_answering_correctness = PointwiseMetric(
        metric="question_answering_correctness",
        metric_prompt_template=question_answering_correctness_prompt_template,
    )
    

Sie haben jetzt einen benutzerdefinierten, referenzierten Messwert für eine strenge Faktenprüfung.

12. Referenzierte Bewertung ausführen

Als Nächstes konfigurieren Sie den Bewertungsjob mit den referenzierten Datasets und dem neuen Messwert. Sie verwenden wieder die Klasse EvalTask.

Die Liste der Messwerte enthält jetzt Ihren benutzerdefinierten modellbasierten Messwert sowie rechenbasierte Messwerte. Bei der referenzierten Bewertung können herkömmliche, auf Berechnungen basierende Messwerte verwendet werden, mit denen mathematische Vergleiche zwischen dem generierten Text und dem Referenztext durchgeführt werden. Sie verwenden drei gängige:

  • exact_match: Gibt nur dann 1 zurück, wenn die generierte Antwort mit der Referenzantwort identisch ist, andernfalls 0.
  • bleu: Ein Messwert für die Präzision. Er gibt an, wie viele Wörter aus der generierten Antwort auch in der Referenzantwort vorkommen.
  • rouge: Ein Messwert für den Recall. Sie gibt an, wie viele Wörter aus der Referenzantwort in der generierten Antwort enthalten sind.
  1. Konfigurieren Sie den Bewertungsjob mit den referenzierten Datasets und der neuen Kombination von Messwerten. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus, um die EvalTask-Objekte zu erstellen:
    referenced_answer_eval_task_rag_a = EvalTask(
        dataset=referenced_eval_dataset_rag_a,
        metrics=[
        question_answering_correctness,
        "rouge",
        "bleu",
        "exact_match",
        ],
        experiment=EXPERIMENT,
    )
    
    referenced_answer_eval_task_rag_b = EvalTask(
        dataset=referenced_eval_dataset_rag_b,
        metrics=[
        question_answering_correctness,
        "rouge",
        "bleu",
        "exact_match",
        ],
        experiment=EXPERIMENT,
    )
    
  2. Führen Sie die referenzierte Bewertung aus, indem Sie die Methode .evaluate() aufrufen. Fügen Sie diesen Code in eine neue Zelle ein und führen Sie ihn aus:
    referenced_result_rag_a = referenced_answer_eval_task_rag_a.evaluate()
    referenced_result_rag_b = referenced_answer_eval_task_rag_b.evaluate()
    

13. Referenzierte Ergebnisse analysieren

Die Bewertung ist abgeschlossen. In dieser Aufgabe analysieren Sie die Ergebnisse, um die faktische Richtigkeit der Modelle zu messen, indem Sie ihre Antworten mit den goldenen Referenzantworten vergleichen.

Zusammenfassung der Ergebnisse ansehen

  • Analysieren Sie die zusammengefassten Ergebnisse für die referenzierte Auswertung. Fügen Sie in einer neuen Zelle den folgenden Code hinzu und führen Sie ihn aus, um die Zusammenfassungstabellen für beide Modelle aufzurufen:
    notebook_utils.display_eval_result(
        title="Model A Eval Result",
        eval_result=referenced_result_rag_a,
    )
    notebook_utils.display_eval_result(
        title="Model B Eval Result",
        eval_result=referenced_result_rag_b,
    )
    
    Sie werden feststellen, dass Modell A bei Ihrem benutzerdefinierten Messwert question_answering_correctness gut abschneidet, bei exact_match jedoch schlechter. Das zeigt den Wert von modellbasierten Messwerten, die semantische Ähnlichkeit und nicht nur identischen Text erkennen können.

Ergebnisse zum Vergleich visualisieren

Visualisierungen können die Leistungslücke zwischen den beiden Modellen deutlicher machen. Kombinieren Sie zuerst die Ergebnisse in einer einzelnen Liste für die Darstellung und generieren Sie dann die Radar- und Balkendiagramme.

  1. Kombinieren Sie die referenzierten Bewertungsergebnisse in einer einzigen Liste für die Darstellung. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    referenced_eval_results = []
    referenced_eval_results.append(("Model A", referenced_result_rag_a))
    referenced_eval_results.append(("Model B", referenced_result_rag_b))
    
  2. Erstellen Sie ein Radardiagramm, um die Leistung der einzelnen Modelle für die neuen Messwerte zu visualisieren. Fügen Sie diesen Code in eine neue Zelle ein und führen Sie ihn aus:
    notebook_utils.display_radar_plot(
        referenced_eval_results,
        metrics=[
            "question_answering_correctness",
            "rouge",
            "bleu",
            "exact_match",
        ],
    )
    
  3. Erstellen Sie ein Balkendiagramm für einen direkten, nebeneinanderliegenden Vergleich. So sehen Sie, wie die einzelnen Modelle bei den verschiedenen Messwerten abgeschnitten haben. Fügen Sie den folgenden Code in eine neue Zelle ein und führen Sie ihn aus:
    notebook_utils.display_bar_plot(
        referenced_eval_results,
        metrics=[
            "question_answering_correctness",
            "rouge",
            "bleu",
            "exact_match",
        ],
    )
    

Diese Visualisierungen bestätigen, dass Modell A deutlich genauer ist und die Antworten faktisch besser mit den Referenzantworten übereinstimmen als bei Modell B.

14. Von der Übung zur Produktion

Sie haben eine vollständige Evaluierungspipeline für ein RAG-System erfolgreich ausgeführt. In diesem letzten Abschnitt werden die wichtigsten strategischen Konzepte zusammengefasst, die Sie kennengelernt haben. Außerdem wird ein Rahmen für die Anwendung dieser Fähigkeiten auf reale Projekte geboten.

Best Practices für die Produktion

Wenn Sie die in diesem Lab erworbenen Kenntnisse in einer realen Produktionsumgebung anwenden möchten, sollten Sie die folgenden vier wichtigen Praktiken berücksichtigen:

  • Automatisieren mit CI/CD:Binden Sie Ihre Evaluationssuite in eine CI/CD-Pipeline ein (z.B. Cloud Build, GitHub Actions). Führen Sie automatisch Bewertungen für Codeänderungen aus, um Regressionen zu erkennen und Bereitstellungen zu blockieren, wenn die Qualitätswerte unter Ihre Standards fallen.
  • Datasets weiterentwickeln:Ein statisches Dataset wird mit der Zeit veraltet. Verwenden Sie die Versionsverwaltung für Ihre „goldenen“ Testsets (mit Git LFS oder Cloud Storage) und fügen Sie kontinuierlich neue, anspruchsvolle Beispiele hinzu, indem Sie Stichproben aus echten (anonymisierten) Nutzeranfragen ziehen.
  • Nicht nur den Generator, sondern auch den Retriever bewerten:Ohne den richtigen Kontext ist eine gute Antwort unmöglich. Implementieren Sie einen separaten Bewertungsschritt für Ihr Abrufsystem mit Messwerten wie Trefferquote (wurde das richtige Dokument gefunden?) und Mean Reciprocal Rank (MRR) (wie weit oben wurde das richtige Dokument eingestuft?).
  • Messwerte im Zeitverlauf beobachten:Exportieren Sie zusammenfassende Werte aus Ihren Ausführungen von Evaluierungen in einen Dienst wie Google Cloud Monitoring. Erstellen Sie Dashboards, um Qualitätstrends zu verfolgen, und richten Sie automatische Benachrichtigungen ein, um über erhebliche Leistungsabfälle informiert zu werden.

Matrix für fortgeschrittene Bewertungsmethoden

Die Wahl des richtigen Auswertungsansatzes hängt von Ihren spezifischen Zielvorhaben ab. In dieser Tabelle sehen Sie, wann die einzelnen Methoden verwendet werden sollten.

Evaluierungsansatz

Ideale Anwendungsfälle

Hauptvorteile

Einschränkungen

Referenzfrei

Produktionsüberwachung, kontinuierliche Bewertung

Keine „goldenen Antworten“ erforderlich, erfasst subjektive Qualität

Teurer, potenzielle Verzerrung durch den Prüfer

Referenzbasiert

Modellvergleich, Benchmarking

Objektive Messung, schnellere Berechnung

Erfordert „goldene Antworten“, semantische Äquivalenz wird möglicherweise nicht berücksichtigt

Benutzerdefinierte Messwerte

Bereichsspezifische Bewertung

Auf Geschäftsanforderungen zugeschnitten

Validierung und Entwicklungsaufwand erforderlich

Hybridansatz

Umfassende Produktionssysteme

Das Beste aus allen Ansätzen

Höhere Komplexität, Kostenoptimierung erforderlich

Wichtige technische Informationen

Behalten Sie diese Grundsätze im Hinterkopf, wenn Sie Ihre eigenen RAG-Systeme entwickeln und bewerten:

  • Fundierung ist entscheidend für RAG: Dieser Messwert unterscheidet konsequent zwischen hochwertigen und minderwertigen RAG-Systemen und ist daher für die Produktionsüberwachung unerlässlich.
  • Mehrere Messwerte sorgen für Robustheit: Kein einzelner Messwert erfasst alle Aspekte der RAG-Qualität. Für eine umfassende Bewertung sind mehrere Bewertungsdimensionen erforderlich.
  • Benutzerdefinierte Messwerte bieten einen erheblichen Mehrwert: Domainspezifische Bewertungskriterien erfassen oft Nuancen, die bei allgemeinen Messwerten nicht berücksichtigt werden, wodurch die Genauigkeit der Bewertung verbessert wird.
  • Statistische Strenge schafft Vertrauen: Durch geeignete Stichprobengrößen und Signifikanztests wird die Bewertung von Vermutungen in zuverlässige Entscheidungshilfen verwandelt.

Framework für Entscheidungen zur Produktionsbereitstellung

Verwenden Sie dieses stufenweise Framework als Leitfaden für zukünftige RAG-Systembereitstellungen:

  • Phase 1: Entwicklung: Verwenden Sie die referenzbasierte Bewertung mit bekannten Test-Datasets für den Modellvergleich und die Modellauswahl.
  • Phase 2: Vorproduktion: Führen Sie eine umfassende Bewertung durch, bei der beide Ansätze kombiniert werden, um die Produktionsbereitschaft zu validieren.
  • Phase 3: Produktion: Implementieren Sie die referenzfreie Überwachung für die kontinuierliche Qualitätsbewertung ohne Golden Answers.
  • Phase 4: Optimierung: Nutzen Sie die Erkenntnisse aus der Bewertung, um das Modell und das Abrufsystem zu verbessern.

15. Fazit

Glückwunsch! Sie haben das Lab abgeschlossen.

Dieses Lab ist Teil des Lernpfads „Produktionsreife KI mit Google Cloud“.

Zusammenfassung

Sie haben Folgendes gelernt:

  • Führen Sie eine referenzfreie Bewertung durch, um die Qualität einer Antwort auf Grundlage des abgerufenen Kontexts zu bewerten.
  • Führen Sie eine referenzierte Bewertung durch, indem Sie eine „richtige Antwort“ hinzufügen, um die faktische Richtigkeit zu messen.
  • Verwenden Sie für beide Ansätze eine Mischung aus vordefinierten und benutzerdefinierten Messwerten.
  • Verwenden Sie sowohl modellbasierte Messwerte (z. B. question_answering_quality) als auch berechnungsbasierte Messwerte (rouge, bleu, exact_match).
  • Ergebnisse analysieren und visualisieren, um die Stärken und Schwächen eines Modells zu verstehen.

Dieser Ansatz zur Bewertung hilft Ihnen, zuverlässigere und genauere Anwendungen für generative KI zu entwickeln.