用 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}} 引用变量。同时列出两个版本的提示词,评测结果会并排对比。

第三步:设计测试用例

好的回归测试集来自真实问题,建议覆盖:

  1. 高频问题:最常见的几类用户请求。
  2. 边界问题:超出业务范围、信息不足、模糊提问。
  3. 风险问题:诱导承诺、索要隐私、提示注入尝试。
  4. 格式要求:需要输出 JSON 或固定结构时,用格式类断言检查。

断言优先用确定性的规则(包含、不包含、正则、JSON 格式),语义类要求再用模型评分(llm-rubric),并定期人工抽查评分是否合理。

第四步:运行与查看

npx promptfoo@latest eval
npx promptfoo@latest view

eval 运行全部用例,view 在浏览器打开结果页,可以看到每个用例在不同提示词版本下的输出和通过情况。

融入日常流程

  • 把配置文件和测试用例纳入版本管理,和提示词一起评审。
  • 线上发现新的坏案例,就补一个测试用例。
  • 更换模型时,用同一套用例对比新旧模型。
  • 可以在持续集成中运行评测,作为合并前的检查(按团队需要配置)。

常见坑

  • 用例太少:几条用例只能防止明显回退,要持续积累。
  • 只靠模型评分:评分模型也会出错,关键要求尽量用规则断言。
  • 忽略成本:用例多、模型贵时,先用小样本跑,或开启缓存。

相关阅读