评估

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

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

评估类型

Genkit 支持两种类型的评估:

  • 基于推理的评估:此类评估会针对一组预先确定的输入运行,评估相应输出的质量。

    这是最常见的评估类型,适用于大多数用例。此方法会针对每次运行的评估测试系统的实际输出。

    您可以通过直观地检查结果来手动执行质量评估。或者,您也可以使用评估指标自动执行评估。

  • 原始评估:此类评估会直接评估输入的质量,而无需进行任何推理。此方法通常与使用指标的自动评估方法搭配使用。评估所需的所有必填字段(例如inputcontextoutputreference)必须存在于输入数据集中。如果您有来自外部来源(例如从生产轨迹收集的数据)的数据,并且希望客观衡量收集数据的质量,此方法非常有用。

    如需了解详情,请参阅本页的高级使用部分。

本部分介绍了如何使用 Genkit 执行基于推理的评估。

快速入门

请按以下步骤快速开始使用 Genkit。

设置

  1. 使用现有的 Genkit 应用,或按照我们的入门指南创建新的 Genkit 应用。
  2. 添加以下代码以定义要评估的简单 RAG 应用。在本指南中,我们使用始终返回相同文档的虚构检索器。
    import (
        "context"
        "fmt"
        "log"
    
        "github.com/firebase/genkit/go/ai"
        "github.com/firebase/genkit/go/genkit"
        "github.com/firebase/genkit/go/plugins/googlegenai"
    )
    
    func main() {
        ctx := context.Background()
    
        // Initialize Genkit
        g, err := genkit.Init(ctx,
            genkit.WithPlugins(&googlegenai.GoogleAI{}),
            genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
        )
        if err != nil {
            log.Fatalf("Genkit initialization error: %v", err)
        }
    
        // Dummy retriever that always returns the same facts
        dummyRetrieverFunc := func(ctx context.Context, req *ai.RetrieverRequest) (*ai.RetrieverResponse, error) {
            facts := []string{
                "Dog is man's best friend",
                "Dogs have evolved and were domesticated from wolves",
            }
            // Just return facts as documents.
            var docs []*ai.Document
            for _, fact := range facts {
                docs = append(docs, ai.DocumentFromText(fact, nil))
            }
            return &ai.RetrieverResponse{Documents: docs}, nil
        }
        factsRetriever := genkit.DefineRetriever(g, "local", "dogFacts", dummyRetrieverFunc)
    
        m := googlegenai.GoogleAIModel(g, "gemini-2.0-flash")
        if m == nil {
            log.Fatal("failed to find model")
        }
    
        // A simple question-answering flow
        genkit.DefineFlow(g, "qaFlow", func(ctx context.Context, query string) (string, error) {
            factDocs, err := ai.Retrieve(ctx, factsRetriever, ai.WithTextDocs(query))
            if err != nil {
                return "", fmt.Errorf("retrieval failed: %w", err)
            }
            llmResponse, err := genkit.Generate(ctx, g,
                ai.WithModelName("googleai/gemini-2.0-flash"),
                ai.WithPrompt("Answer this question with the given context: %s", query),
                ai.WithDocs(factDocs.Documents...)
            )
            if err != nil {
                return "", fmt.Errorf("generation failed: %w", err)
            }
            return llmResponse.Text(), nil
        })
    }
  3. 您可以选择向应用添加评估指标,以便在评估时使用。本指南使用 evaluators 软件包中的 EvaluatorRegex 指标。
    import (
        "github.com/firebase/genkit/go/plugins/evaluators"
    )
    
    func main() {
      // ...
    
      metrics := []evaluators.MetricConfig{
          {
            MetricType: evaluators.EvaluatorRegex,
          },
      }
    
      // Initialize Genkit
      g, err := genkit.Init(ctx,
          genkit.WithPlugins(
              &googlegenai.GoogleAI{},
              &evaluators.GenkitEval{Metrics: metrics}        // Add this plugin
          ),
          genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
      )
    }
    注意:确保 evaluators 软件包已安装到您的 Go 项目中:
    go get github.com/firebase/genkit/go/plugins/evaluators
  4. 启动 Genkit 应用。
    genkit start -- go run main.go

创建数据集

创建一个数据集,以定义我们要用于评估流程的示例。

  1. 前往 http://localhost:4000 中的开发者界面,然后点击 Datasets 按钮以打开“Datasets”(数据集)页面。

  2. 点击创建数据集按钮,打开创建数据集对话框。

    a. 为新数据集提供 datasetId。本指南使用 myFactsQaDataset

    b. 选择 Flow 数据集类型。

    c. 将验证目标字段留空,然后点击保存

  3. 系统随即会显示新数据集页面,其中显示了一个空数据集。请按照以下步骤为其添加示例:

    a. 点击添加示例按钮,打开示例编辑器面板。

    b. 只有 Input 字段是必填字段。在 Input 字段中输入 "Who is man's best friend?",然后点击保存,将示例 has 添加到数据集中。

    如果您已配置 EvaluatorRegex 指标并希望试用该指标,则需要指定一个包含要与输出进行匹配的模式的“Reference”字符串。对于上述输入,请将 Reference output 文本设置为 "(?i)dog",这是一个不区分大小写的正则表达式模式,用于匹配流程输出中的“dog”一词。

    c. 重复步骤 (a) 和 (b) 几次,以添加更多示例。 本指南将以下示例输入添加到数据集中:

    "Can I give milk to my cats?"
    "From which animals did dogs evolve?"
    

    如果您使用的是正则表达式评估器,请使用相应的参考字符串:

    "(?i)don't know"
    "(?i)wolf|wolves"
    

    请注意,这是一个人为构造的示例,正则表达式评估器可能不是评估 qaFlow 响应的正确选择。不过,本指南可应用于您选择的任何 Genkit Go 评估器。

    完成此步骤后,您的数据集应包含 3 个示例,其中包含上述值。

运行评估并查看结果

如需开始评估流程,请点击数据集页面上的运行新评估按钮。您还可以通过评估标签页启动新的评估。

  1. 选择 Flow 单选按钮以评估流程。

  2. 选择 qaFlow 作为要评估的目标流程。

  3. 选择 myFactsQaDataset 作为要用于评估的目标数据集。

  4. 如果您使用 Genkit 插件安装了评估器指标,则可以在本页面中看到这些指标。选择要在此评估运行中使用的指标。这完全是可选的:如果省略此步骤,系统仍会返回评估运行中的结果,但不会返回任何关联的指标。

    如果您未提供任何参考值,并且使用的是 EvaluatorRegex 指标,则评估将失败,因为此指标需要设置参考值。

  5. 点击运行评估以开始评估。这可能需要一段时间,具体取决于您要测试的流程。评估完成后,系统会显示一条成功消息,其中包含用于查看结果的链接。点击该链接可前往评估详情页面。

您可以在此页面上查看评估的详细信息,包括原始输入、提取的上下文和指标(如果有)。

核心概念

术语

了解以下术语有助于确保您正确理解本页面上提供的信息:

  • 评估:评估是评估系统性能的过程。在 Genkit 中,此类系统通常是 Genkit 基元,例如流或模型。评估可以是自动评估,也可以是人工评估。

  • 批量推理:推理是指在流程或模型上运行输入以获取相应输出的过程。批量推理涉及同时对多个输入执行推理。

  • 指标:评估指标是用于为推理结果评分的标准。例如准确性、忠实性、恶意性、输出是否为英语等。

  • 数据集:数据集是用于基于推理的评估的示例集合。数据集通常由 Input 和可选的 Reference 字段组成。Reference 字段不会影响评估的推理步骤,但会原样传递给任何评估指标。在 Genkit 中,您可以通过开发者界面创建数据集。Genkit 中有两种类型的数据集:流程数据集和模型数据集。

支持的评估器

Genkit 支持多个评估器,其中一些是内置的,另一些则由外部提供。

Genkit 评估程序

Genkit 包含少量从 JS 评估器插件移植的内置评估器,可帮助您轻松上手:

  • EvaluatorDeepEqual - 检查生成的输出是否与提供的参考输出深度相等。
  • EvaluatorRegex - 检查生成的输出是否与参考字段中提供的正则表达式匹配。
  • EvaluatorJsonata - 检查生成的输出是否与参考字段中提供的 JSONATA 表达式匹配。

高级用法

除了基本功能之外,Genkit 还针对某些评估用例提供高级支持。

使用 CLI 进行评估

Genkit CLI 提供了丰富的 API 来执行评估。在开发者界面不可用(例如在 CI/CD 工作流中)的环境中,此功能尤为有用。

Genkit CLI 提供了 3 个主要的评估命令:eval:floweval:extractDataeval:run

评估 eval:flow 命令

eval:flow 命令会对输入数据集运行基于推理的评估。此数据集可以以 JSON 文件的形式提供,也可以通过引用 Genkit 运行时中的现有数据集来提供。

# Referencing an existing dataset
genkit eval:flow qaFlow --input myFactsQaDataset
# or, using a dataset from a file
genkit eval:flow qaFlow --input testInputs.json

注意:请务必先启动 genkit 应用,然后再运行这些 CLI 命令。

genkit start -- go run main.go

其中,testInputs.json 应为包含 input 字段和可选 reference 字段的对象数组,如下所示:

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

如果您的流程需要身份验证,您可以使用 --context 参数指定它:

genkit eval:flow qaFlow --input testInputs.json --context '{"auth": {"email_verified": true}}'

默认情况下,eval:floweval:run 命令会使用所有可用指标进行评估。如需在部分配置的评估器上运行,请使用 --evaluators 标志,并按名称提供以英文逗号分隔的评估器列表:

genkit eval:flow qaFlow --input testInputs.json --evaluators=genkitEval/regex,genkitEval/jsonata

您可以在开发者界面 (localhost:4000/evaluate) 中查看运行评估的结果。

eval:extractDataeval:run 命令

为了支持原始评估,Genkit 提供了用于从轨迹中提取数据并对提取的数据运行评估指标的工具。例如,如果您使用的是其他框架进行评估,或者从其他环境收集推理结果以在本地进行测试以确保输出质量,这会非常有用。

您可以批量运行 Genkit 流程,并从生成的轨迹中提取评估数据集。原始评估数据集是评估指标的输入集合,无需运行任何先前的推理。

针对测试输入运行流程:

genkit flow:batchRun qaFlow testInputs.json

提取评估数据:

genkit eval:extractData qaFlow --maxRows 2 --output factsEvalDataset.json

导出的数据的格式与之前介绍的数据集格式不同。这是因为此类数据旨在直接与评估指标搭配使用,而无需任何推理步骤。以下是提取数据的语法。

Array<{
  "testCaseId": string,
  "input": any,
  "output": any,
  "context": any[],
  "traceIds": string[],
}>;

数据提取器会自动定位检索器,并将生成的文档添加到上下文数组。您可以使用 eval:run 命令对此提取的数据集运行评估指标。

genkit eval:run factsEvalDataset.json

默认情况下,eval:run 会针对所有已配置的评估器运行,并且与 eval:flow 一样,eval:run 的结果会显示在位于 localhost:4000/evaluate 的开发者界面的评估页面中。