Mindket

怎样测试提示词:换版本之前,先用小型测试集比较

黑色横幅,标题是“提示词优化”,下面是“用 AI 生成、改进和测试提示词”。

测试提示词,就是写下几个真实输入和好回复的样子,把提示词的每个版本在所有输入上都跑一遍,换版本之前并排比较结果。你可以用电子表格,用 Anthropic Console 的评估视图,或者用 promptfoo,这是一个开源工具,运行一个配置文件,再打开结果表格。

本节内容

  • 收集几个真实输入,答不好的放在最前面,统一存在一个文件里。
  • 在跑任何一个版本之前,先定好每个输入怎样才算通过。
  • 每个提示词版本只改一处,这样两个版本之间的差别只可能有一个原因。
  • 新版本保住了旧版本的每一项通过,又修好至少一个失败,才值得换。
全部课程
本页目录
  1. 开始之前
  2. 比较提示词版本的三种办法
  3. 先从电子表格开始
  4. 在 Anthropic Console 里比较版本
  5. 用 promptfoo 比较版本
  6. 给每个输入选一种检查
  7. 换版本之前,先读结果
  8. 常见错误
  9. 动手试试
  10. 下一课:用 DSPy 自动优化提示词
  11. 自测一下
  12. 常见问题
  13. 资料来源

开始之前

测试集是一份简短的输入清单,每个输入旁边写着好回复的样子。让每个提示词版本都跑同样的输入,是判断改写到底有没有帮助的唯一办法,否则它可能只是在你试的那一个例子上读起来更顺。断言(assertion)是对回复的自动检查,比如“包含这个词”,或者“由模型对照这条规则来评判”。

带上你想改进的提示词、第 2 课得到的改写版,再准备几个输入。其中要有当前提示词答不好的,也至少要有一个答得好的,改写可能修好一个例子,却弄坏另一个,只有两种输入都在集合里,你才看得出来。评估那一课对测试集和评分器讲得更深。

OpenAI 的 cookbook 说,它正在逐步停掉 Evals 产品,并推荐用 Promptfoo继续做评估工作。这是本课最后落在 promptfoo 上的原因之一。

比较提示词版本的三种办法

三种办法思路相同,只是规模不同。下面的对照是本课自己整理的。Console 一列依据 Anthropic 的课程,课程讲的是人工评分,课程没提到的地方写“课程未提及”。promptfoo 一列依据它的文档。

电子表格、Anthropic Console 和 promptfoo
电子表格Anthropic Consolepromptfoo
需要终端否否是
自动检查回复否手动评分是
并排显示两个版本部分是是
适用于其他厂商的模型是课程未提及是
能在 CI 里运行否课程未提及是

来源:Anthropic on GitHub: Prompt evaluations course, lesson 2, Workbench evaluations (2026年11月6日 查阅);promptfoo docs on GitHub: Intro (2026年11月6日 查阅);promptfoo docs on GitHub: Getting started (2026年11月6日 查阅)

先从电子表格开始

第一轮用电子表格就够了,表也不用长。promptfoo 以后能直接读取同一份表格的 CSV 或 Excel 文件,所以你在这里写的东西不会白费。下表以 promptfoo 示例里的鞋店助手为例,每个输入占一行。

  1. 在第一列列出几个输入,提示词答不好的放在最前面。
  2. 在第二列写下好回复要做到什么,一切都还没运行之前就写好。
  3. 把每个提示词版本在每个输入上都跑一遍,粘贴回复,标出通过或失败。
  4. 数出每个版本的通过数,再读一读失败的情形。光看数字,看不出是哪几个输入出了问题。
你自己的测试集可以参照的版式。两个输入是 promptfoo 的 eval-self-grading 示例里的问题,“好回复”一列是对示例规则的意译。
输入好回复要做到什么版本 1:通过?版本 2:通过?
Can you help me find a specific product on your website?帮忙查找商品,不提自己是 AI是或否是或否
Do you have any promotions or discounts currently available?回答优惠问题,回复简短,不提自己是 AI是或否是或否

在 Anthropic Console 里比较版本

Anthropic 的提示词评估课程教的是在 Anthropic Workbench 里做人工打分的评估,课程写成时,Workbench 是 Console 里的提示词工具。它提到的按钮现在可能已经挪了位置。课程说,Workbench 是从人工打分起步的好地方,之后再转向代码打分或模型打分的评估。

它的示例提示词把任何语言的代码翻译成 Python,源代码和它的语言是两个变量,写作 {{SOURCE_CODE}} 和 {{SOURCE_LANGUAGE}}。版本 1 只要求翻译。下面的版本 2 加了一个必需的输出格式。版本 1 就是去掉结尾格式说明的同一条提示词。

You are a skilled programmer tasked with translating code from one programming language to Python. Your goal is to produce an accurate and idiomatic Python translation of the provided source code.

Here is the source code to translate:

<source_code>
{{SOURCE_CODE}}
</source_code>

The source code is written in the following language:

<source_language>
{{SOURCE_LANGUAGE}}
</source_language>

Please translate this code to Python.
Format your response as follows:

<python_code>
Your Python translation here
</python_code>

Only output the <python_code> tags without any other text content
  1. 用双花括号的变量写好提示词,再打开变量按钮,为每个变量填一个测试值。
  2. 按 Run,读输出。
  3. 用顶部的开关切换到评估视图。每个新用例按一次 Add Row,再按 Run Remaining 运行其余的用例。
  4. 给每个输出打分。课程给版本 1 打了五分里的三分,原因是多余的开场白、难以解析的格式,以及很长的解释。
  5. 修改提示词,它就成了版本 2,再把剩下的用例重新跑一遍。课程给版本 2 的所有输出都打了五分里的五分。
  6. 按 Add Comparison,选版本 1,并排查看输出和分数。
Anthropic 自己的频道发布的视频,讲在它的 Console 里评估提示词。

用 promptfoo 比较版本

promptfoo 是一个开源的命令行工具和库,用来评估大模型应用,也用来做红队测试。它的简介把目标说成测试驱动的大模型开发,而不是反复试错,还说评估在你自己的机器上运行,直接和模型通信。npm 上的软件包记录显示,发布为 0.125.1 的版本要求 Node 22.22.0 或更高。

文档里的提示词质量示例比较两条鞋业公司的客服提示词。提示词文件放各个版本,配置文件放测试和检查。下面把两个文件放在一起展示,每个文件前有一行注释,内容和仓库里的示例一致。

# prompts.txt
You're an ecommerce chat assistant for a shoe company.
Answer this user's question: {{name}}: "{{question}}"
---
You're a smart, bubbly customer service rep for a shoe company.
Answer this user's question concisely: {{name}}: "{{question}}"

# promptfooconfig.yaml
# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
description: Automatic response evaluation using LLM rubric scoring

prompts:
  - file://prompts.txt
providers:
  - openai:gpt-6-sol
defaultTest:
  assert:
    - type: llm-rubric
      value: Do not mention that you are an AI or chat assistant
    - type: javascript
      # Shorter is better
      value: Math.max(0, Math.min(1, 1 - (output.length - 100) / 900));
tests:
  - vars:
      name: Bob
      question: Can you help me find a specific product on your website?
  - vars:
      name: Jane
      question: Do you have any promotions or discounts currently available?
  • 两条提示词之间的三个短横线一行,会让它们成为两个提示词版本,所以每个测试都在两者上各跑一遍。
  • {{name}} 和 {{question}} 是变量,由每个测试的 vars 填入。
  • defaultTest.assert 对每个测试都生效:一条由模型对照一句平实规则来评分的 llm-rubric,和一个奖励较短回复的 javascript 分数。
  1. 用 npx promptfoo@latest init --example eval-self-grading 创建示例,再进入新建的目录。
  2. 用 export OPENAI_API_KEY=your-key-here 设置密钥。示例的 providers 一行写的是 OpenAI 的模型,文档说每个提供方有各自的设置要求。
  3. 运行 npx promptfoo@latest eval。它会代入变量,把两条提示词各跑一遍,并在终端里打印结果。命令行文档列出了一个 --no-cache 参数,用来不读取也不写入磁盘缓存。
  4. 用 npx promptfoo@latest view 在浏览器里打开结果。
  5. 想测自己的提示词,就替换 prompts.txt 里的两条,以及 promptfooconfig.yaml 里的测试。命令行文档列出了一个 --tests 参数,接收测试用例 CSV 文件的路径。

给每个输入选一种检查

文档说,断言是可选的,很多人直接在网页查看器里人工审阅输出就有收获。规则明确的地方再加断言,不明确的地方就不加。在 CSV 测试文件里,__expected 列每一行放一条断言。没有前缀的值表示 equals,加上 contains:、llm-rubric: 这样的前缀,就能选其他类型。

input,__expected
"Hello world","contains: Hello"
"Calculate 5 * 6","equals: 30"
"What's the weather?","llm-rubric: Provides weather information"
出自 promptfoo 的断言页面,2026 年 11 月 6 日阅读。
检查什么时候通过还需要什么
equals回复和期望文本完全一致不需要别的
contains、icontains回复包含某个字符串或数字,icontains 不区分大小写不需要别的
javascript你写的函数判定回复合格,比如长度上限不需要别的
llm-rubric由模型对照你写的评分标准给回复打分一个负责评分的模型提供方
similar与参考文本的嵌入相似度高于阈值一个提供方和一个阈值

换版本之前,先读结果

promptfoo 把结果显示成一张“输入乘以提示词版本”的表格,文档称之为矩阵视图,用来比较多个提示词的输出。一列一列地读,再去读那些失败的。我们的经验法则:新版本要守住旧版本通过的每一个输入,还要修好至少一个旧版本答错的。平均成绩更高,却弄坏了一个你在意的输入,就不能算胜过旧版本。

打分的模型也会出错。OpenAI 的迁移指南说,任何重建的评分器,尤其是大模型当评审的评分器,在你用它来做回归判断之前都要先验证。评审那一课讲了怎么做,CI 那一课讲怎样让同一个文件在每次改动时运行。配置修改后报错时,指南建议重试之前先运行 promptfoo validate config -c promptfooconfig.yaml。

常见错误

  • 只用写提示词时用过的那一个输入来评判。
  • 在版本 2 里一次改了三处,说不清是哪一处起了作用。
  • 看过回复之后才写通过的标准。
  • 没有亲自读几条评分结果,就相信 llm-rubric 的分数。
  • 用 promptfoo 却只放一条提示词。它的意义在于比较,所以旧版本要留在文件里当基线。

动手试试

  • 把示例原样运行一次,再打开查看器。
  • 把两条提示词换成你现在的提示词,以及第 2 课得到的改写版。
  • 把两个测试换成你自己的五个输入,每个输入配一条断言。
  • 运行,改动改写版里的一行,再运行一次。

下一课:用 DSPy 自动优化提示词

你已经手动比较过版本了。第 4 课让 DSPy 自己去搜索更好的版本,打分用的指标和上面的检查很像。

自测一下

  1. 在 promptfoo 的提示词文件里,怎样把两个提示词版本放进同一个文件?

    查看答案

    C. 在它们之间放一行三个短横线 文档说,在 .txt 文件里,把三个短横线单独放一行隔开各条提示词,每个测试就会在每一条上都跑一遍。

  2. 在 promptfoo 的 CSV 里,__expected 列中没有前缀的值是什么意思?

    查看答案

    B. equals 测试用例页面说,没有类型前缀的值默认是 equals。

  3. 在 Anthropic 的评估课程里,怎样并排查看两个提示词版本的输出和分数?

    查看答案

    D. 按 Add Comparison,选较早的版本 课程按下 Add Comparison,选中版本 1,再把两个版本的输出和人工打的分数放在一起读。

  4. promptfoo 的哪种检查需要模型提供方来负责评分?

    查看答案

    C. llm-rubric 断言页面说,一部分断言,包括相似度和 llm-rubric,需要大模型提供方。

常见问题

怎样测试一条提示词?

把每个版本放在同一组真实输入上跑一遍,再对照你事先写好的通过标准比较回复。电子表格、Anthropic Console 的评估视图和 promptfoo,是做这件事的三种不同规模。

promptfoo 是什么,除了测提示词还能做什么?

它是一个开源工具,在 npm 上标注的许可证是 MIT。除了比较提示词,它的简介还列出了自动化红队测试,以及在 CI/CD 里使用。OpenAI 的 cookbook 把它列为 Evals 产品之后继续往下走的办法。

需要多少个测试用例?

这些来源都没有给出目标数量。OpenAI 的提示词 optimizer 要求数据集至少有三行,promptfoo 的示例只有两个测试。先从少量开始,每当提示词在真实使用中出错,就补一个用例。

promptfoo 能测试 Claude 和其他厂商的模型吗?

能。它的文档列出了 60 多个提供方,包括 OpenAI、Anthropic 和 Google,以及 Llama 这样的开源模型。

测试提示词需要会写代码吗?

电子表格或 Console 的评估视图不需要。promptfoo 需要终端和一个 YAML 文件,不过它的测试用例是声明式的,读起来像一张表。

资料来源

  1. Anthropic on GitHub: Prompt evaluations course, lesson 2, Workbench evaluations (2026年11月6日 查阅)https://github.com/anthropics/courses/blob/master/prompt_evaluations/02_workbench_evals/02_workbench_evals.ipynb
  2. promptfoo docs on GitHub: Intro (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/blob/main/site/docs/intro.md
  3. promptfoo docs on GitHub: Getting started (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/blob/main/site/docs/getting-started.md
  4. promptfoo docs on GitHub: Prompt configuration (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/blob/main/site/docs/configuration/prompts.md
  5. promptfoo docs on GitHub: Test cases (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/blob/main/site/docs/configuration/test-cases.md
  6. promptfoo docs on GitHub: Assertions and metrics (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/blob/main/site/docs/configuration/expected-outputs/index.md
  7. promptfoo docs on GitHub: Command line (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/blob/main/site/docs/usage/command-line.md
  8. promptfoo on GitHub: eval-self-grading example (2026年11月6日 查阅)https://github.com/promptfoo/promptfoo/tree/main/examples/eval-self-grading
  9. OpenAI API docs: Prompt optimizer (2026年11月6日 查阅)https://developers.openai.com/api/docs/guides/prompt-optimizer
  10. npm registry: promptfoo package record (2026年11月6日 查阅)https://registry.npmjs.org/promptfoo/latest
  11. OpenAI Cookbook: Moving from OpenAI Evals to Promptfoo (2026年11月6日 查阅)https://developers.openai.com/cookbook/examples/evaluation/moving-from-openai-evals-to-promptfoo
  12. YouTube: Anthropic, Evaluate prompts in the Anthropic Console (2026年11月6日 查阅)https://www.youtube.com/watch?v=KIGBsQqZcNA

分享本节课

找一个自带测试的技能

Mindket 上有些智能体技能,在说明旁边附带了脚本和示例输入。打开一个,看看它的作者是怎样检查它好不好用的。

浏览技能

本节课的 Markdown 版本 · 提示词优化:让 AI 帮你写、改进并测试提示词 · 全部课程