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
openai:chat:<model> 并配 apiBaseUrl,模型名必须与 --served-model-name 一致。apiKey 占位;只写 apiBaseUrl 可能被客户端拒绝。{{var}} 时 YAML 要加引号,否则花括号和冒号容易导致解析失败或变量未替换。llm-rubric 会再调用一个裁判模型,成本翻倍且分数随裁判漂移;固定裁判模型和版本,能用规则断言就别用 LLM。eval 行为可能变化,CI 里读取 result.json 的 success 字段更稳。promptfoo view 默认起本地服务,不要把端口暴露到公网;结果里可能含有业务数据和密钥。npx promptfoo 可能命中 npx 缓存旧版本;复现问题前显式加 @latest 或固定版本。--no-cache 能保证新鲜结果,但会重复计费;调试断言时先用小样本并保留缓存。合上页面,先回答,再展开对照。
validate config?openai:chat:<模型名>,在 config 里设置 apiBaseUrl 指向 http://localhost:8000/v1,并给一个占位 apiKey;模型名与 vLLM 的 --served-model-name 对齐。eval 会在调用模型后才暴露问题或直接崩溃。先校验能在零成本阶段发现配置错误。