Le valutazioni sono una forma di test che ti aiuta a convalidare le risposte dell'LLM e a garantire 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/google-ai
, @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"]
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
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 di 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:
- VertexAI Rapid Evaluators tramite il plug-in VertexAI.
- Valutazione dei criteri di LangChain tramite il plug-in LangChain.
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 retriever 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 daflowName
extractors
è un oggetto che specifica le sostituzioni dell'estrattore. Le chiavi attualmente supportate inextractors
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 passaggiofoo-step
per questa chiave.(trace) => string;
: per una maggiore flessibilità, puoi fornire una funzione che accetti una traccia Genkit e restituisca unstring
e specificare la logica di estrazione all'interno di questa funzione. Consultagenkit/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";
const ai = genkit({ plugins: [googleAI()] });
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);
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