评测搭建/轻量入门方案
轻量入门方案

Promptfoo + Gitee CI:搭建 Prompt 回归流水线

把 Promptfoo 评测接入 Gitee 的持续集成,在代码提交或合并请求时自动执行质量门禁。

技术栈:Promptfoo · Gitee CI · Node.js厂商绑定:无
Demo 仓库 ↗
01

适用场景

适合代码托管在 Gitee、希望不依赖厂商平台就完成 Prompt 回归的测试团队。流水线只负责调度和阻断,评测逻辑仍然由仓库里的 Promptfoo 配置管理。

02

前置依赖

  • Gitee 仓库已启用 Gitee Go / CI。
  • 仓库中存在 promptfooconfig.yaml、Prompt 文件和评测脚本。
  • 在 Gitee 仓库变量中配置 OPENAI_API_KEY、OPENAI_BASE_URL、OPENAI_MODEL。
  • Runner 能访问你的模型接口。

敏感变量只放在 Gitee 的加密变量中,不提交到仓库。

03

完整步骤

1. 固定目录结构

promptfoo-regression/
├─ promptfooconfig.yaml
├─ prompts/
│  ├─ baseline.txt
│  └─ candidate.txt
├─ tests/
│  └─ smoke.yaml
└─ scripts/
   └─ check-gate.js

2. 本地先跑通

先执行 npx promptfoo eval -c promptfooconfig.yaml。本地失败时不要直接交给 CI 排查。

3. 添加 Gitee CI 配置

在仓库根目录创建 .workflow/promptfoo.yml,安装 Node 依赖、执行评测、上传结果并执行门禁脚本。

4. 配置触发条件

建议在 Prompt、测试数据、评测脚本变更时触发;普通文档变更无需消耗模型调用。

5. 处理失败

流水线失败后下载结果文件,优先定位失败用例和差异样本,再决定修改 Prompt、数据还是门禁规则。

04

代码 / 配置

.workflow/promptfoo.yml

name: promptfoo-regression
triggers:
  push:
    branches: [main, develop]
  pull_request:
    types: [open, update]
steps:
  install:
    image: node:20
    commands:
      - npm ci
  eval:
    image: node:20
    commands:
      - npx promptfoo eval -c promptfooconfig.yaml -o artifacts/results.json
      - node scripts/check-gate.js artifacts/results.json
    env:
      OPENAI_API_KEY: $OPENAI_API_KEY
      OPENAI_BASE_URL: $OPENAI_BASE_URL
      OPENAI_MODEL: $OPENAI_MODEL
artifacts:
  paths:
    - artifacts/results.json

不同 Gitee 组织的 Runner 配置语法可能不同,提交前应以仓库实际的 Gitee Go 模板校验为准;核心命令保持不变。

05

结果解读

CI 结果分为三类:

  1. 通过:关键用例无失败,退化指标在允许范围内。
  2. 阻断:出现 P0/P1 失败、关键样本回归或候选版本显著退化。
  3. 需复核:裁判低置信度、接口超时或测试环境异常。

环境故障不能直接当成业务质量通过,应单独标记为 infrastructure_failure。

06

踩坑清单

  • Gitee Runner 的 Node 版本和本地不一致。
  • 加密变量名称与 YAML 中的变量名称不一致。
  • 未创建 artifacts 目录导致结果无法上传。
  • 重试机制把真实失败掩盖成成功。
  • 评测超时没有设置合理的任务上限和并发数。
07

拓展优化

  • 将冒烟集和完整回归集分成两个流水线。
  • 对 Pull Request 只跑低成本样本,合并到主分支再跑完整集。
  • 对模型返回做缓存,但缓存键必须包含 Prompt、模型和参数版本。
  • 把结果摘要写入 CI 评论,把完整 JSON 作为构建产物保存。
  • 逐步加入人工复核队列,不让不确定结果静默通过。
08

配套 Demo 仓库

建议将教程中的配置、样例和门禁脚本独立放入可 fork 的仓库。

https://gitee.com/explore/ci ↗