promptfoo:LLM 评测与红队测试的开源标准
📖 简介
📝 详细介绍
promptfoo:把 LLM 评测变成工程纪律
你团队每天在 Slack 里传着各种 Prompt 跑出来的结果截图,靠肉眼对比哪个输出更好?或者每次模型更新后用一堆零散的 Python 脚本跑一遍测试,结果下次还得手动重跑?promptfoo 用一个声明式的 YAML 配置文件替代了这些临时流程,让你像写单元测试一样为 LLM 编写评测用例,并自动做红队攻击。它不是一个“AI 评测平台”,而是一个开发者用的 CLI 工具 + 库,能直接跑在 CI 里。
| 属性 | 值 |
|---|---|
| Stars | 12k+ |
| 主语言 | TypeScript |
| 协议 | MIT |
| 最近更新 | 2024-05 (v0.60+) |
项目背景
promptfoo 由前端工程师 Ian Webster 创建(他也是 promptfoo 公司创始人),初衷是解决团队在构建 LLM 应用时遇到的 “评测混乱”。当时大家用 Google Sheets 管理 Prompt 版本,用不同的脚本计算相似度,结果不一致且无法复现。Ian 希望提供一种 配置即代码 的方式,让评测像写 Jest 测试一样简单,同时内置红队能力——毕竟 LLM 的安全测试不能光靠人肉尝试。
核心功能解析
1. 声明式测试用例
所有测试写在一个 promptfooconfig.yaml 文件里:定义 Prompt 模板、输入变量、目标输出(预期),以及评测指标。支持 provider 无关——同一个配置可以跑在 OpenAI、Anthropic、Hugging Face 甚至本地部署的模型上。
prompts:
- "Translate the following to French: {{text}}"
- "Translate the following to Italian: {{text}}"
providers:
- id: openai:chat:gpt-3.5-turbo
config:
temperature: 0
- id: openai:chat:gpt-4
tests:
- vars:
text: "Hello, world!"
assert:
- type: contains
value: "Bonjour" # 期望第一个 Prompt 输出包含 Bonjour
- vars:
text: "I love programming"
assert:
- type: similar
threshold: 0.9
value: "J'adore programmer" # 语义相似度 >= 0.9
2. 多种评估指标
除了基础的 contains、equals,还支持 嵌入向量相似度(基于 text-embedding-ada-002)、LLM 评判(让 GPT-4 评估输出质量)、自定义函数(写 JavaScript 判断逻辑)。这些指标都可以在 assert 里组合使用,形成可量化的通过/失败标准。
assert:
- type: llm-rubric
value: "The response should be polite and professional"
- type: python
value: |
def fn(output, context):
return len(output) > 100
3. 自动化红队测试
内置 红队模块:通过模板和变异策略生成对抗性输入——包括 prompt 注入、越狱尝试、角色反转等。你只要定义一组“有害类目”(如泄露指令、生成危险代码),promptfoo 会自动构造测试用例并记录模型是否 “中招”。结果以矩阵形式展示,一目了然。
categories:
- implicit-jailbreak
- instruction-leak
- harmful-code
redteam:
plugins:
- name: fuzzer
config:
mutations:
- expand
- typo
快速上手
全局安装或通过 npx 直接使用:
# 安装
npm install -g promptfoo
# 初始化一个 demo 项目
promptfoo init --template minimal
cd my-llm-eval
# 运行评测
promptfoo eval
# 本地查看报告(自动打开浏览器)
promptfoo view
默认会生成一个交互式的 HTML 报告,包含每个测试用例的输入、输出、得分和差异对比。
技术亮点
1. 缓存层设计:每次评测会缓存 provider 的响应(基于输入 + prompt + provider 的哈希)。当你修改了评测指标但没改 Prompt 时,不会重复调用 API,节省成本并加速迭代。缓存在 ~/.promptfoo/cache 下,支持 --no-cache 强制刷新。
2. Provider 抽象与多模型对比:promptfoo 定义了统一的 Provider 接口,任何 LLM 只要实现 callApi 方法和流式输出适配,就能接入。内置 20+ 个 provider(OpenAI、Azure、Anthropic、Cohere、Ollama 等),且支持 多 provider 对比——同一个测试用例可以并行跑在不同模型上,输出并列对比。
3. 插件化评测管道:评测不再是简单的“输入-输出-打分”。promptfoo 内部把评测步骤拆成 hook(前置/后置),支持自定义插件修改 prompt、变换输出、注入上下文。红队测试也是通过插件系统实现的,这意味着你可以写出任意复杂的攻击策略。
4. 天然 CI 友好:退出码反映是否通过所有断言(0 表示全部通过),配合 junit 输出格式能直接集成到 GitLab CI、GitHub Actions 里。不少团队已将其作为 Prompt 发版前的必要门禁。
引用自官方 README:“promptfoo is a tool for evaluating and red-teaming LLM apps. It’s used by companies like Anthropic, Airbnb, and Netflix.”
同类对比
| 工具 | 评测能力 | 红队能力 | 易用性 | 定制性 | 社区活跃 |
|---|---|---|---|---|---|
| promptfoo | 多指标、LLM 评判、嵌入 | 内置 fuzzer + 模板 | CLI + YAML,零依赖 | 强(插件、自定义 provider) | 高(12k stars, 持续更新) |
| LangChain eval | 主要针对 chain 输出 | 无 | 与 LangChain 绑定 | 中(需改写 chain) | 高(但非独立工具) |
| DeepEval | 指标丰富(G-Eval 等) | 有独立模块 | Python API,需集成 | 中(支持自定义指标) | 中 |
| RAGAS | 专注 RAG 场景 | 无 | Python 库 | 低(场景限定) | 中 |
总结
promptfoo 是当前最适合开发者直接上手的 LLM 评测与红队测试工具。它把测试从“人工评审”变成了“自动化门禁”,零集成成本,一次配置就能跑在任意模型上。如果你们的团队正在为生产级的 LLM 应用质量头疼,或者需要对 Prompt 做持续回归,不要犹豫,直接 npm install -g promptfoo 开始用。
AI 项目推荐
智能体- 标签
- #LLM评测 #红队测试 #提示词工程 #安全
- 浏览
- 👁️ 7
- 发布日期
- 2026-07-30