Promptfoo:测试、评估并红队你的 LLM 提示词 —— 2026 实战指南

Promptfoo 是一款开源的 CLI 与代码库,用于评估和红队 LLM 应用。用简单的声明式配置即可对比 GPT、Claude、Gemini、DeepSeek,并无缝接入命令行与 CI/CD。本 2026 指南讲解安装、promptfooconfig.yaml、断言与红队测试。

  • ⭐ 21825
  • MIT
  • 更新于 2026-06-02

📦 资源信息

⭐ GitHub 星标21,825
🔧 最后维护2026/6/2

引言 #

如果你在用 GPT、Claude、Gemini 或 DeepSeek 这类模型做开发,你一定明白「在 playground 里看着不错」和「在生产环境里稳定可用」完全是两码事。Promptfoo 是一款开源的 CLI 与代码库,用于评估和红队 LLM 应用。它把反复试错的工作方式,换成可以本地运行、也能接入 CI/CD 的声明式测试配置。本文将带你安装它、编写 promptfooconfig.yaml、跑一次评估、对比不同模型,并发起一次红队扫描。

Promptfoo 是什么? #

Promptfoo 是一款用于评估和红队 LLM 应用的 CLI 与代码库。你只需描述自己的提示词、希望对哪些 provider(模型)运行,以及一组带断言的测试用例。Promptfoo 会让每条提示词跑遍每个测试用例、逐项检查断言,并给出各模型表现的并排对比视图。

它的核心能力包括:

  • 评估 —— 让提示词在多个 provider 上运行,并用断言为输出打分(精确匹配、包含、语义相似度、LLM 评分量规等)。
  • 模型对比 —— 在相同输入下对比 GPT、Claude、Gemini、DeepSeek 等模型。
  • 红队测试 —— 生成对抗性测试用例,在上线前探测应用的安全漏洞。
  • CI/CD 集成 —— 声明式配置能在任何有终端的地方运行,包括 GitHub Actions。

该项目用 TypeScript 编写,采用 MIT 许可证,由 promptfoo 团队维护。

Promptfoo 如何工作 #

它的工作流以配置为先:

  1. 声明式配置 —— 一份 promptfooconfig.yaml 就定义了你的 promptsproviderstests,常见场景无需任何粘合代码。

  2. 命令行界面(CLI) —— 用 promptfoo eval 跑评估。它会把结果表格打印到终端,并把结果保存在本地。

  3. 本地网页查看器 —— promptfoo view 会打开一个本地网页界面,可视化呈现评估结果,让你逐格对比各模型的输出。

下面是一份最小化的 promptfooconfig.yaml

# promptfooconfig.yaml
description: "GPT vs Claude on a couple of prompts"

prompts:
  - "What is the capital of {{country}}?"
  - "Explain quantum mechanics in one sentence."

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

tests:
  - vars:
      country: France
    assert:
      - type: contains
        value: Paris

这份配置会让两条提示词分别对两个 provider 运行。对第一条提示词,它会替换 {{country}} 并断言输出中包含 “Paris”。API 密钥从环境变量读取(例如 OPENAI_API_KEYANTHROPIC_API_KEY),不会写在配置文件里。

promptfoo self-grading, via dibi8.com

promptfoo 自评视图(来源:promptfoo/promptfoo 仓库,经 dibi8 分析整理)

安装与配置 #

如果你想把 promptfoo 当成定时生产任务来跑,就需要一台常开的机器 —— 可以在 DigitalOcean 上开一台(新账户有免费试用额度),或者用 HTStack 的低延迟香港 VPS(与托管 dibi8.com 的是同一家 IDC)。

Promptfoo 需要 Node.js ^20.20.0>=22.22.0。先检查版本:

node -v

如果还没装 Node.js,可以从官网获取。

安装 #

体验 promptfoo 最快的方式是完全不安装:

npx promptfoo@latest init --example getting-started

如果想全局安装,按你的环境选一种即可:

# npm
npm install -g promptfoo

# Homebrew
brew install promptfoo

# pip
pip install promptfoo

设置 API 密钥 #

Promptfoo 从环境变量读取 provider 凭证。以 OpenAI 为例:

export OPENAI_API_KEY=sk-abc123

测试哪个 provider,就用它对应的变量(例如测试 Claude 用 ANTHROPIC_API_KEY)。如果忘了设密钥,跑评估时 provider 会返回认证错误 —— 设好变量重新运行即可。

跑你的第一次评估 #

执行 init 后,当前目录会有一份 promptfooconfig.yaml。运行评估并打开查看器:

promptfoo eval
promptfoo view

promptfoo eval 会把结果打印到终端;promptfoo view 则打开一个本地网页界面,方便做更丰富的并排对比。如果卡住了,可以查阅官方文档或在 GitHub 上提 issue。

核心用法 #

示例 1:一个简单断言 #

写一份检查预期子串的配置:

# promptfooconfig.yaml
description: "Basic prompt test"

prompts:
  - "What is the capital of {{country}}?"

providers:
  - openai:gpt-4o-mini

tests:
  - vars:
      country: France
    assert:
      - type: contains
        value: Paris

运行:

promptfoo eval

Promptfoo 会执行该测试用例,并报告断言是否通过。

示例 2:用多种断言类型对比模型 #

你可以列出多个 provider,并混用多种断言类型 —— 精确、语义和 LLM 评分:

# promptfooconfig.yaml
description: "GPT vs Claude comparison"

prompts:
  - "Answer concisely: {{question}}"

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

defaultTest:
  assert:
    - type: llm-rubric
      value: does not describe itself as an AI, model, or chatbot

tests:
  - vars:
      question: "What is the meaning of life?"
    assert:
      - type: similar
        value: "It depends on the person"
        threshold: 0.6

运行同样的命令,再用 promptfoo view 逐格对比两个模型:

promptfoo eval

示例 3:在 CI/CD 流水线中运行 #

只要有终端,promptfoo 就能跑。下面这个 GitHub Actions 工作流会在断言失败时让构建失败:

# .github/workflows/eval.yml
name: Promptfoo Eval

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: Run promptfoo eval
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: npx promptfoo@latest eval

它会在每次 push 和 pull request 时运行你的评估套件,在合并前抓住回归问题。

红队测试 #

除了普通评估,promptfoo 还能生成对抗性测试用例,探测应用是否存在提示词注入、越狱、不安全输出等漏洞。红队流程有自己的子命令:

# 启动配置 UI,设置你的目标和攻击类型
npx promptfoo@latest redteam setup

# 或者不用图形界面进行配置
promptfoo redteam init --no-gui

# 生成对抗性用例并对目标运行
promptfoo redteam run

# 查看发现的问题报告
promptfoo redteam report

报告会按漏洞类别和严重程度归类,并给出建议的缓解措施。

基准测试与真实使用 #

Promptfoo 被广泛用于提示词和模型评估。但它的精髓不在于依赖某个单一排行榜,而在于让你用自己的提示词和测试用例来做基准 —— 真正有意义的数字,来自你自己的应用,而非通用套件。

典型工作流是这样的:

npx promptfoo@latest eval && npx promptfoo@latest view

让完整测试集跑遍候选模型,再打开查看器,就能精确看到每个模型在哪些提示词、哪些用例上通过或失败。由于配置是声明式的,同一套件既能在开发时本地运行,也能在 CI 里每次提交时运行。

promptfoo red team dashboard, via dibi8.com

promptfoo 红队仪表盘(来源:promptfoo/promptfoo 仓库,经 dibi8 分析整理)

与同类工具对比 #

也可以看看我们对相关开源工具的整理。

在挑选 LLM 评估与红队工具时,promptfoo 的主要吸引力在于:声明式配置、本地优先的工作流,以及内置的红队能力三者结合。

特性promptfoo
Star 数21,825
许可证MIT
维护方promptfoo
语言TypeScript
默认分支main
配置方式声明式 promptfooconfig.yaml(prompts / providers / tests / assert)
使用界面CLI(promptfoo eval / view)以及作为代码库调用
模型覆盖GPT、Claude、Gemini、DeepSeek 等众多 provider
红队内置(promptfoo redteam 子命令)
CI/CD在任意终端运行;对 GitHub Actions 有一流支持

细节拆解 #

  • Star 数 —— promptfoo 在 GitHub 上约有 21,825 个 star,是 LLM 开发者群体广泛采用的有力信号。
  • 声明式配置 —— 把测试写进 promptfooconfig.yaml,能让你的评估套件与代码一起进版本管理,从而本地和 CI 跑的是同一套检查。

局限与客观评价 #

Promptfoo 很能干,但也有值得了解的取舍:

  1. 配置会随复杂度膨胀 —— 声明式格式应对常见场景很爽,但当套件涉及大量 provider、动态变量和自定义断言时,会变得啰嗦。你往往得把提示词和测试用例拆到单独的文件里。
  2. 模型访问要你自己出 —— promptfoo 负责编排评估,但依赖你自己的 provider API 密钥和配额。费用和速率限制要你自己扛。
  3. 评估要花 token 和时间 —— 跨多个 provider 的大套件会发出大量 API 调用。在大型测试集上,延迟和花费都会累加。
  4. 断言设计需要琢磨 —— LLM 评分量规(llm-rubric)和语义检查很强大,但具有不确定性;要写出可靠、有意义的断言需要反复打磨。
  5. 仍在快速演进 —— promptfoo 发版频繁。这意味着改进很快,但偶尔会有破坏性变更;在 CI 里固定一个版本会更稳。

在把它定为团队标准前,这些都是要权衡的点。

结语 #

Promptfoo 把提示词和模型测试,从凭感觉的猜测变成了可复现、可进版本管理的流程。一份 promptfooconfig.yaml,就能评估提示词、在你自己的数据上对比 GPT、Claude、Gemini 和 DeepSeek,并为应用做红队漏洞探测 —— 这一切都在 CLI 和 CI/CD 中完成。最佳的下一步,是运行 npx promptfoo@latest init --example getting-started,把它指向你自己的提示词,再打开查看器看看你的模型究竟表现如何。

大规模抓取需要轮换代理 —— WebShare 是业界常用之选。


来源与延伸阅读

  • GitHub 仓库:https://github.com/promptfoo/promptfoo
  • 官方文档 / README:https://github.com/promptfoo/promptfoo#readme

以上部分链接为联盟链接。若你通过它注册,dibi8.com 可能获得一笔佣金,你无需为此多付任何费用。这有助于网站运转、内容免费。

💬 留言讨论