promptfoo

Promptfoo 的 Prompt、模型与 RAG 评测和红队扫描工具。

补充说明

Promptfoo 用一份 YAML 定义 prompts、providers 和 tests,批量对比不同模型或提示词,并按断言打分。它还能对应用做红队扫描,生成越狱、注入和 PII 泄露等对抗用例。

结果默认保存在本地,view 启动本地 UI;红队会真实调用模型,费用和风险要提前评估。

安装与启动

npm install -g promptfoo
promptfoo --version

或使用 npx 固定最新版,避免旧缓存:

npx -y promptfoo@latest init

常用示例

对两个模型跑同一组断言,其中一个指向本地 vLLM:

cat > promptfooconfig.yaml <<'YAML'
prompts:
  - "用一句话解释 {{topic}},必须提到 {{keyword}}"
providers:
  - id: openai:chat:gpt-4o-mini
  - id: openai:chat:Qwen/Qwen2.5-7B-Instruct
    config:
      apiBaseUrl: http://localhost:8000/v1
      apiKey: EMPTY
defaultTest:
  assert:
    - type: contains
      value: "OOM"
tests:
  - vars:
      topic: "Kubernetes Pod OOM"
      keyword: "memory limit"
    assert:
      - type: llm-rubric
        value: "回答同时提到 memory limit 和排查步骤"
      - type: javascript
        value: "output.length < 500"
YAML

promptfoo eval -c promptfooconfig.yaml --no-cache -o result.json
promptfoo view

先校验配置,避免 YAML 缩进错误浪费模型调用:

promptfoo validate config -c promptfooconfig.yaml

对应用做红队扫描(先生成配置,再执行并查看报告):

promptfoo redteam init
promptfoo redteam run --max-concurrency 4
promptfoo redteam report

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 如何让 promptfoo 评测本地 vLLM 服务?
  2. 为什么推荐先跑 validate config?
  3. 红队扫描上线前要注意什么?
答案
  1. provider 写成 openai:chat:<模型名>,在 config 里设置 apiBaseUrl 指向 http://localhost:8000/v1,并给一个占位 apiKey;模型名与 vLLM 的 --served-model-name 对齐。
  2. YAML 的缩进、引号和 provider 字段写错时,eval 会在调用模型后才暴露问题或直接崩溃。先校验能在零成本阶段发现配置错误。
  3. 红队会生成越狱、注入等对抗输入并真实调用目标模型,可能产生有害内容和费用。应在隔离环境、staging 目标上运行,限制并发,并明确结果访问权限。

相关条目