Evaluación

Las evaluaciones son una forma de prueba que te ayuda a validar las respuestas de tu LLM y garantizar que cumplan con el estándar de calidad.

Firebase Genkit es compatible con herramientas de evaluación de terceros a través de complementos, junto con potentes funciones de observabilidad que proporcionan estadísticas sobre el estado del tiempo de ejecución de tus aplicaciones con LLM. Las herramientas de Genkit te ayudan a extraer automáticamente datos, como entradas, información y salidas, de pasos intermedios para evaluar la calidad de extremo a extremo de las respuestas de LLM y comprender el rendimiento de los componentes básicos de tu sistema.

Por ejemplo, si tienes un flujo RAG, Genkit extraerá el conjunto de documentos que mostró el retriever para que puedas evaluar la calidad de tu retriever mientras se ejecuta en el contexto del flujo, como se muestra a continuación con las métricas de fidelidad y relevancia de la respuesta de Genkit:

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

export default configureGenkit({
  plugins: [
    genkitEval({
      judge: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

Comienza por definir un conjunto de entradas que desees usar como un conjunto de datos de entrada llamado testInputs.json. Este conjunto de datos de entrada representa los casos de prueba que utilizarás para generar resultados para evaluar.

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

Luego, puedes usar el comando eval:flow para evaluar el flujo en comparación con los casos de prueba que se proporcionan en testInputs.json.

genkit eval:flow menuSuggestionFlow --input testInputs.json

Luego, puedes ver los resultados de la evaluación en la IU para desarrolladores si ejecutas el siguiente comando:

genkit start

Luego navega a localhost:4000/evaluate.

Como alternativa, puedes proporcionar un archivo de salida para inspeccionar el resultado en un archivo JSON.

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

Evaluadores compatibles

Evaluadores de Genkit

Genkit incluye una pequeña cantidad de evaluadores nativos, inspirados en RAGAS, para ayudarte a comenzar:

  • Fidelidad
  • Relevancia de las respuestas
  • Maliciosidad

Complementos de evaluador

Genkit admite evaluadores adicionales a través de complementos:

Uso avanzado

eval:flow es una forma conveniente de evaluar el flujo con rapidez, pero, a veces, es posible que necesites más control sobre los pasos de evaluación. Esto puede ocurrir si usas un framework diferente y ya tienes algunos resultados que deseas evaluar. Puedes realizar todos los pasos que eval:flow realiza de forma semimanual.

Puedes ejecutar por lotes tu flujo de Genkit y agregar una etiqueta única a la ejecución, que luego se usará para extraer un conjunto de datos de evaluación (un conjunto de entradas, salidas y contextos).

Ejecuta el flujo en las entradas de prueba:

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

Extrae los datos de evaluación:

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

Los datos exportados se mostrarán como un archivo JSON con cada testCase en el siguiente formato:

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

El extractor de datos ubicará automáticamente los retrievers y agregará los documentos producidos al array de contexto. De forma predeterminada, eval:run se ejecutará en todos los evaluadores configurados y, al igual que eval:flow, los resultados de eval:run aparecerán en la página de evaluación de la IU para desarrolladores, ubicada en localhost:4000/evaluate.

Extractores personalizados

También puedes proporcionar extractores personalizados para usar en los comandos de eval:extractData y eval:flow. Los extractores personalizados te permiten anular la lógica de extracción predeterminada, lo que te da más poder para crear conjuntos de datos y evaluarlos.

Para configurar extractores personalizados, agrega un archivo de configuración de herramientas llamado genkit-tools.conf.js a la raíz de tu proyecto, si aún no tienes uno.

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

En el archivo de configuración de las herramientas, agrega el siguiente código:

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

En este ejemplo, configurarás un extractor para el flujo myFlow. La configuración anula los extractores para los campos context y output, y usó la lógica predeterminada para el campo input.

La especificación de los extractores de la evaluación es la siguiente:

  • El campo evaluators acepta un array de objetos EvaluatorConfig, que tienen el alcance de flowName.
  • extractors es un objeto que especifica las anulaciones del extractor. Actualmente, las claves que se admiten en extractors son [input, output, context]. Los tipos de valores aceptables son los siguientes:
    • string: Debe ser un nombre de paso, especificado como stirng. Se extrae el resultado de este paso para esta clave.
    • { inputOf: string } o { outputOf: string }: Estos objetos representan canales específicos (entrada o salida) de un paso. Por ejemplo, { inputOf: 'foo-step' } extraería la entrada del paso foo-step para esta clave.
    • (trace) => string;: Para mayor flexibilidad, puedes proporcionar una función que acepte un seguimiento de Genkit y muestre un string, y especificar la lógica de extracción dentro de esta función. Consulta genkit/genkit-tools/common/src/types/trace.ts para ver el esquema exacto de TraceData.

Ejecuta en conjuntos de datos existentes

Para ejecutar la evaluación en un conjunto de datos ya extraído:

genkit eval:run customLabel_dataset.json

Para resultados a una ubicación diferente, usa la marca --output.

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

Para ejecutar en un subconjunto de los evaluadores configurados, usa la marca --evaluators y proporciona una lista de evaluadores separados por comas por su nombre:

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

Sintetiza datos de prueba con un LLM

Este es un ejemplo de flujo en el que se usa un archivo PDF para generar posibles preguntas que los usuarios podrían estar haciendo al respecto.

export const synthesizeQuestions = 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 generate({
        model: gemini15Flash,
        prompt: {
          text: `Generate one question about the text below: ${chunks[i]}`,
        },
      });
      questions.push(qResponse.text());
    }
    return questions;
  }
);

Luego, puedes usar este comando para exportar los datos a un archivo y usarlos para la evaluación.

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