Valutazione

Le valutazioni sono una forma di test che ti aiuta a convalidare le risposte dell'LLM e ad assicurarti che soddisfino i tuoi standard di qualità.

Firebase Genkit supporta gli strumenti di valutazione di terze parti tramite plug-in, abbinati a potenti funzionalità di osservabilità che forniscono informazioni sullo stato di runtime delle applicazioni basate su LLM. Gli strumenti di Genkit ti aiutano a estrarre automaticamente i dati, inclusi input, output e informazioni, dai passaggi intermedi per valutare la qualità end-to-end delle risposte dell'LLM e comprendere le prestazioni dei componenti di base del sistema.

Ad esempio, se hai un flusso RAG, Genkit estrae l'insieme di documenti restituito dal retriever in modo da poter valutare la qualità del retriever mentre viene eseguito nel contesto del flusso, come mostrato di seguito con le metriche di fedeltà e pertinenza della risposta di Genkit:

import { genkit } from 'genkit';
import { genkitEval, GenkitMetric } from '@genkit-ai/evaluator';
import { vertexAI, textEmbedding004, gemini15Flash } from '@genkit-ai/vertexai';

const ai = genkit({
  plugins: [
    vertexAI(),
    genkitEval({
      judge: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbedding004, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});

Nota:la configurazione precedente richiede l'installazione dei pacchetti genkit,@genkit-ai/googleai, @genkit-ai/evaluator e @genkit-ai/vertexai.

  npm install @genkit-ai/evaluator @genkit-ai/vertexai

Inizia definendo un insieme di input da utilizzare come set di dati di input chiamato testInputs.json. Questo set di dati di input rappresenta i casi di test che utilizzerai per generare l'output per la valutazione.

["Cheese", "Broccoli", "Spinach and Kale"]

Se il valutatore richiede un output di riferimento per valutare un flusso, puoi passare sia l'input sia l'output di riferimento utilizzando questo formato:

{
  "samples": [
    {
      "input": "What is the French word for Cheese?",
      "reference": "Fromage"
    },
    {
      "input": "What green vegetable looks like cauliflower?",
      "reference": "Broccoli"
    }
  ]
}

Tieni presente che puoi utilizzare qualsiasi tipo di dati JSON nel file JSON di input. Genkit li passerà al flusso con lo stesso tipo di dati.

Puoi quindi utilizzare il comando eval:flow per valutare il flusso in base ai casi di test forniti in testInputs.json.

genkit eval:flow menuSuggestionFlow --input testInputs.json

Se il flusso richiede l'autenticazione, puoi specificarla utilizzando l'argomento --auth:

genkit eval:flow menuSuggestionFlow --input testInputs.json --auth "{\"email_verified\": true}"

Per visualizzare i risultati della valutazione nell'interfaccia utente per gli sviluppatori, esegui:

genkit start

Poi vai a localhost:4000/evaluate.

In alternativa, puoi fornire un file di output per ispezionare l'output in un file JSON.

genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json

Nota:di seguito puoi vedere un esempio di come un LLM può aiutarti a generare i casi di test.

Valutatori supportati

Valutatori Genkit

Genkit include un numero limitato di valutatori nativi, ispirati a RAGAS, per aiutarti a iniziare:

  • Fedeltà
  • Pertinenza della risposta
  • Malvagità

Plug-in di valutazione

Genkit supporta valutatori aggiuntivi tramite plug-in come VertexAI Rapid Evaluators tramite il plug-in VertexAI.

Utilizzo avanzato

eval:flow è un modo pratico per valutare rapidamente il flusso, ma a volte potresti dover avere un maggiore controllo sui passaggi di valutazione. Questo può accadere se utilizzi un framework diverso e hai già alcuni risultati da valutare. Puoi eseguire tutti i passaggi eseguiti semimanualmente da eval:flow.

Puoi eseguire in batch il flusso Genkit e aggiungere un'etichetta univoca all'esecuzione, che verrà poi utilizzata per estrarre un set di dati di valutazione (un insieme di input, output e contesti).

Esegui il flusso sugli input di test:

genkit flow:batchRun myRagFlow test_inputs.json --output flow_outputs.json --label customLabel

Estrai i dati di valutazione:

genkit eval:extractData myRagFlow --label customLabel --output customLabel_dataset.json

I dati esportati verranno visualizzati come file JSON con ogni testCase nel seguente formato:

[
  {
    "testCaseId": string,
    "input": string,
    "output": string,
    "context": array of strings,
    "traceIds": array of strings,
  }
]

L'estrattore di dati individuerà automaticamente i recuperatori e aggiungerà i documenti prodotti all'array di contesto. Per impostazione predefinita, eval:run verrà eseguito su tutti gli valutatori configurati e, come per eval:flow, i risultati di eval:run verranno visualizzati nella pagina di valutazione dell'interfaccia utente per gli sviluppatori, all'indirizzo localhost:4000/evaluate.

Estrattori personalizzati

Puoi anche fornire estrattori personalizzati da utilizzare nei comandi eval:extractData e eval:flow. Gli estrattori personalizzati ti consentono di ignorare la logica di estrazione predefinita, offrendoti maggiore potenza nella creazione e nella valutazione dei set di dati.

Per configurare gli estrattori personalizzati, aggiungi un file di configurazione degli strumenti denominato genkit-tools.conf.js alla directory principale del progetto, se non ne hai già uno.

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

Nel file di configurazione degli strumenti, aggiungi il seguente codice:

module.exports = {
  evaluators: [
    {
      actionRef: '/flow/myFlow',
      extractors: {
        context: { outputOf: 'foo-step' },
        output: 'bar-step',
      },
    },
  ],
};

In questo esempio, configuri un'estrazione per il flusso myFlow. La configurazione aggira gli estrattori per i campi context e output e utilizza la logica predefinita per il campo input.

La specifica degli estrattori di valutazione è la seguente:

  • Il campo evaluators accetta un array di oggetti EvaluatorConfig, il cui ambito è definito da flowName
  • extractors è un oggetto che specifica le sostituzioni dell'estrattore. Le chiavi attualmente supportate in extractors sono [input, output, context]. I tipi di valore accettabili sono:
    • string: deve essere il nome di un passaggio, specificato come stringa. L'output di questo passaggio viene estratto per questa chiave.
    • { inputOf: string } o { outputOf: string }: questi oggetti rappresentano canali specifici (di input o di output) di un passaggio. Ad esempio, { inputOf: 'foo-step' } estrarrebbe l'input del passaggio foo-step per questa chiave.
    • (trace) => string;: per una maggiore flessibilità, puoi fornire una funzione che accetti una traccia Genkit e restituisca un string e specificare la logica di estrazione all'interno di questa funzione. Consulta genkit/genkit-tools/common/src/types/trace.ts per lo schema esatto di TraceData.

Nota: i dati estratti per tutti questi passaggi saranno una stringa JSON. Lo strumento analizzerà automaticamente questa stringa JSON al momento della valutazione. Se fornisci un estrattore di funzioni, assicurati che l'output sia una stringa JSON valida. Ad esempio: "Hello, world!" non è un JSON valido; "\"Hello, world!\"" è valido.

Esecuzione su set di dati esistenti

Per eseguire la valutazione su un set di dati già estratto:

genkit eval:run customLabel_dataset.json

Per l'output in una posizione diversa, utilizza il flag --output.

genkit eval:flow menuSuggestionFlow --input testInputs.json --output customLabel_evalresult.json

Per eseguire l'operazione su un sottoinsieme di valutatori configurati, utilizza il flag --evaluators e fornisci un elenco separato da virgole di valutatori per nome:

genkit eval:run customLabel_dataset.json --evaluators=genkit/faithfulness,genkit/answer_relevancy

Sintesi dei dati di test utilizzando un LLM

Ecco un esempio di flusso che utilizza un file PDF per generare possibili domande che gli utenti potrebbero porre in merito.

import { genkit, run, z } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { chunk } from "llm-chunk";
import path from 'path';

const ai = genkit({ plugins: [googleAI()] });

const chunkingConfig = {
  minLength: 1000, // number of minimum characters into chunk
  maxLength: 2000, // number of maximum characters into chunk
  splitter: 'sentence', // paragraph | sentence
  overlap: 100, // number of overlap chracters
  delimiters: '', // regex for base split method
} as any;

export const synthesizeQuestions = ai.defineFlow(
  {
    name: "synthesizeQuestions",
    inputSchema: z.string().describe("PDF file path"),
    outputSchema: z.array(z.string()),
  },
  async (filePath) => {
    filePath = path.resolve(filePath);
    // `extractText` loads the PDF and extracts its contents as text.
    // See our RAG documentation for more details. 
    const pdfTxt = await run("extract-text", () => extractText(filePath));

    const chunks = await run("chunk-it", async () =>
      chunk(pdfTxt, chunkingConfig)
    );

    const questions: string[] = [];
    for (var i = 0; i < chunks.length; i++) {
      const qResponse = await ai.generate({
        model: gemini15Flash,
        prompt: {
          text: `Generate one question about the text below: ${chunks[i]}`,
        },
      });
      questions.push(qResponse.text);
    }
    return questions;
  }
);

Puoi quindi utilizzare questo comando per esportare i dati in un file e utilizzarli per la valutazione.

genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json