Promptfoo 是一个开源的提示词(Prompt)测试与评估框架,主要解决 LLM 应用开发中的两个核心问题:提示词改动后如何确认效果没有回退,以及多个模型之间如何公平地横向对比。它以 YAML 配置文件声明测试场景,用命令行一键批量评估,并自动生成可分享的对比报告。自 2023 年发布以来,Promptfoo 已被大量提示词工程师、QA 与安全团队用于生产环境的持续回归测试,v1.0 起加入的 Red Teaming(红队测试)模块将提示注入、越狱、隐私泄露等安全测试纳入同一工作流。本文按安装配置、快速上手、核心能力、生产部署、选型对比的顺序组织,目标是在一小时内帮你跑通第一次自动化评估,并能把它接入 CI 流水线。
掌握 Promptfoo 意味着你拥有把提示词工程从“人工试错”升级为“可回归、可度量、可上线”的工程能力,是 LLM 应用工程师与安全测试岗的核心加分项。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 Promptfoo:LLM 输出随机 → 自动化回归测试
LLM 应用与传统软件最大的不同在于输出不固定:同样的提示词(Prompt),同一模型每次返回的文本都可能不同;提示词一个标点符号的改动,可能让对话质量大幅下降,也可能让格式化输出直接失效。传统做法是人工把几十条用例逐条粘贴进聊天窗口比对,费时费力,且无法沉淀成可重复执行的测试资产;当团队同时维护多套提示词、多个模型时,回归验证更是难以持续。
Promptfoo 把“测试提示词”这件事工程化:用 promptfooconfig.yaml 声明测试集,命令行一键执行,自动判断每条用例是否通过预设的断言(Assertion),并输出通过率、耗时、成本等指标。它支持 OpenAI、Anthropic、Azure、Ollama 等数十种模型提供方,同一套测试可在不同提示词、不同模型之间横向对比。改动提示词后重新运行即可确认无回归,从而把提示词迭代变成可度量的工程流程。
与同类工具相比,Promptfoo 的气质是“配置即代码”:不依赖特定平台或框架,纯 CLI 操作,既能跑在本地,也能直接接入 CI 流水线,MIT 协议下没有额外锁定,测试资产完全自持。
安装与环境配置:3 步就绪
第一步安装:Promptfoo 以 npm 包形式分发,要求 Node.js 18 及以上。全局安装后可随时调用 promptfoo 命令;不想全局安装时,用 npx 临时运行亦可,两者命令等价。
第二步配置:执行 promptfoo init 在当前目录生成示例 promptfooconfig.yaml 与说明,随后把模型密钥写入环境变量。Promptfoo 会自动读取项目根目录的 .env 文件(如 OPENAI_API_KEY=sk-xxx),无需手动逐条导出。
第三步验证:运行 promptfoo --version 确认安装成功;随后在已配置好密钥的目录执行 promptfoo eval,有配置即直接出评估结果,无配置则提示先初始化。
npm install -g promptfoo# 不想全局安装时:npx promptfoo@latestpromptfoo --version# 生成示例配置promptfoo init# 在 .env 中填写 OPENAI_API_KEY 后运行示例评估promptfoo eval
快速上手:10 分钟跑通第一个评估
最小可用流程的核心思路:写一份配置文件 → 运行评估 → 打开报告。配置文件同时承担“测试用例”与“断言”两个角色,是 Promptfoo 唯一的必写资产。
步骤一:在项目目录创建 promptfooconfig.yaml,声明要评测的提示词模板、模型提供方与测试用例。提示词中用 {{变量名}} 引用用例变量,用例写在 tests 字段。步骤二:在 .env 文件中写入 OPENAI_API_KEY。步骤三:执行 promptfoo eval,CLI 输出每条用例的通过与整体通过率。步骤四:执行 promptfoo view 启动本地 Web 界面,可逐条查看输入输出与断言详情,对比多个提示词或模型的差异。
下面是一份可直接运行的翻译场景配置:
运行结果中,contains 断言要求输出包含 "Bonjour",latency 断言要求响应不超过 5000ms,全部通过则该用例通过。进阶技巧:在 prompts 中并列多段提示词、在 providers 中并列多个模型,即用同一份测试集横向 PK——这是做模型选型最常用的姿势。
# promptfooconfig.yamlprompts: - "将下面这句话翻译成法语:{{text}}"providers: - openai:gpt-4o-minitests: - vars: text: "你好,世界" assert: - type: contains value: "Bonjour" - type: latency threshold: 5000
promptfoo evalpromptfoo view # 浏览器打开本地报告,默认端口 15500
核心能力详解:4 大支柱
支柱一 · 多 Provider 适配。内置 40+ 模型提供方接入(OpenAI、Anthropic、Azure OpenAI、Google Gemini、Ollama 本地模型、私有网关等),providers 字段直接写 provider:model 格式,同一测试集可跨厂商执行;也支持 eval 时通过 --providers 参数在命令行覆盖配置,无需改动文件。
支柱二 · 断言系统。断言是判定输出是否符合预期的规则,分两类:确定性断言(deterministic,如 contains 包含、regex 正则、javascript/python 脚本、latency 延迟、cost 成本)由本地计算,稳定可复现;模型评分断言(如 llm-rubric,由另一个 LLM 按标准打分)适合主观质量评估;此外支持 webhook 对接自建裁判逻辑。
支柱三 · 对比评估报告。eval 结果自动生成结构化报告:promptfoo view 打开 Web 界面可逐条展开输入、输出、断言详情;promptfoo share 将结果上传生成在线链接,方便团队评审与缺陷留档;CLI 同时支持输出 JSON/HTML/CSV 报告,可沉淀到制品库。
支柱四 · Red Teaming 安全测试。v1.0 正式发布的红队模块可自动生成攻击性测试用例,覆盖提示注入、越狱(jailbreak)、敏感信息泄露、恶意内容等场景。promptfoo redteam setup 生成安全测试配置,redteam run 执行攻击矩阵并产出漏洞报告,把安全测试并入日常评估流程。
生产部署与监控:从上线到运维
CI 集成是 Promptfoo 最常见的生产用法:在 GitHub Actions 等流水线中安装 promptfoo 后执行 promptfoo eval --no-cache --threshold 90,通过率低于 90% 时进程以非零退出码结束、流水线即失败——提示词回归被拦截在合并之前,无需人工盯屏:
程序化调用方面,Promptfoo 同时提供 Node.js 库 API(import { evaluate } from "promptfoo"),可在自有测试框架、数据处理管道中按批次调用评估并解析结果,适合把评估嵌入更复杂的质检链路。
可观测性上,建议关注三类指标:通过率(断言通过比例,核心回归信号)、单次响应延迟与成本(通过 latency/cost 断言设上限)、失败用例的分布(是固定一条失败还是随机波动)。配合 --cache 可复用相同请求组合的结果以显著降本,但要注意缓存与配置变更的关系(见下方避坑)。分享链接可作为评审证据,形成提示词变更的审计轨迹。
<p class="para-label">避坑清单:</p>
<ul class=“dash-list“><li>缓存导致结果不更新:Promptfoo 以”提示词+提供方+测试用例”组合为缓存键,改动断言或环境变量不会自动失效,需要全量重跑时加 --no-cache;</li><li>Node 版本过低安装失败:npm 安装报引擎不兼容时先升级 Node 至 18+,而不是绕过低版本约束;</li><li>llm-rubric 结果不稳定:模型评分存在随机性,关键用例优先用 contains/regex 等确定性断言,裁判模型建议设为 temperature=0;</li><li>API Key 未生效:.env 文件必须与 promptfooconfig.yaml 同目录,格式为 OPENAI_API_KEY=sk-xxx,不要加引号与多余空格;</li></ul>
- uses: actions/checkout@v4- run: npm install -g promptfoo- run: promptfoo eval --no-cache --threshold 90 env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
| 维度 | Promptfoo | LangSmith | DeepEval | Ragas |
|---|---|---|---|---|
| 定位 | 开源提示词测试框架 | LLM 可观测性平台 | 开源 LLM 评估框架 | RAG 专项评估框架 |
| 编排范式 | YAML 配置 + CLI eval | SDK 埋点 + 云端看板 | Python 代码 + pytest | Python 代码 + 数据集 |
| 类型约束 | Node.js CLI,支持 JS/Python 扩展 | 多语言 SDK(Python/JS) | 纯 Python | 纯 Python |
| 学习曲线 | 低:纯配置即可跑通 | 中:SDK 集成 + 平台学习 | 中:面向开发者 | 中:需理解 RAG 指标 |
| 生态集成 | 40+ provider、CI 友好 | LangChain 生态深度绑定 | pytest、Hugging Face | LangChain/LlamaIndex RAG 链路 |
| 生产部署 | 本地 CLI/CI 自部署,MIT 无锁定 | 托管 SaaS,数据上云 | 自建或 CI 运行 | 自建或 CI 运行 |
| License | MIT | 商业(有免费额度) | Apache 2.0 | Apache 2.0 |
| 适合谁 | 提示词工程师、QA、安全团队 | LangChain 重度用户、需全链路追踪 | Python 数据团队 | RAG 系统质检 |
选型建议:追求零成本、配置即代码、要跑 CI 且不想被平台绑定,首选 Promptfoo;已在 LangChain 生态且需要 Tracing 与线上监控,LangSmith 更顺;纯 Python 团队且评估逻辑要写代码,DeepEval 更贴合;只关心 RAG 检索与生成质量,Ragas 指标最专业。四者并非互斥,常见组合是 Promptfoo 做提示词回归 + LangSmith 做线上监控。
版本迭代
Promptfoo 从 2023 年 6 月的单文件 CLI 起步,核心演进主线是“评估能力增强 → 生态扩展 → 安全能力并入”。2024 年密集补齐 Provider 适配与断言类型,2025 年 1 月发布的 v1.0 将 Red Teaming 从预览转为正式能力,标志着安全测试成为框架的一等公民(截至训练数据,可能已有更新版本)。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| v0.1 | 2023-06 | CLI 首次发布 | 支持 OpenAI 模型与基础断言 eval |
| v0.30 | 2023-11 | Provider 与断言扩展 | 接入 Azure,新增多种断言类型,支持模型输出对比 |
| v0.70 | 2024-06 | 评估能力增强 | Ollama 本地模型、缓存与并发控制、JS/Python 扩展 |
| v0.90 | 2024-10 | Red Team 预览 | 红队攻击模板与合规报告进入测试 |
| v1.0 | 2025-01 | 正式版发布 | Red Teaming 生产就绪,CLI 与报告稳定性提升 |
版本主线是从“demo 工具”走向“工程工具”:2024 年补齐的生产级特性(缓存、并发、CI 退出码)让 eval 可以安全跑在流水线中,v1.0 的红队能力则回应了 LLM 应用的安全合规需求。Promptfoo 是测试框架而非模型,没有 MMLU 等公开基准分可对比,版本间的实测差异主要体现为断言类型覆盖度与 Provider 兼容性。选型上建议直接使用 v1.0 及以上版本,无需停留在 0.x。
AI 应用场景
场景一:提示词迭代的回归测试
阶段:提示词工程 / 持续集成(CI)
解决的问题:客服机器人或 Agent 的提示词每次微调都伴随“改坏了怎么办”的风险。传统人工回归只能覆盖主干对话,漏检率高;Promptfoo 将历史问题沉淀为断言用例(关键词命中、JSON 格式、响应延迟),提交代码时流水线自动执行,任何回退立即失败并指出具体用例。
具体案例:某客服团队维护 200+ 条历史对话用例,提示词改动后的回归验证从人工逐条核对约 30 分钟缩短为 CI 自动执行的秒级,通过率低于阈值(如 95%)时阻断合并。
场景二:多模型选型的横向对比
阶段:模型评估与选型
解决的问题:同一个任务,GPT-4o、Claude、DeepSeek、本地小模型谁更合适?人工分别试错无法控制变量。Promptfoo 用同一份测试集跑全部候选模型,自动输出质量、延迟、成本三个维度的对照表。
具体案例:在翻译场景中并列 4 个模型与 3 版提示词,一次 eval 得到 12 组对比结果;据此发现小模型配合结构化提示词可在成本下降约 90% 的同时维持 95% 以上的断言通过率,直接支撑选型决策。
场景三:LLM 应用安全红队评估
阶段:安全测试 / 合规评估
解决的问题:提示注入、越狱、数据泄露是 LLM 应用上线前必须排查的风险,手动构造攻击用例既不全面也不可复现。Promptfoo Red Teaming 自动生成攻击矩阵,覆盖提示注入、越狱、PII 泄露、恶意内容等类别并输出漏洞报告。
具体案例:发布前执行 promptfoo redteam run 对客服机器人进行 100+ 攻击用例扫描,检出 3 类注入绕过向量;修复后在 CI 中持续复跑防回归,安全测试随代码一起交付。
常见误区
误区我用的是 Anthropic / 本地部署的模型,Promptfoo 是不是就用不了?我看示例全是 openai:gpt-4o 这种写法。
正解Promptfoo 内置 40+ 提供方适配,providers 字段一句切换:anthropic:claude-3-5-sonnet、azure:deployment、ollama:llama3 均可;私有网关与本地模型通过自定义 API 脚本(JS/Python)接入。示例中 openai 只是默认演示,并非能力上限。
为何常见:官方文档示例以 OpenAI 开头最多,初学者容易把“默认示例”误读为“唯一支持”。
误区Promptfoo 的断言是不是都得靠另一个 AI 来评分?那结果随机性很大,测试还有什么意义?
正解断言分两类:contains、regex、javascript、latency、cost 等确定性断言由本地计算,结果稳定可复现;llm-rubric 等模型评分断言只是按需使用的一类。工程上建议关键格式与关键词用确定性断言,主观质量才交给模型评分,并将裁判模型设为 temperature=0。
为何常见:llm-rubric 在文档中讲解较多、看起来“高级”,容易让人误以为评估只能依赖模型。
误区我改了 prompt 和断言重新跑 eval,结果和上次一模一样,是不是工具坏了?
正解缓存以“提示词内容 + Provider + 测试用例”为键,这些输入未变化时命中缓存并直接复用,这是为节省 API 成本设计的。修改断言、提示词模板会更换键值;若怀疑缓存影响,加 --no-cache 强制全量重跑即可。
为何常见:缓存是隐藏行为,新用户不知道其存在,遇到“结果未更新”首先怀疑程序异常而不是缓存机制。
误区我的应用有多个函数调用、多轮对话,单条 prompt 的测试覆盖不了,Promptfoo 是不是太玩具了?
正解除了静态提示词,Promptfoo 支持自定义 JS/Python 函数作为 provider,可编排多步调用链并注入模拟上下文;多轮对话场景可将历史对话写入变量,测试用例本身能表达复杂交互流程,再配合断言校验最终输出。
为何常见:初看 YAML 配置认为只能写单条模板,其实 provider 位置可以放任意可执行函数。
误区安全红队听起来是高级功能,是不是要买企业版才能用?
正解Red Teaming 是 v1.0 起内置在 MIT 开源框架中的模块,promptfoo redteam setup / run 直接可用,社区版就能生成攻击矩阵与报告;企业版(Cloud)额外提供的是托管运行、团队协作与合规输出,而非基础红队能力。
为何常见:同类安全工具多为商业产品,用户默认“安全功能=收费功能”,忽略了开源框架将红队能力下放这一事实。
面试题
Q1. Promptfoo 的评估配置通常存放在哪个文件中?
- A.promptfooconfig.yaml← 正确答案
- B.requirements.txt
- C.docker-compose.yml
- D.package.json
答案:A。Promptfoo 约定在项目根目录读取 promptfooconfig.yaml(或同名的 .json 文件)作为评估配置,其中声明 prompts、providers、tests 三要素。requirements.txt 是 Python 依赖文件、docker-compose.yml 是容器编排、package.json 是 npm 项目清单,均与评估配置无关。
Q2. 执行提示词评估的正确 CLI 命令是?
- A.promptfoo eval← 正确答案
- B.promptfoo run
- C.promptfoo test
- D.promptfoo start
答案:A。Promptfoo 的核心命令是 promptfoo eval,它读取配置、调用模型并执行断言;promptfoo view 是打开报告,promptfoo redteam 是红队测试。CLI 中不存在 run/test/start 子命令,这属于对命令名的常见混淆。
Q3. 不全局安装 Promptfoo 的前提下,临时运行它的正确方式是?
- A.npx promptfoo@latest← 正确答案
- B.npm run promptfoo
- C.npm install promptfoo
- D.npx node promptfoo
答案:A。npx promptfoo@latest 会通过 npm 拉取最新版并直接执行,无需全局安装,是官方推荐的免安装用法。npm run 需要项目内已安装且配置过 scripts,npm install 只是安装动作不会执行命令,npx node 语法错误。
Q4. 提示词模板中引用测试用例变量的语法是?
- A.{{variable}}← 正确答案
- B.${variable}
- C.%variable%
- D.<variable>
答案:A。Promptfoo 使用 {{变量名}} 双花括号语法,与 tests 中 vars 字段的键对应(如 {{text}} 引用 vars.text)。${} 是 shell 与模板字符串语法,%% 是 Windows 批处理变量,<> 是 HTML 标签符号,均不是 Promptfoo 的变量引用方式。
Q5. 需要由另一个 LLM 按评分标准评判输出质量,应选用哪种断言类型?
- A.llm-rubric 评分← 正确答案
- B.equals 严格相等
- C.contains 包含子串
- D.regex 正则匹配
答案:A。llm-rubric 是模型评分断言,由裁判 LLM 按 rubric 中的标准衡量输出是否符合预期,适合“回答是否友好”“逻辑是否清晰”这类主观判断。equals/contains/regex 均为本地计算的确定性断言,规则固定但无法评估开放标准。
Q6. 下列选项中,哪一项不属于确定性断言(deterministic assertion)?
- A.llm-rubric 模型评分← 正确答案
- B.contains 包含子串
- C.javascript 脚本断言
- D.latency 延迟断言
答案:A。确定性断言包括 contains、equals、regex、javascript、python、latency、cost 等,由本地代码计算,结果可复现。llm-rubric 需要调用另一模型打分,结果受采样与模型影响,属于模型评分断言而非确定性断言。
Q7. 关于查看 Promptfoo 评估结果的方式,下列说法正确的有哪些?
- A.promptfoo view 可启动本地 Web 界面← 正确答案
- B.终端会直接输出用例通过/失败摘要← 正确答案
- C.eval 支持生成 JSON/HTML 格式报告← 正确答案
- D.结果只能通过邮件订阅获取
答案:ABC。eval 完成后终端即输出摘要,promptfoo view 启动本地 Web 界面逐条查看,CLI 同时支持输出 JSON/HTML/CSV 报告用于归档。Promptfoo 没有邮件订阅功能,D 选项不成立。
Q8. 关于 Promptfoo 的请求缓存机制,下列描述正确的是?
- A.缓存以提示词+提供方+测试用例组合为键← 正确答案
- B.缓存一旦生成永久生效无法清除
- C.缓存会自动记录完整的多轮对话内容
- D.缓存机制仅对 OpenAI 模型生效
答案:A。缓存键由提示词内容、provider 与测试用例组合决定,用于相同输入复用 API 响应以节省成本。--no-cache 可跳过缓存,--cache 也可手动开关,并非永久不可清除;它的目标是复用响应而非记录对话,且对所有支持的 provider 生效。
Q9. 将 Promptfoo 接入 CI 流水线的正确实践包括哪些?
- A.断言失败时以非零退出码结束进程← 正确答案
- B.使用 --threshold 设定通过率阈值← 正确答案
- C.在 CI 中通过 --no-cache 获取最新结果← 正确答案
- D.用随机生成的测试数据规避缓存命中
答案:ABC。promptfoo eval 在通过率低于 --threshold 时返回非零退出码,这是 CI 阻断的关键机制;CI 环境默认应关闭缓存避免陈旧结果。随机测试数据破坏可复现性,违背回归测试的设计初衷,属于反模式。
Q10. Promptfoo Red Teaming 模块可自动覆盖哪些安全测试类别?
- A.提示注入与越狱攻击← 正确答案
- B.敏感信息与隐私泄露测试← 正确答案
- C.恶意内容与拒绝服务探测← 正确答案
- D.应用前端页面的视觉回归
答案:ABC。Red Teaming 内置提示注入、越狱(jailbreak)、PII 泄露、有害内容、拒绝服务等攻击类别,通过插件化策略生成攻击用例并评估模型防御表现。视觉回归属于前端 UI 测试范畴,与 LLM 安全测试无关。