评估

评估是一种测试形式,可帮助您验证 LLM 的回答并确保其满足您的质量标准。

Firebase Genkit 通过插件支持第三方评估工具,并且搭配使用强大的可观测性功能,可深入了解由 LLM 提供支持的应用的运行时状态。Genkit 工具可帮助您自动从中间步骤中提取输入、输出和信息等数据,以评估 LLM 响应的端到端质量,并了解系统构建块的性能。

例如,如果您有一个 RAG 流程,Genkit 将提取检索器返回的一组文档,以便您在检索器在流程上下文中运行时评估其质量,如下所示,其中包含 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

首先定义一组要用作 testInputs.json 的输入数据集的输入。此输入数据集表示您将用于生成评估的输出的测试用例。

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

然后,您可以使用 eval:flow 命令根据 testInputs.json 中提供的测试用例评估您的流程。

genkit eval:flow menuSuggestionFlow --input testInputs.json

然后,您可以通过运行以下命令,在开发者界面中查看评估结果:

genkit start

然后导航到 localhost:4000/evaluate

或者,您可以提供输出文件,以检查 json 文件中的输出。

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

支持的评估程序

Genkit 评估器

Genkit 包括受 RAGAS 启发的少量原生评估程序,可帮助您开始:

  • 忠诚
  • 回答相关性
  • 恶意

Evaluator 插件

Genkit 通过以下插件支持其他评估器:

高级用途

eval:flow 是快速评估数据流的一种便捷方式,但有时您可能需要对评估步骤进行更多控制。如果您使用的是其他框架,并且已经有一些要评估的输出,则可能会发生这种情况。您可以通过 eval:flow 半手动的方式执行所有步骤。

您可以批量运行 Genkit 流,并为运行添加唯一标签,然后该标签将用于提取评估数据集(一组输入、输出和上下文)。

对测试输入运行该流程:

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

提取评估数据:

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

导出的数据将输出为一个 JSON 文件,每个 testCase 都采用以下格式:

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

数据提取器会自动定位检索器,并将生成的文档添加到上下文数组中。默认情况下,eval:run 将针对已配置的所有评估器运行,与 eval:flow 一样,eval:run 的结果将显示在开发者界面的评估页面(位于 localhost:4000/evaluate)中。

自定义提取器

您还可以提供要在 eval:extractDataeval:flow 命令中使用的自定义提取器。借助自定义提取器,您可以替换默认提取逻辑,从而更高效地创建和评估数据集。

如果您还没有名为 genkit-tools.conf.js 的工具配置文件,请在项目根目录中添加该文件,以配置自定义提取器。

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

在 tools 配置文件中,添加以下代码:

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

在此示例中,您将为 myFlow 流配置提取器。该配置替换了 contextoutput 字段的提取器,并使用 input 字段的默认逻辑。

评估提取器的规范如下:

  • evaluators 字段接受以 flowName 为范围的一组 EvaluatorConfig 对象
  • extractors 是用于指定提取器替换项的对象。extractors中当前支持的键为 [input, output, context]。可接受的值类型包括:
    • string - 这应该是步骤名称,以 stirng 的形式指定。系统将为此密钥提取此步骤的输出。
    • { inputOf: string }{ outputOf: string } - 这些对象表示步骤的特定渠道(输入或输出)。例如,{ inputOf: 'foo-step' } 将为该键提取步骤 foo-step 的输入。
    • (trace) => string; - 为了提高灵活性,您可以提供一个接受 Genkit 跟踪记录并返回 string 的函数,并在此函数中指定提取逻辑。如需了解确切的 TraceData 架构,请参阅 genkit/genkit-tools/common/src/types/trace.ts

在现有数据集上运行

如需对已提取的数据集运行评估,请执行以下操作:

genkit eval:run customLabel_dataset.json

如需输出到其他位置,请使用 --output 标志。

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

如需对部分已配置的评估器运行,请使用 --evaluators 标志并按名称提供以英文逗号分隔的评估器列表:

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

使用 LLM 合成测试数据

下面是一个示例流程,该流程使用 PDF 文件生成用户可能会提出的相关问题。

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;
  }
);

然后,您可以使用此命令将数据导出到一个文件中,并将其用于评估。

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