promptfoo-action
promptfoo/promptfoo-action加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
凌晨两点,你收到一条 GitHub PR 合并的通知——团队成员刚刚优化了产品描述的 Prompt。但你不知道的是:这个 Prompt 在 GPT-4 上可能表现良好,却在 Claude 3.5 Sonnet 上输出了奇怪的格式,在 Llama 3 70B 上甚至直接拒绝回答。没有自动化的 Prompt 测试,这些问题往往要等到用户反馈才被发现。
promptfoo-action 就是为解决这个问题而生的:它将 Promptfoo 的 LLM 评测能力以 GitHub Action 的形式嵌入你的 CI/CD 流水线,让每一次 Prompt 变更都自动经历多模型、多场景的质量检验。
Action 在 Pull Request 上自动发布的评估结果评论
随着 LLM 应用从 POC 走向生产,Prompt 管理成为工程团队的痛点。传统的做法是手工测试——开发者在本地跑几条 prompt,肉眼检查输出,然后上线。但这种方法有三个致命缺陷:
promptfoo(母公司项目)是目前最流行的开源 LLM 评测框架之一,支持 100+ 评测器、20+ LLM 提供商。promptfoo-action 则是其官方 GitHub Actions 集成,将评测能力带入开发者的日常工作流。
promptfoo-action 的工作流程非常清晰:监听文件变更 → 触发 promptfoo 评测 → 将结果写入 PR 评论或 workflow summary。
| 事件 | 触发方式 | 输出位置 |
|---|---|---|
pull_request / pull_request_target | PR 创建/更新 | PR 评论 |
push | 代码推送 | Workflow Summary |
workflow_dispatch | 手动触发 | Workflow Summary |
这是 promptfoo-action 最大的优势之一——它几乎支持所有主流 LLM API:
Action 内置了基于 Git diff 的文件变更检测能力。通过 prompts 参数指定 glob 模式(如 prompts/*.txt),Action 会自动识别本次 PR/PR 中变更的文件,只对相关 Prompt 运行评测,避免不必要的 API 消耗。
Action 支持配置 repeat 参数让每个测试运行多次(如 repeat: 3),并通过 repeat-min-pass 设置最低通过次数。这对于评估 LLM 输出的稳定性(非确定性输出是常见问题)非常有用。结合 fail-on-threshold 参数,可以在评测通过率低于阈值时直接阻断 CI 构建。
项目使用 TypeScript 编写,目标 Node.js 版本 ≥ 20.0.0,采用标准的 GitHub Actions 项目结构:
src/
├── main.ts # 主入口,协调评测流程
└── utils/
├── auth.ts # API Key 验证和主机检测
├── cache.ts # Promptfoo 磁盘缓存管理
├── config.ts # 配置文件解析和依赖提取
├── errors.ts # 统一错误码体系
├── fs.ts # 文件系统工具
├── inputs.ts # Action 输入参数解析
└── thresholds.ts # 阈值计算和结果格式化
构建链路:TypeScript → tsc 编译 → esbuild 打包 → dist/index.js(Action 执行文件)。package.json 中的 package 脚本负责从 TypeScript 源码构建出可分发的 dist/ 产物。
代码质量方面,项目使用 Biome(原 Prettier + ESLint 合并方案)进行格式化和 Lint,测试框架为 vitest,覆盖率由 @vitest/coverage-v8 提供。
安全设计值得注意:Git revision 输入有严格的白名单校验(只接受分支名、HEAD~N 形式或 40 位完整 SHA),防止命令注入攻击。对于 pull_request_target 事件,文档中也有明确的特权 token 使用警告。
对于已有 promptfoo 配置文件(promptfooconfig.yaml)的团队,接入成本极低:
# .github/workflows/prompt-eval.yml
- uses: promptfoo/promptfoo-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
config: promptfooconfig.yaml
prompts: |
prompts/*.txt
prompts/**/*.md
fail-on-threshold: 80
对于还没有 promptfoo 配置的团队,需要先在仓库根目录创建 promptfooconfig.yaml,定义评测目标、测试用例和通过标准。这部分工作在 promptfoo 主项目文档中有详细说明。
门槛差异:有 CI/CD 经验的开发者可以零学习成本接入;但对于不熟悉 GitHub Actions 或 YAML 语法的用户,仍需要理解 workflow 的基本概念。
repeat 参数缓解这一问题,但无法根除promptfooconfig.yaml 中测试用例的设计质量——差的测试集产生假的通过率promptfoo-action 代表了一个更大的趋势:LLM 应用的 TDD(测试驱动开发)理念。就像传统软件工程中用单元测试保障代码质量一样,Prompt 评测正在成为 LLM 应用工程化的基础设施。
从增长曲线看,promptfoo 主仓库已获得 10,000+ stars,GitHub Actions 集成作为其生态的重要组成部分,降低了整个框架的使用门槛。随着 Claude Code、Cursor Agent 等 AI Coding 工具的普及,"Prompt 作为代码资产"的管理需求只会越来越大。
一句话总结:如果你在生产环境中使用 LLM,promptfoo-action 是一个值得纳入 CI/CD 的质量保障工具——它不能保证你的 Prompt 永远正确,但至少能让你在 Prompt "悄悄" 退化时第一时间发现。
项目信息:promptfoo/promptfoo-action · MIT License · TypeScript · 69 Stars