用 promptfoo 搭建提示词回归测试:改提示词前先跑一遍
用 promptfoo 做提示词回归测试,基本流程是:初始化项目 → 在配置文件里写好提示词、模型和测试用例 → 为每个用例设置断言 → 运行评测并在网页界面对比结果。 以后每次改提示词或换模型,先跑一遍测试,就能及时发现「改好了这里、弄坏了那里」。
promptfoo 是什么
promptfoo 是一个开源的命令行工具,用于评测和对比提示词与模型输出。它通过一个 YAML 配置文件定义提示词、模型提供方和测试用例,支持多种断言方式,并提供本地网页界面查看结果。具体功能和参数请以官方文档为准。
第一步:初始化
需要先安装 Node.js,然后在项目目录执行:
npx promptfoo@latest init
它会生成一个示例配置文件 promptfooconfig.yaml。模型提供方的 API 密钥通过环境变量设置,不要写进配置文件或提交到仓库。
第二步:编写配置
以一个「客服回复」提示词为例:
description: 客服回复提示词回归测试
prompts:
- file://prompts/reply_v1.txt
- file://prompts/reply_v2.txt
providers:
- openai:<你使用的模型名> # 提供方写法见官方文档
tests:
- vars:
question: 我想退货,但已经过了 7 天
assert:
- type: icontains
value: 退货政策
- type: not-icontains
value: 保证
- vars:
question: 你们的产品能治疗失眠吗
assert:
- type: llm-rubric
value: 不做任何医疗功效承诺,并建议咨询专业人士
提示词文件中用 {{question}} 引用变量。同时列出两个版本的提示词,评测结果会并排对比。
第三步:设计测试用例
好的回归测试集来自真实问题,建议覆盖:
- 高频问题:最常见的几类用户请求。
- 边界问题:超出业务范围、信息不足、模糊提问。
- 风险问题:诱导承诺、索要隐私、提示注入尝试。
- 格式要求:需要输出 JSON 或固定结构时,用格式类断言检查。
断言优先用确定性的规则(包含、不包含、正则、JSON 格式),语义类要求再用模型评分(llm-rubric),并定期人工抽查评分是否合理。
第四步:运行与查看
npx promptfoo@latest eval
npx promptfoo@latest view
eval 运行全部用例,view 在浏览器打开结果页,可以看到每个用例在不同提示词版本下的输出和通过情况。
融入日常流程
- 把配置文件和测试用例纳入版本管理,和提示词一起评审。
- 线上发现新的坏案例,就补一个测试用例。
- 更换模型时,用同一套用例对比新旧模型。
- 可以在持续集成中运行评测,作为合并前的检查(按团队需要配置)。
常见坑
- 用例太少:几条用例只能防止明显回退,要持续积累。
- 只靠模型评分:评分模型也会出错,关键要求尽量用规则断言。
- 忽略成本:用例多、模型贵时,先用小样本跑,或开启缓存。