把 LLM 测试从"手摸"变成工程化——我试了 Promptfoo

简介: Promptfoo 是开源的 LLM 提示词测试与评估框架,支持声明式 YAML 配置、多模型对比、自动化断言(含 LLM 评分)、红队安全测试及 CI/CD 集成,让提示词优化从“凭感觉”走向可量化、可回归、可监控的工程实践。(239字)

调提示词这件事,我以前基本靠手感。改一版 prompt,手动跑几条用例,看着输出觉得"好像好点了"就上线。但LLM 输出有随机性,几条样本根本说明不了问题,而且上线后经常发现某些 corner case 还是翻车。

最近开始用 Promptfoo。它是一个开源的 LLM 测试与评估框架,也支持红队安全测试。我用它做了一个项目的 prompt 回归测试,效果比手动测好很多。今天聊聊这个工具。


一、Promptfoo 解决什么问题

简单说,它把软件工程里的测试驱动开发思想搬到了 LLM 应用上。

传统调 prompt 的问题:

  • 手动测几条,主观判断
  • 换模型、换提示词版本后没有回归基线
  • 安全漏洞(提示注入、越狱、数据泄露)靠人工想,覆盖不全
  • 不同模型之间没有系统对比

Promptfoo 的做法是:用声明式配置定义测试矩阵,自动运行、自动断言、生成对比报告。

YAML 配置文件
    ├── prompts(待测提示词)
    ├── providers(模型提供商)
    ├── tests(测试用例)
    └── assertions(断言规则)
              │
              ▼
    promptfoo eval 自动运行
              │
              ▼
    生成 Web UI 报告 / CI 门禁

二、核心配置长什么样

Promptfoo 用 YAML 配置,结构很清晰。一个最小示例如下:

prompts:
  - "将以下文本分类为正面或负面:{
   {text}}"
  - "判断这段评论的情感倾向(正面/负面):{
   {text}}"

providers:
  - openai:gpt-4o
  - anthropic:claude-3-5-sonnet

tests:
  - vars:
      text: "这家餐厅太棒了"
    assert:
      - type: icontains
        value: "正面"
  - vars:
      text: "服务态度很差"
    assert:
      - type: icontains
        value: "负面"
  - vars:
      text: "一般吧,没什么特别的"
    assert:
      - type: answer-relevance
        threshold: 0.7

这个配置会:

  1. 用两个提示词模板
  2. 跑两个模型
  3. 对三个测试用例分别断言
  4. 自动生成 2 × 3 = 6 组结果对比

三、断言机制是它的核心竞争力

Promptfoo 支持多种断言类型:

断言类型 用途
equals / contains / icontains 精确匹配、包含判断
answer-relevance 答案相关性
context-recall / context-faithfulness RAG 评估
json-schema 校验输出 JSON 结构
javascript / python 自定义脚本验证
llm-rubric 用更强的模型当评委打分

最实用的是 llm-rubric。复杂业务场景下,规则很难写,可以让 GPT-4o 或 Claude 给输出打分,并说明理由。虽然成本高一点,但覆盖了大量人工难以枚举的情况。


四、多模型对比很实用

我同一个测试配置跑 GPT-4o、Claude 3.5 Sonnet 和本地 Ollama 模型,Promptfoo 会输出一张对比表:

模型 通过率 平均耗时 Token 消耗 成本
GPT-4o 95% 1.2s 12k $0.18
Claude 3.5 92% 1.5s 14k $0.21
Ollama llama3 78% 4.5s 18k $0

这个表对选型很有帮助。有时候本地模型够便宜但质量差一点,有时候云端模型质量高但贵。用数据说话,比拍脑袋选型靠谱。


五、红队测试:不只是功能测试

Promptfoo 还有一个很强的能力:自动化红队测试

它可以自动生成大量对抗性输入,测试你的应用是否存在:

  • 提示词注入(Prompt Injection)
  • 越狱攻击(Jailbreak)
  • 敏感信息 / PII 泄露
  • 有害内容生成
  • 业务规则绕过
  • Agent 不安全工具调用

使用方式也很简单:

npx promptfoo@latest redteam setup
npx promptfoo redteam run
npx promptfoo redteam report
连接应用
    │
    ▼
生成上下文感知攻击
    │
    ▼
运行测试并识别漏洞
    │
    ▼
PR 中显示发现 + 修复建议
    │
    ▼
持续监控

这对要上线的 AI Agent 很重要——你自己想不到的攻击向量,Promptfoo 的社区威胁情报会帮你想到。


六、接进 CI/CD

Promptfoo 是 CLI 工具,接进 CI/CD 很自然。我把它配进 GitHub Actions:

name: LLM Eval
on:
  pull_request:
    paths:
      - 'prompts/**'
      - 'promptfooconfig.yaml'

jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g promptfoo
      - run: promptfoo eval --config promptfooconfig.yaml
        env:
          OPENAI_API_KEY: ${
   {
    secrets.OPENAI_API_KEY }}

这样每次改 prompt 都会自动跑测试,分数低于阈值就阻止合并。把提示词变更纳入代码质量门禁,这是真正的"测试即代码"。


七、Web UI 报告

跑完测试后,Promptfoo 会起一个本地网页:

promptfoo view

报告里能看到每个用例在每个模型上的输出、断言是否通过、token 消耗、耗时。失败用例可以点进去看完整输出和失败原因,排查很方便。


八、我的实际使用感受

适合的场景:

  • prompt 已经比较稳定,需要防止回归
  • 多模型选型,需要量化对比
  • 对安全性有要求,需要系统做红队测试
  • 团队协作,需要把 prompt 测试纳入 CI 流程

不适合的场景:

  • 还在快速迭代 prompt 的早期阶段,测试配置反而拖慢速度
  • 完全不在乎成本和质量,只求快
  • 没有可定义的期望输出,断言写不出来

最大的改变:

用了 Promptfoo 之后,我调 prompt 不再靠"感觉更好了",而是看通过率有没有提升、哪个断言失败了、成本变化多少。这种量化反馈让提示词工程更像工程,而不是炼丹。


结语

Promptfoo 代表了一个趋势:LLM 应用正在从"写 prompt"走向"测试 prompt"

当提示词成为生产系统的一部分,它就需要有单元测试、回归测试、安全测试。Promptfoo 把这套基础设施提供出来了,而且开源、可本地运行、能接 CI/CD。

如果你维护的 LLM 应用已经上线或准备上线,值得把它加进工具链。

目录
相关文章
|
23天前
|
人工智能 数据可视化 安全
把 Claude Cowork 换成开源版——OpenWork 让团队 AI 配置不再各配各的
OpenWork是开源AI工作流中枢,以MCP协议统一管理团队的Skill、API连接与模型服务,支持Codex/Claude/Cursor等多客户端共享能力,提供Den控制台实现权限管控、插件分发与私有化部署,让AI工具配置成为可复用、可审计的团队资产。(239字)
149 1
|
人工智能 安全 Apache
QwenPaw:你的私人 AI 助理 —— 数据归你、记忆进化、多端触达的开源个人智能体
QwenPaw 是一款开源、本地优先的AI个人智能体(Apache 2.0),数据归属用户、记忆自主进化、支持钉钉/飞书/微信等多端触达。3行命令即可部署,内置Coding IDE、Persona人格、定时任务、MCP工具生态与多Agent协作,真正属于你的私有AI助理。
QwenPaw:你的私人 AI 助理 —— 数据归你、记忆进化、多端触达的开源个人智能体
|
存储 安全 JavaScript
渗透攻击实例-xss跨站脚本攻击
渗透攻击实例-xss跨站脚本攻击
|
23天前
|
人工智能 Rust JavaScript
让 AI Agent 少读 89% 的文件——我试了 CodeGraph 这个代码知识图谱
CodeGraph是开源代码知识图谱工具,为AI编程Agent预建项目结构地图,避免反复grep/读文件。支持20+语言,Rust内核,本地化存储,显著降低token消耗(-69%)与工具调用(-89%),大幅提升大项目理解效率。
199 0
|
关系型数据库 MySQL 索引
【MySQL】当前读、快照读、MVCC
【MySQL】当前读、快照读、MVCC当前读:  select...lock in share mode (共享读锁)  select...for update  update , delete , insert   当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。
13409 0
|
2月前
|
人工智能 IDE 前端开发
04|Claude Code、Codex、Cursor、OpenCode 的 Harness 差异
本文深度解析2026年四大AI编程工具本质差异:Claude Code(终端工程Agent)、Codex(OpenAI生态本地Agent)、Cursor(IDE内嵌Agent Harness)、OpenCode(开源多模型可定制平台),强调选型关键在匹配真实工作流,而非单纯比模型。
1592 3
|
23天前
|
缓存 人工智能 BI
最新版通义千问(Qwen3.8-Max)功能介绍及使用指南
通义千问Qwen3.8-Max是通义千问系列的最新旗舰大模型,凭借2.4万亿参数的MoE混合专家架构、100万Token超长上下文、原生多模态处理能力以及全栈代码与智能体协作能力,成为当前全球顶尖的通用大模型之一。它不仅在文本生成、逻辑推理上实现突破,更在长文档处理、图像视频理解、复杂工程开发、多智能体协作等场景构建了核心竞争力。本文将从核心架构、关键功能、使用入口、API调用、场景实战、避坑指南六大维度,全面解析Qwen3.8-Max,帮助开发者与普通用户快速掌握其能力与使用方法,实现从基础对话到复杂任务的高效落地。
267 1
|
5月前
|
数据采集 JSON 供应链
1688商品详情数据一键获取,item_get API接口讲解
本文分享1688商品详情API(offerDetail.get)实战经验:摒弃爬虫,依托官方接口实现合规、稳定、高效的数据采集。涵盖接入流程、关键参数、返回字段解析及避坑要点,助力企业快速落地电商供应链数据建设。(239字)
|
1月前
|
人工智能 自然语言处理 测试技术
内部流出:快手质量中台用大模型做“智能冒烟”,提测就打回,研发再也不敢敷衍
快手质量中台将冒烟测试升级为AI智能门禁:基于大模型自动生成/进化用例、多模态视觉判定结果,并与CI深度集成,实现提测自动拦截。半年内提测通过率从43%跃升至91%,人力投入归零,打回次数下降83%,真正把质量门槛“焊死”在代码合入前。
|
1月前
|
人工智能 自然语言处理 安全
Agent Skill 也要做回归测试:阿里开源 skill-up,开始补上智能体工程的质量短板
阿里开源「skill-up」,专为Agent Skill打造的评测与演进工具:支持声明式用例、跨引擎验证、多轮对话测试及回归分析,助力AI能力从“能运行”迈向“可交付”。关注公众号回复「资料」获取AI测试开发合集。