Promptfoo: LLM 应用评估与红队测试的利器
在 LLM 应用开发日益普及的今天,如何系统化地评估 Prompt 质量、模型表现和应用安全性,成为每个 AI 工程师必须面对的课题。Promptfoo 正是为解决这一痛点而生的开源工具——它不仅是 Prompt 工程领域的 “Jest”,更是红队测试和模型对比评估的全能选手。
什么是 Promptfoo
Promptfoo 是一个用于评估和红队测试 LLM 应用的 CLI 工具库,于 2026 年 3 月正式加入 OpenAI,但始终保持 MIT 开源许可。它在 GitHub 上拥有约 20,000 颗星,每周 npm 下载量高达 165,000 次,已经成为 LLM 应用质量保证的事实标准。
从功能定位来看,Promptfoo 解决的核心问题是:如何科学地、可复现地评估 LLM 应用的输出质量。它支持对任意 LLM API 进行测试,包括 OpenAI、Claude、Gemini、Llama 等主流模型,让你能够在统一框架下进行模型对比和基准测试。
核心特性
全面的评估能力
Promptfoo 提供了两类评估指标:确定性指标和模型辅助指标。前者如精确匹配、JSON 结构验证、延迟测量等,完全基于规则和数学计算;后者则借助其他 LLM 作为”裁判”,评估输出的事实准确性、答案相关性、上下文忠诚度等主观维度。
红队安全测试
除了功能性评估,Promptfoo 在安全领域同样表现出色。它支持对 LLM 应用进行红队测试,帮助发现 Prompt 注入、越狱攻击、内容安全等问题。结合 CI/CD 集成和 PR 安全扫描功能,可以在代码提交阶段就拦截潜在的安全风险。
开发者友好的工程设计
Promptfoo 秉承”开发者优先”的理念,实现了快速迭代、热重载和智能缓存机制。这意味着你可以即时看到测试结果,无需长时间等待。100% 本地执行的评估模式确保了数据隐私不会泄露。灵活的扩展性则让你可以对接任意 LLM API,而不是被某个特定供应商绑定。
评估标准详解
Promptfoo 的评估体系是其核心价值所在。接下来我们将深入解析其两大类评估指标。
确定性指标(Deterministic Metrics)
确定性指标完全依赖规则和算法进行判定,结果可复现且不依赖外部模型:
| 指标名称 | 用途 | 说明 |
|---|---|---|
equals | 精确匹配 | 要求输出与预期完全一致 |
contains / icontains | 子串包含 | 检查输出是否包含指定文本(后者忽略大小写) |
regex | 正则匹配 | 使用正则表达式验证输出格式 |
is-json / is-html / is-xml | 结构验证 | 验证输出是否为有效的 JSON/HTML/XML |
starts-with | 前缀匹配 | 检查输出是否以指定文本开头 |
levenshtein | 编辑距离 | 设置最大编辑距离阈值 |
rouge-n | 文本摘要评分 | 常用于评估文本相似度 |
similar | 余弦相似度 | 基于 Embedding 的语义相似度计算 |
latency | 延迟阈值 | 验证响应时间是否低于指定毫秒数 |
cost | 成本阈值 | 验证推理成本是否在预算内 |
perplexity / perplexity-score | 困惑度测量 | 用于检测幻觉(Hallucination) |
python | 自定义验证 | 编写 Python 函数进行任意验证 |
模型辅助指标(Model-Assisted Metrics)
当确定性指标无法满足需求时,模型辅助指标借助其他 LLM 的判断力来进行更复杂的评估:
| 指标名称 | 用途 | 说明 |
|---|---|---|
llm-rubric | LLM 裁判评分 | 提供评分规则(Rubric),让 LLM 按规则打分 |
g-eval | G-Eval 框架评估 | 采用链式思维(Chain-of-Thought)进行评估 |
factuality | 事实准确性 | 检查输出是否遵循提供的事实依据 |
model-graded-closedqa | 封闭问答评分 | 基于问答形式的闭合式评估 |
answer-relevance | 答案相关性 | 评估输出与查询的相关程度 |
context-faithfulness | 上下文忠诚度 | 特别适用于 RAG 场景,检测是否产生幻觉 |
classifier | HuggingFace 分类器 | 使用 HuggingFace 模型进行分类判断 |
pi | Pi Labs 偏好评分 | Pi Labs 的偏好打分模型 |
trajectory:goal-success | 任务完成评估 | 评估 Agent 任务是否成功完成 |
评分机制
除了指标定义,Promptfoo 还提供了灵活的评分组合机制:
权重系统:weight 字段允许为不同指标设置加权平均,重要指标可以拥有更高权重。
阈值判定:threshold 字段设置通过/失败的边界值,例如延迟超过 2000ms 则判定为失败。
取反操作:使用 not- 前缀可以反转指标逻辑,例如 not-contains 表示输出不应包含指定文本。
命名指标:通过 named 标签对指标进行分组,便于后续聚合分析。
派生指标:derivedMetrics 支持定义复合公式,例如 F1 = 2 * precision * recall / (precision + recall)。
配置结构
Promptfoo 的配置文件采用 YAML 格式,主要由以下几个核心部分组成:
prompts:定义测试使用的提示词模板,支持 Nunjucks 模板语法,可以进行变量插值和条件渲染。
providers:指定 LLM 提供者,支持 OpenAI、Claude、Gemini、Ollama 等,可配置 API 密钥、端点、模型版本等参数。
tests:测试用例集合,每个用例包含变量(vars)和断言(assertions)。变量用于渲染 Prompt,断言定义评估规则。
derivedMetrics:派生指标定义,用于创建基于原始指标的复合评分。
实战示例
以下是一个完整的 Promptfoo 配置文件示例,展示了如何评估一个 RAG 问答系统:
prompts: - "你是一个技术助手。请根据以下上下文回答用户问题。\n\n上下文:{{context}}\n\n问题:{{question}}\n\n回答:"
providers: - id: openai:chat:gpt-4o config: temperature: 0.3 max_tokens: 500
tests: - vars: context: "苹果公司成立于 1976 年,总部位于加利福尼亚州库比蒂诺。" question: "苹果公司成立于哪一年?" assert: - type: contains value: "1976" weight: 2 - type: factuality weight: 3 - type: context-faithfulness weight: 2 - type: latency threshold: 3000
- vars: context: "Python 是一种高级编程语言,由 Guido van Rossum 于 1991 年创建。" question: "Python 是由谁创建的?" assert: - type: contains value: "Guido" - type: answer-relevance threshold: 0.8
derivedMetrics: - name: "F1-Score" value: "2 * precision * recall / (precision + recall)"在上述配置中,我们定义了一个 RAG 问答系统的评估方案。第一个测试用例验证模型能否正确回答关于苹果公司成立时间的问题,通过 contains 检查答案是否包含”1976”,同时用 factuality 和 context-faithfulness 确保回答的事实性和上下文一致性。第二个用例则关注回答的相关性,使用 answer-relevance 指标确保评分不低于 0.8。
安装与使用
Promptfoo 支持多种安装方式,适应不同的使用场景:
通过 npm 全局安装是最常见的方式:
npm install -g promptfoomacOS 用户可以使用 Homebrew:
brew install promptfooPython 用户则可以通过 pip 安装:
pip install promptfoo对于不想安装的用户,npx 方式可以直接运行:
npx promptfoo@latest安装完成后,通过 promptfoo init 初始化项目,它会创建一个默认的 promptfooconfig.yaml 配置文件。运行测试只需执行 promptfoo eval,结果会以表格形式展示各项指标的得分。
总结
Promptfoo 代表了 LLM 应用质量保证的最新实践。它将软件工程中成熟的测试理念引入 AI 领域,通过系统化的评估标准和灵活的扩展机制,让 Prompt 工程从”玄学”变为”工程”。
无论你是想要优化一个 RAG 系统、对比不同模型的表现,还是在 CI/CD 流水线中嵌入安全扫描,Promptfoo 都能提供开箱即用的解决方案。其 MIT 开源许可和活跃的社区生态,确保了你不会被任何单一供应商锁定。在 LLM 应用开发日益成为主流的今天,掌握 Promptfoo 这样的工具,已经成为 AI 工程师的必备技能。