评估

评估是一种测试形式,可帮助您验证 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: geminiPro,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

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

[
  "What is on the menu?",
  "Does the restaurant have clams?",
  "What is the special of the day?"
]

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

genkit eval:flow menuQA --input testQuestions.json

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

genkit start

然后,前往 localhost:4000/evaluate

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

genkit eval:flow menuQA --input testQuestions.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 字段接受 EvaluatorConfig 对象数组,这些对象由 flowName 限定
  • 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 menuQA --input testQuestions.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: geminiPro,
        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