Valutare i sistemi RAG con Vertex AI

1. Panoramica

In questo lab imparerai a creare una pipeline di valutazione per un sistema di generazione RAG (Retrieval-Augmented Generation). Utilizzerai Vertex AI Gen AI Evaluation Service per creare criteri di valutazione personalizzati e creare un framework di valutazione per un'attività di domanda e risposta.

Lavorerai con esempi del set di dati Stanford Question Answering Dataset (SQuAD 2.0) per preparare i set di dati di valutazione, configurare valutazioni senza riferimenti e basate su riferimenti e interpretare i risultati. Al termine di questo lab, avrai capito come valutare i sistemi RAG e perché vengono scelti determinati approcci di valutazione.

Nozioni di base sui set di dati

Lavoreremo con esempi accuratamente realizzati che coprono più domini trovati nel set di dati per la risposta alle domande SQuAD 2.0:

  • Neuroscienze: test dell'accuratezza tecnica in contesti scientifici
  • Storia: valutazione della precisione fattuale nelle narrazioni storiche
  • Geografia: valutazione delle conoscenze territoriali e politiche

Questa diversità ti aiuta a capire come gli approcci di valutazione vengono generalizzati in diverse aree tematiche.

Riferimenti

Obiettivi didattici

In questo lab imparerai a:

  • Prepara i set di dati di valutazione per i sistemi RAG.
  • Implementa la valutazione senza riferimenti utilizzando metriche come la fondatezza e la pertinenza.
  • Applica la valutazione basata su riferimenti con misure di similarità semantica.
  • Crea metriche di valutazione personalizzate con rubriche di valutazione dettagliate.
  • Interpreta e visualizza i risultati della valutazione per informare la selezione del modello.

2. Configurazione del progetto

Account Google

Se non hai ancora un Account Google personale, devi crearne uno.

Utilizza un account personale anziché un account di lavoro o della scuola.

Accedi alla console Google Cloud

Accedi a Google Cloud Console utilizzando un Account Google personale.

Abilita fatturazione

Riscatta 5 $di crediti Google Cloud (facoltativo)

Per partecipare a questo workshop, devi disporre di un account di fatturazione con del credito. Se prevedi di utilizzare la tua fatturazione, puoi saltare questo passaggio.

  1. Fai clic su questo link e accedi con un Account Google personale. Visualizzerai un messaggio simile a questo: Fai clic qui per andare alla pagina dei crediti
  2. Fai clic sul pulsante CLICCA QUI PER ACCEDERE AI TUOI CREDITI. Verrà visualizzata una pagina per configurare il profilo di fatturazione Configurare la pagina del profilo di fatturazione
  3. Fai clic su Conferma. Ora sei connesso a un account di fatturazione di prova di Google Cloud Platform. Screenshot della panoramica della fatturazione

Configurare un account di fatturazione personale

Se hai configurato la fatturazione utilizzando i crediti Google Cloud, puoi saltare questo passaggio.

Per configurare un account di fatturazione personale, vai qui per abilitare la fatturazione in Cloud Console.

Alcune note:

  • Il completamento di questo lab dovrebbe costare meno di 1 $in risorse cloud.
  • Per evitare ulteriori addebiti, puoi seguire i passaggi alla fine di questo lab per eliminare le risorse.
  • I nuovi utenti hanno diritto alla prova senza costi di 300$.

Crea un progetto (facoltativo)

Se non hai un progetto attuale che vuoi utilizzare per questo lab, creane uno nuovo qui.

3. Che cos'è la Retrieval Augmented Generation (RAG)?

La RAG è una tecnica utilizzata per migliorare l'accuratezza e la pertinenza delle risposte dei modelli linguistici di grandi dimensioni (LLM). Collega l'LLM a una knowledge base esterna per basare le sue risposte su informazioni specifiche e verificabili.

La procedura prevede i seguenti passaggi:

  1. Conversione della domanda di un utente in una rappresentazione numerica (un embedding).
  2. Ricerca nella knowledge base di documenti con embedding simili.
  3. Fornendo questi documenti pertinenti come contesto all'LLM insieme alla domanda originale per generare una risposta.

Scopri di più su RAG.

Che cosa rende complessa la valutazione RAG?

La valutazione dei sistemi RAG è diversa dalla valutazione dei modelli linguistici tradizionali.

La sfida multi-componente: i sistemi RAG combinano tre operazioni che possono essere ciascuna un punto di errore:

  • Qualità del recupero: il sistema ha trovato i documenti contestuali giusti?
  • Utilizzo del contesto: il modello ha utilizzato in modo efficace le informazioni recuperate?
  • Qualità della generazione: la risposta finale è ben scritta, utile e accurata?

Una risposta può non andare a buon fine se uno di questi componenti non funziona come previsto. Ad esempio, il sistema potrebbe recuperare il contesto corretto, ma il modello lo ignora. In alternativa, il modello potrebbe generare una risposta ben scritta ma errata perché il contesto recuperato era irrilevante.

4. Configura l'ambiente Vertex AI Workbench

Iniziamo creando un nuovo ambiente notebook in cui eseguiremo il codice necessario per valutare i sistemi RAG.

  1. Vai alla pagina API e servizi della console Cloud.
  2. Fai clic su Abilita per l'API Vertex AI.Dashboard Vertex

Accedere a Vertex AI Workbench

  1. Nella console Google Cloud, vai a Vertex AI facendo clic sul menu di navigazione ☰ > Vertex AI > Workbench.
  2. Crea una nuova istanza di workbench.Crea Workbench
  3. Assegna all'istanza workbench il nome evaluation-workbench.
  4. Seleziona la regione e la zona se questi valori non sono ancora impostati.
  5. Fai clic su Crea.Assegna un nome a Workbench
  6. Attendi la configurazione del workbench. L'operazione potrebbe richiedere alcuni minuti.Await Workbench
  7. Una volta eseguito il provisioning del workbench, fai clic su Apri JupyterLab.Apri Workbench
  8. In Workbench, crea un nuovo notebook Python3.Crea notebook

Per saperne di più sulle funzionalità e sulle capacità di questo ambiente, consulta la documentazione ufficiale di Vertex AI Workbench.

Installa l'SDK Vertex AI Evaluation

Ora installiamo l'SDK di valutazione specializzato che fornisce gli strumenti per la valutazione RAG.

  1. Nella prima cella del notebook, aggiungi ed esegui l'istruzione di importazione riportata di seguito (MAIUSC+INVIO) per installare l'SDK Vertex AI (con i componenti di valutazione).
    %pip install --upgrade --user --quiet google-cloud-aiplatform[evaluation]
    
    In questo modo viene installato l'SDK Vertex AI con le estensioni di valutazione che includono:
    • EvalTask: la classe principale per l'esecuzione delle valutazioni
    • MetricPromptTemplateExamples: metriche di valutazione predefinite
    • PointwiseMetric: framework per la creazione di metriche personalizzate
    • notebook_utils: strumenti di visualizzazione per l'analisi dei risultati
  2. Importante: dopo l'installazione, dovrai riavviare il kernel per utilizzare i nuovi pacchetti. Nella barra dei menu nella parte superiore della finestra di JupyterLab, vai a Kernel > Riavvia kernel.

5. Inizializzare l'SDK e importare le librerie

Prima di poter creare la pipeline di valutazione, devi configurare l'ambiente. Ciò comporta la configurazione dei dettagli del progetto, l'inizializzazione dell'SDK Vertex AI per connettersi a Google Cloud e l'importazione delle librerie Python specializzate che utilizzerai per la valutazione.

  1. Definisci le variabili di configurazione per il job di valutazione. In una nuova cella, aggiungi ed esegui il seguente codice per impostare PROJECT_ID, LOCATION e un nome EXPERIMENT per organizzare questa esecuzione.
    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. Inizializza l'SDK Vertex AI. In una nuova cella, aggiungi ed esegui il seguente codice.
    vertexai.init(project=PROJECT_ID, location=LOCATION)
    
    Questo passaggio autentica e connette il notebook al tuo progetto Google Cloud.
  3. Importa le classi necessarie dall'SDK di valutazione eseguendo il seguente codice nella cella successiva:
    import pandas as pd
    from vertexai.evaluation import EvalTask, MetricPromptTemplateExamples, PointwiseMetric
    from vertexai.preview.evaluation import notebook_utils
    
    Ecco un riepilogo di ogni importazione:
    • pandas: per creare e gestire i dati nei DataFrame.
    • EvalTask: la classe principale che esegue un job di valutazione.
    • MetricPromptTemplateExamples: fornisce l'accesso alle metriche di valutazione predefinite di Google.
    • PointwiseMetric: il framework per creare metriche personalizzate.
    • notebook_utils: una raccolta di strumenti per visualizzare i risultati.

6. Prepara il set di dati di valutazione

Un set di dati ben strutturato è la base di qualsiasi valutazione affidabile. Per i sistemi RAG, il set di dati deve contenere due campi chiave per ogni esempio:

  • Prompt: l'input totale fornito al modello linguistico. Devi combinare la domanda dell'utente con il contesto recuperato dal sistema RAG (prompt = User Question + Retrieved Context). Questo è importante per consentire al servizio di valutazione di sapere quali informazioni ha utilizzato il modello per creare la risposta.
  • Risposta: questa è la risposta finale prodotta dal modello RAG.

Per risultati statisticamente affidabili, è consigliabile un set di dati di circa 100 esempi. Per questo lab, utilizzerai un piccolo set di dati per dimostrare la procedura.

Creiamo i set di dati. Inizierai con un elenco di domande e il retrieved_contexts di un sistema RAG. Definisci quindi due set di risposte: uno da un modello che sembra funzionare bene (generated_answers_by_rag_a) e uno da un modello che funziona male (generated_answers_by_rag_b).

Infine, combinerai questi elementi in due DataFrame Pandas, eval_dataset_rag_a e eval_dataset_rag_b, seguendo la struttura descritta sopra.

  1. In una nuova cella, aggiungi ed esegui il seguente codice per definire le domande e i due insiemi di generated_answers.
    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.",
    ]
    
    Definisce i componenti principali del set di dati: le domande, i passaggi di contesto lunghi recuperati da un sistema RAG per ogni domanda e le risposte generate da due modelli diversi (un modello A ad alto rendimento e un modello B a basso rendimento).
  2. Definisci retrieved_contexts. Aggiungi ed esegui il seguente codice in una nuova cella.
    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.",
    ]
    
    Ora che hai tutti i componenti non elaborati, li combinerai nei DataFrame Pandas strutturati richiesti dal servizio di valutazione.
  3. In una nuova cella, aggiungi ed esegui il seguente codice per creare eval_dataset_rag_a e eval_dataset_rag_b.
    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. Esegui il seguente codice in una nuova cella per visualizzare le prime righe del set di dati per il modello A.
    eval_dataset_rag_a
    
    Si tratta di una buona pratica per assicurarsi che sia stato creato correttamente.

7. Selezionare e creare metriche

Ora che i set di dati sono pronti, puoi decidere come misurare il rendimento. Puoi utilizzare una o più metriche per valutare il modello. Ogni metrica valuta un aspetto specifico della risposta del modello, ad esempio la sua accuratezza o pertinenza.

Puoi utilizzare una combinazione di due tipi di metriche:

  • Metriche predefinite: metriche pronte all'uso fornite dall'SDK per le attività di valutazione comuni.
  • Metriche personalizzate: metriche che definisci per verificare le qualità pertinenti al tuo caso d'uso.

In questa sezione, esplorerai le metriche predefinite disponibili per RAG.

Esplorare le metriche predefinite

L'SDK include diverse metriche integrate per valutare i sistemi di risposta alle domande. Queste metriche utilizzano un modello linguistico come "valutatore" per assegnare un punteggio alle risposte del modello in base a un insieme di istruzioni.

  1. In una nuova cella, aggiungi ed esegui il seguente codice per visualizzare l'elenco completo dei nomi delle metriche predefinite:
    MetricPromptTemplateExamples.list_example_metric_names()
    
    Viene generato un elenco di metriche disponibili che puoi utilizzare immediatamente.
  2. Per capire come funzionano queste metriche, puoi esaminare i modelli di prompt sottostanti. In una nuova cella, aggiungi ed esegui il seguente codice per visualizzare le istruzioni fornite all'LLM di valutazione per la metrica question_answering_quality.
    # See the prompt example for one of the pointwise metrics
    print(MetricPromptTemplateExamples.get_prompt_template("question_answering_quality"))
    

8. Crea metriche personalizzate

Oltre alle metriche predefinite, puoi creare metriche personalizzate per valutare i criteri specifici del tuo caso d'uso. Per creare una metrica personalizzata, scrivi un modello di prompt che indica all'LLM di valutazione come assegnare un punteggio a una risposta.

La creazione di una metrica personalizzata prevede due passaggi:

  1. Definisci il modello di prompt: una stringa che contiene le istruzioni per l'LLM di valutazione. Un buon modello include un ruolo chiaro, criteri di valutazione, una griglia di valutazione e segnaposto come {prompt} e {response}.
  2. Crea un'istanza di un oggetto PointwiseMetric: racchiudi la stringa del modello di prompt all'interno di questa classe e assegna un nome alla metrica.

Creerai due metriche personalizzate per valutare la pertinenza e l'utilità delle risposte del sistema RAG.

  1. Definisci il modello di prompt per la metrica di pertinenza. Questo modello fornisce una rubrica dettagliata per l'LLM di valutazione. In una nuova cella, aggiungi ed esegui il seguente codice:
    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. Definisci il modello di prompt per la metrica di utilità utilizzando lo stesso approccio. Aggiungi ed esegui il seguente codice in una nuova cella:
    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. Crea istanze di oggetti PointwiseMetric per le due metriche personalizzate. In questo modo, i modelli di prompt vengono inseriti in componenti riutilizzabili per il job di valutazione. Aggiungi ed esegui il seguente codice in una nuova cella:
    relevance = PointwiseMetric(
        metric="relevance",
        metric_prompt_template=relevance_prompt_template,
    )
    
    helpfulness = PointwiseMetric(
        metric="helpfulness",
        metric_prompt_template=helpfulness_prompt_template,
    )
    

Ora hai a disposizione due nuove metriche riutilizzabili (relevance e helpfulness) pronte per il tuo job di valutazione.

9. Esegui il job di valutazione

Ora che i set di dati e le metriche sono pronti, puoi eseguire la valutazione. A questo scopo, crea un oggetto EvalTask per ogni set di dati che vuoi testare.

Un EvalTask raggruppa i componenti per un'esecuzione di valutazione:

  • dataset: il DataFrame contenente i prompt e le risposte.
  • metriche: l'elenco delle metriche rispetto alle quali vuoi calcolare il punteggio.
  • experiment: l'esperimento Vertex AI in cui registrare i risultati, per aiutarti a monitorare e confrontare le esecuzioni.
  1. Crea un EvalTask per ogni modello. Questo oggetto raggruppa il set di dati, le metriche e il nome dell'esperimento. Aggiungi ed esegui il seguente codice in una nuova cella per configurare le attività:
    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,
    )
    
    Ora hai configurato due oggetti EvalTask, uno per ogni insieme di risposte del modello. L'elenco metrics che hai fornito dimostra una funzionalità chiave del servizio di valutazione: metriche predefinite (ad es. safety) e oggetti PointwiseMetric personalizzati.
  2. Con le attività configurate, eseguile chiamando il metodo .evaluate(). Le attività vengono inviate al backend di Vertex AI per l'elaborazione e il completamento potrebbe richiedere diversi minuti. In una nuova cella, aggiungi ed esegui il seguente codice:
    result_rag_a = rag_eval_task_rag_a.evaluate()
    result_rag_b = rag_eval_task_rag_b.evaluate()
    

Una volta completata la valutazione, i risultati verranno archiviati negli oggetti result_rag_a e result_rag_b, pronti per essere analizzati nella sezione successiva.

10. Analizzare i risultati

I risultati della valutazione sono ora disponibili. Gli oggetti result_rag_a e result_rag_b contengono i punteggi aggregati e spiegazioni dettagliate per ogni riga. In questa attività, analizzerai questi risultati utilizzando le funzioni di assistenza di notebook_utils.

Visualizzare i riepiloghi aggregati

  1. Per una panoramica di alto livello, utilizza la funzione helper display_eval_result() per visualizzare il punteggio medio per ogni metrica. In una nuova cella, aggiungi ed esegui il seguente codice per visualizzare il riepilogo del modello A:
    notebook_utils.display_eval_result(
        title="Model A Eval Result", eval_result=result_rag_a
    )
    
  2. Fai lo stesso per il modello B. Aggiungi ed esegui questo codice in una nuova cella:
    notebook_utils.display_eval_result(
        title="Model B Eval Result",
        eval_result=result_rag_b,
    )
    

Visualizzare i risultati della valutazione

I grafici possono semplificare il confronto delle prestazioni del modello. Utilizzerai due tipi di visualizzazioni:

  • Grafico radar: mostra la "forma" complessiva del rendimento di ogni modello. Una forma più grande indica prestazioni complessive migliori.
  • Grafico a barre: per un confronto diretto e fianco a fianco di ogni metrica.

Queste visualizzazioni ti aiuteranno a confrontare i modelli in base a qualità soggettive come pertinenza, grounding e utilità.

  1. Per prepararti al tracciamento, combina i risultati in un unico elenco di tuple. Ogni tupla deve contenere il nome di un modello e l'oggetto risultato corrispondente. In una nuova cella, aggiungi ed esegui il seguente codice:
    eval_results = []
    eval_results.append(("Model A", result_rag_a))
    eval_results.append(("Model B", result_rag_b))
    
  2. Ora genera un grafico radar per confrontare i modelli in base a tutte le metriche contemporaneamente. Aggiungi ed esegui il seguente codice in una nuova cella:
    notebook_utils.display_radar_plot(
        eval_results,
        metrics=[
        "question_answering_quality",
        "safety",
        "groundedness",
        "instruction_following",
        "relevance",
        "helpfulness",
        ],
    )
    
    Una forma più grande indica prestazioni migliori a 360 gradi.
  3. Per un confronto più diretto su ogni metrica, genera un grafico a barre. In una nuova cella, aggiungi ed esegui questo codice:
    notebook_utils.display_bar_plot(
        eval_results,
        metrics=[
        "question_answering_quality",
        "safety",
        "groundedness",
        "instruction_following",
        "relevance",
        "helpfulness",
        ],
    )
    
    Questa visualizzazione consente di vedere facilmente il divario di rendimento tra i due modelli.

Le visualizzazioni mostreranno chiaramente che le prestazioni del modello A (la forma grande nel grafico radar e le barre alte nel grafico a barre) sono superiori a quelle del modello B.

Visualizzare la spiegazione dettagliata di una singola istanza

I punteggi aggregati mostrano il rendimento complessivo. Per capire perché un modello si è comportato in un determinato modo, devi esaminare le spiegazioni dettagliate generate dal modello LLM di valutazione per ogni esempio.

  1. La funzione helper display_explanations() consente di esaminare i singoli risultati. Per visualizzare la suddivisione dettagliata del secondo esempio (num=2) dai risultati del modello A, aggiungi ed esegui il seguente codice in una nuova cella:
    notebook_utils.display_explanations(result_rag_a, num=2)
    
  2. Puoi anche utilizzare questa funzione per filtrare in base a una metrica specifica in tutti gli esempi. Ciò è utile per eseguire il debug di un'area specifica con prestazioni scarse. Per capire perché il modello B ha ottenuto risultati così scarsi per la metrica groundedness, aggiungi ed esegui questo codice in una nuova cella:
    notebook_utils.display_explanations(result_rag_b, metrics=["groundedness"])
    
    In questo modo, viene fornito un feedback specifico sui punti deboli del modello, il che è fondamentale per il miglioramento iterativo.

11. Valutazione di riferimento utilizzando una "risposta corretta"

In precedenza, eseguivi una valutazione senza riferimenti, in cui la risposta del modello veniva giudicata solo in base al prompt. Questo metodo è utile, ma la valutazione è soggettiva.

Ora utilizzerai la valutazione con riferimento. Questo metodo aggiunge una "risposta ideale" (chiamata anche risposta di riferimento) al set di dati. Il confronto della risposta del modello con una risposta basata su dati empirici reali fornisce una misurazione più oggettiva delle prestazioni. In questo modo, puoi misurare:

  • Correttezza oggettiva: la risposta del modello è in linea con i fatti della risposta di riferimento?
  • Similarità semantica: la risposta del modello ha lo stesso significato della risposta di riferimento?
  • Completezza: la risposta del modello contiene tutte le informazioni chiave della risposta di riferimento?

Prepara il set di dati a cui viene fatto riferimento

Per eseguire una valutazione con riferimenti, devi aggiungere una "risposta corretta" a ogni esempio nel set di dati.

Iniziamo definendo un elenco golden_answers. Il confronto tra le risposte di riferimento e quelle del modello A mostra il valore di questo metodo:

  • Domanda 1 (cervello): la risposta generata e la risposta corretta sono identiche. Il modello A è corretto.
  • Domanda 2 (Senato): le risposte sono semanticamente simili, ma formulate in modo diverso. Una buona metrica dovrebbe riconoscerlo.
  • Domanda 3 (Hasan-Jalalians): la risposta del modello A è oggettivamente errata in base al contesto. golden_answer espone questo errore.
  1. In una nuova cella, definisci l'elenco di 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. Crea i DataFrame di valutazione a cui viene fatto riferimento eseguendo questo codice nella cella seguente:
    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,
        }
    )
    
    Questo codice combina le golden_answers con le variabili esistenti che hai creato in precedenza.

I set di dati sono ora pronti per la valutazione di riferimento.

Creare una metrica personalizzata di riferimento

Puoi anche creare metriche personalizzate per la valutazione basata su riferimenti. Il processo è simile, ma il modello di prompt ora include il segnaposto {reference} per la risposta ideale.

Con una risposta "corretta" definitiva, puoi utilizzare un punteggio binario più rigoroso (ad es. 1 per corretto, 0 per errato) per misurare l'accuratezza dei fatti. Creiamo una nuova metrica question_answering_correctness che implementi questa logica.

  1. Definisci il template di prompt. In una nuova cella, aggiungi ed esegui il seguente codice:
    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}
    
    """
    
    Questo modello indica all'LLM di valutazione di eseguire un confronto rigoroso tra la {response} del modello e la risposta {reference} di riferimento, assegnando un punteggio di corretto (1) o errato (0).
  2. Inserisci la stringa del modello di prompt all'interno di un oggetto PointwiseMetric. In questo modo, la metrica ha un nome formale e diventa un componente riutilizzabile per il job di valutazione. Aggiungi ed esegui il seguente codice in una nuova cella:
    question_answering_correctness = PointwiseMetric(
        metric="question_answering_correctness",
        metric_prompt_template=question_answering_correctness_prompt_template,
    )
    

Ora hai una metrica personalizzata con riferimenti per un controllo rigoroso dei fatti.

12. Esegui la valutazione con riferimenti

Ora configurerai il job di valutazione con i set di dati a cui viene fatto riferimento e la nuova metrica. Utilizzerai di nuovo il corso EvalTask.

L'elenco delle metriche ora combina la metrica personalizzata basata sul modello con le metriche basate sul calcolo. La valutazione con riferimento consente l'utilizzo di metriche tradizionali basate sul calcolo che eseguono confronti matematici tra il testo generato e quello di riferimento. Ne utilizzerai tre comuni:

  • exact_match: assegna 1 solo se la risposta generata è identica alla risposta di riferimento, altrimenti assegna 0.
  • bleu: Una metrica di precisione. Misura il numero di parole della risposta generata che compaiono anche nella risposta di riferimento.
  • rouge: una metrica di richiamo. Misura il numero di parole della risposta di riferimento presenti nella risposta generata.
  1. Configura il job di valutazione con i set di dati a cui viene fatto riferimento e la nuova combinazione di metriche. In una nuova cella, aggiungi ed esegui il seguente codice per creare gli oggetti EvalTask:
    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. Esegui la valutazione a cui viene fatto riferimento chiamando il metodo .evaluate(). Aggiungi ed esegui questo codice in una nuova cella:
    referenced_result_rag_a = referenced_answer_eval_task_rag_a.evaluate()
    referenced_result_rag_b = referenced_answer_eval_task_rag_b.evaluate()
    

13. Analizza i risultati a cui viene fatto riferimento

La valutazione è stata completata. In questa attività, analizzerai i risultati per misurare l'accuratezza fattuale dei modelli confrontando le loro risposte con le risposte di riferimento.

Visualizza i risultati del riepilogo

  • Analizza i risultati del riepilogo per la valutazione a cui viene fatto riferimento. In una nuova cella, aggiungi ed esegui il seguente codice per visualizzare le tabelle riepilogative per entrambi i modelli:
    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,
    )
    
    Noterai che il modello A ha un buon rendimento per la metrica personalizzata question_answering_correctness, ma un punteggio inferiore per exact_match. Ciò evidenzia il valore delle metriche basate su modelli che possono riconoscere la somiglianza semantica, non solo il testo identico.

Visualizzare i risultati per il confronto

Le visualizzazioni possono rendere più evidente il divario di rendimento tra i due modelli. Per prima cosa, combina i risultati in un unico elenco per il tracciamento, poi genera i grafici radar e a barre.

  1. Combina i risultati della valutazione a cui viene fatto riferimento in un unico elenco per il tracciamento. Aggiungi ed esegui il seguente codice in una nuova cella:
    referenced_eval_results = []
    referenced_eval_results.append(("Model A", referenced_result_rag_a))
    referenced_eval_results.append(("Model B", referenced_result_rag_b))
    
  2. Genera un grafico radar per visualizzare il rendimento di ogni modello nel nuovo insieme di metriche. Aggiungi ed esegui questo codice in una nuova cella:
    notebook_utils.display_radar_plot(
        referenced_eval_results,
        metrics=[
            "question_answering_correctness",
            "rouge",
            "bleu",
            "exact_match",
        ],
    )
    
  3. Crea un grafico a barre per un confronto diretto e affiancato. In questo modo, vedrai il rendimento di ogni modello nelle diverse metriche. Aggiungi ed esegui il seguente codice in una nuova cella:
    notebook_utils.display_bar_plot(
        referenced_eval_results,
        metrics=[
            "question_answering_correctness",
            "rouge",
            "bleu",
            "exact_match",
        ],
    )
    

Queste visualizzazioni confermano che il modello A è significativamente più accurato e in linea con le risposte di riferimento rispetto al modello B.

14. Dalla pratica alla produzione

Hai eseguito correttamente una pipeline di valutazione completa per un sistema RAG. Questa sezione finale riassume i concetti strategici chiave che hai appreso e fornisce un framework per applicare queste competenze a progetti reali.

Best practice per la produzione

Per applicare le competenze acquisite in questo lab in un ambiente di produzione reale, considera queste quattro pratiche chiave:

  • Automatizza con CI/CD: integra la tua suite di valutazione in una pipeline CI/CD (ad es. Cloud Build, GitHub Actions). Esegui automaticamente valutazioni sulle modifiche al codice per rilevare regressioni e bloccare i deployment se i punteggi di qualità scendono al di sotto dei tuoi standard.
  • Evolvi i tuoi set di dati:un set di dati statico diventa obsoleto. Controlla le versioni dei tuoi set di test "golden" (utilizzando Git LFS o Cloud Storage) e aggiungi continuamente nuovi esempi impegnativi campionando query utente reali (anonimizzate).
  • Valuta il retriever, non solo il generatore: una risposta valida è impossibile senza il contesto giusto. Implementa un passaggio di valutazione separato per il sistema di recupero utilizzando metriche come Hit Rate (è stato trovato il documento giusto?) e Mean Reciprocal Rank (MRR) (a quale posizione è stato classificato il documento giusto?).
  • Monitora le metriche nel tempo:esporta i punteggi riepilogativi delle esecuzioni di valutazione in un servizio come Google Cloud Monitoring. Crea dashboard per monitorare le tendenze della qualità e configura avvisi automatici per ricevere notifiche in caso di cali significativi delle prestazioni.

Matrice della metodologia di valutazione avanzata

La scelta dell'approccio di valutazione giusto dipende dai tuoi obiettivi specifici. Questa matrice riassume quando utilizzare ciascun metodo.

Approccio di valutazione

Best Use Cases

Vantaggi principali

Limitazioni

Senza riferimenti

Monitoraggio della produzione, valutazione continua

Non sono necessarie risposte perfette, acquisisce la qualità soggettiva

Più costoso, potenziale bias del valutatore

Basato sui riferimenti

Confronto dei modelli, benchmarking

Misurazione oggettiva, calcolo più rapido

Richiede risposte perfette, potrebbe non rilevare l'equivalenza semantica

Metriche personalizzate

Valutazione specifica del dominio

Personalizzato in base alle esigenze aziendali

Richiede convalida, overhead di sviluppo

Approccio ibrido

Sistemi di produzione completi

Il meglio di tutti gli approcci

Maggiore complessità, è necessaria l'ottimizzazione dei costi

Informazioni tecniche chiave

Tieni a mente questi principi fondamentali quando crei e valuti i tuoi sistemi RAG:

  • L'accuratezza è fondamentale per RAG: questa metrica distingue in modo coerente i sistemi RAG di alta e bassa qualità, rendendola essenziale per il monitoraggio della produzione.
  • Più metriche forniscono robustezza: nessuna singola metrica acquisisce tutti gli aspetti della qualità RAG. La valutazione completa richiede più dimensioni di valutazione.
  • Le metriche personalizzate aggiungono un valore significativo: i criteri di valutazione specifici del dominio spesso acquisiscono sfumature che le metriche generiche non rilevano, migliorando l'accuratezza della valutazione.
  • Il rigore statistico consente di avere fiducia: dimensioni del campione e test di significatività adeguati trasformano la valutazione da congettura in strumenti affidabili per il processo decisionale.

Framework per la decisione di deployment della produzione

Utilizza questo framework in più fasi come guida per le implementazioni future del sistema RAG:

  • Fase 1 - Sviluppo: utilizza la valutazione basata su riferimenti con set di test noti per il confronto e la selezione dei modelli.
  • Fase 2 - Pre-produzione: esegui una valutazione completa combinando entrambi gli approcci per convalidare la preparazione alla produzione.
  • Fase 3 - Produzione: implementa il monitoraggio senza riferimenti per la valutazione continua della qualità senza risposte di riferimento.
  • Fase 4 - Ottimizzazione: utilizza gli approfondimenti della valutazione per guidare i miglioramenti del modello e del sistema di recupero.

15. Conclusione

Complimenti! Hai completato il lab.

Questo lab fa parte del percorso di apprendimento per l'AI pronta per la produzione con Google Cloud.

Riepilogo

Hai imparato a:

  • Esegui una valutazione senza riferimenti per valutare la qualità di una risposta in base al contesto recuperato.
  • Esegui la valutazione con riferimenti aggiungendo una "risposta corretta" per misurare l'accuratezza dei fatti.
  • Utilizza un mix di metriche predefinite e personalizzate per entrambi gli approcci.
  • Utilizza sia metriche basate su modelli (come question_answering_quality) sia metriche basate su calcoli (rouge, bleu, exact_match).
  • Analizza e visualizza i risultati per comprendere i punti di forza e di debolezza di un modello.

Questo approccio alla valutazione ti aiuta a creare applicazioni di AI generativa più affidabili e accurate.