使用 Promptfoo 进行评估

先决条件

要使用 Promptfoo,您需要在系统上安装 node.js 和 npm。有关更多信息,请遵循 此指南

您可以使用 npm 安装 promptfoo,或直接使用 npx 运行它。在本指南中,我们将使用 npx。

注意:对于此示例,您无需运行 npx promptfoo@latest init,因为此目录中已有一个初始化的 promptfooconfig.yaml 文件

在此处查看官方文档 here

入门

评估由 promptfooconfig... .yaml 文件进行编排。在我们的应用程序中,我们将评估逻辑分为 promptfooconfig_retrieval.yaml(用于评估检索系统)和 promptfooconfig_end_to_end.yaml(用于评估端到端性能)。在这些文件中,我们定义了以下部分

检索评估

  • 提示 (Prompts)
    • Promptfoo 允许您以多种不同格式导入提示。您可以在此处阅读更多相关信息 here
    • 在我们的案例中,我们跳过了每次都提供新提示,而只是将 {{query}} 传递给每个检索 '提供程序' 进行评估
  • 提供程序 (Providers)
    • 我们没有使用标准的 LLM 提供程序,而是为 guide.ipynb 中的每种检索方法编写了自定义提供程序
  • 测试 (Tests)
    • 我们将使用与 guide.ipynb 中相同的数据。我们将其分为 end_to_end_dataset.csvretrieval_dataset.csv,并为每个数据集添加了一个 __expected 列,这使我们能够自动为每一行运行断言
    • 您可以在 eval_end_to_end.py 中找到我们的检索评估逻辑

端到端评估

  • 提示 (Prompts)
    • Promptfoo 允许您以多种不同格式导入提示。您可以在此处阅读更多相关信息 here
    • 我们的端到端评估配置中有 3 个提示:每个提示对应一种使用方法
      • 这些函数与 guide.ipynb 中使用的函数相同,只是它们不调用 Anthropic API,而是直接返回提示。然后 Promptfoo 负责编排 API 调用和存储结果。
      • 您可以在此处阅读有关提示函数的信息 here。使用 Python 可以让我们重用 vectordb.py 中定义的 VectorDB 类,这对于 RAG 是必需的。
  • 提供程序 (Providers)
    • 使用 Promptfoo,您可以连接到不同平台上的许多不同的 LLM,请在此处查看更多信息 here for more。在 guide.ipynb 中,我们使用了 Haiku,默认温度为 0.0。我们将使用 Promptfoo 来试验不同的模型。
  • 测试 (Tests)
    • 我们将使用与 guide.ipynb 中相同的数据。我们将其分为 end_to_end_dataset.csvretrieval_dataset.csv,并为每个数据集添加了一个 __expected 列,这使我们能够自动为每一行运行断言
    • Promptfoo 具有广泛的内置测试,您可以在此处找到 here
    • 您可以在 eval_retrieval.py 中找到检索系统的测试逻辑,在 eval_end_to_end.py 中找到端到端系统的测试逻辑
  • 输出 (Output)
    • 我们定义了输出文件的路径。Promptfoo 可以以多种格式输出结果,请参见此处 see here。或者,您可以使用 Promptfoo 的 Web UI,请参见此处 see here

运行评估

要开始使用 Promptfoo,请打开终端并导航到此目录 (./evaluation)。

在运行评估之前,您必须定义以下环境变量:

export ANTHROPIC_API_KEY=YOUR_API_KEY export VOYAGE_API_KEY=YOUR_API_KEY

evaluation 目录运行以下命令之一。

  • 要评估端到端系统性能: npx promptfoo@latest eval -c promptfooconfig_end_to_end.yaml --output ../data/end_to_end_results.json

  • 要单独评估检索系统性能: npx promptfoo@latest eval -c promptfooconfig_retrieval.yaml --output ../data/retrieval_results.json

评估完成后,终端将打印数据集中每一行的结果。您也可以运行 npx promptfoo@latest view 来在 promptfoo UI 查看器中查看输出。