← 返回列表
# Prompt 也是代码:如何构建符合审计要求的提示词版本控制与 CI/CD 体系
**发布日期:** 2025年12月 | **作者:** 明见万川 AI 工程团队 | **分类:** AI 工程化, DevOps
> **摘要**:
> 很多团队的 Prompt 管理现状依然停留在“石器时代”:散落在飞书文档、Notion 甚至聊天记录中。当线上模型突然出现“降智”或幻觉时,甚至没人知道是谁在什么时候改了哪句话。本文将“基础设施即代码 (IaC)”的理念引入 AI 领域,提出 **Prompt as Code** 的工程化实践指南。
---
## 一、 为什么 Prompt 不能存数据库?
在早期的 AI Demo 开发中,开发者喜欢把 Prompt 作为一个字符串硬编码在 Python 代码里,或者存在 MySQL 数据库的一个字段中。但在企业级应用(如 MJMatrix 的 GEO 系统)中,这种做法是灾难性的:
1. **无法做 Diff**:数据库里的长文本很难直观对比出“版本 A 和版本 B 到底改了哪个形容词”。
2. **丧失上下文**:为什么要把 *temperature* 从 0.7 改成 0.2?如果没有 Git Commit Message,这个决策逻辑就丢失了。
3. **缺乏回归测试**:改了 Prompt 确实修复了 Bug A,但会不会导致之前的 Bug B 复发?没有 CI 流水线,这就是一场赌博。
**结论**:Prompt 必须被视为 **源代码**,存储在 Git 仓库中,而不是数据库里。
---
## 二、 架构设计:Prompt as Code (PaC)
我们推荐采用 **"Prompt 仓库 + 注册中心"** 的架构模式。
### 2.1 目录结构规范
将 Prompt 从业务代码中剥离,存放在独立的 `prompts/` 目录下,采用 YAML 或 JSON 格式以便于机器解析。
```yaml
# prompts/customer-service/refund-policy.v1.yaml
metadata:
name: "refund-handler"
version: "1.2.0"
author: "jian.dev"
description: "处理退款请求,增加了对 VIP 用户的安抚策略"
parameters:
- user_level
- order_id
model:
name: "gpt-4-turbo"
temperature: 0.3
template: |
你是一个专业的电商客服。
用户等级:{{user_level}}
当前订单:{{order_id}}
请根据以下退款政策回复用户...
```
### 2.2 版本策略 (Semantic Versioning)
严禁使用 `latest` 标签。生产环境的每一次调用,都必须指向一个确定的版本号(Immutable Artifacts)。
* **v1.0.0**: 初始上线
* **v1.0.1**: 修复错别字(Patch)
* **v1.1.0**: 调整 Prompt 逻辑,导致输出风格变化(Minor)
* **v2.0.0**: 更换底层大模型(Major,如从 GPT-3.5 升到 GPT-4)
---
## 三、 核心实战:构建 Prompt CI/CD 流水线
当开发者提交一个新的 Prompt 版本到 GitHub 时,不应直接上线,而应触发一条自动化流水线。
### 阶段 1:静态检查 (Linting)
检查变量是否匹配、格式是否合法。
* *工具推荐*:自定义 ESLint 规则或 Python 脚本。
* *检查点*:模板里的 `{{username}}` 是否在参数列表中定义了?
### 阶段 2:自动化评估 (Evaluation / Testing)
这是最关键的一步。我们需要定义一个**“黄金数据集” (Golden Dataset)**,包含 50-100 个典型的用户输入及其期望输出。
**使用 Promptfoo 进行测试配置示例:**
```yaml
# promptfooconfig.yaml
prompts: [file://prompts/refund-policy.v1.yaml]
providers: [openai:gpt-4]
tests:
- description: "测试 VIP 用户退款"
vars:
user_level: "VIP"
order_id: "ORD-999"
assert:
- type: icontains
value: "尊贵的 VIP 会员"
- type: cost
threshold: 0.05 # 单次调用成本不超过 0.05 美元
- type: llm-rubric
value: "回复语气是否足够礼貌且通过了退款流程?"
```
### 阶段 3:金丝雀发布 (Canary Deployment)
测试通过后,新版 Prompt 不会立即全量替换旧版。
1. **部署**:系统将 1% 的流量路由到 v1.2.0 版本。
2. **观测**:通过 OpenTelemetry 监控这 1% 流量的用户点赞率和回复延迟。
3. **扩量**:如果指标平稳,逐步扩量至 100%。
---
## 四、 审计与合规 (Audit Trails)
在《生成式 AI 暂行办法》下,**可追溯性**是硬指标。
### 4.1 提交记录即凭证
由于我们使用了 Git,每一次 Prompt 的变更都有据可查:
* **Who**: 谁修改了?(Git Author)
* **When**: 什么时候?(Commit Timestamp)
* **Why**: 为什么改?(Commit Message + Pull Request 讨论记录)
* **Approval**: 谁审批的?(GitHub PR Reviewer,通常需要 Legal 或 Tech Lead 批准)
### 4.2 数据库快照
在运行时,我们会在数据库的 `ChatLog` 表中记录当时使用的 **Prompt Version Hash**。
```sql
-- 即使 Prompt 文件改了,我们也能知道上个月的那条违规回复是用哪个版本的 Prompt 生成的
SELECT * FROM chat_logs WHERE prompt_version_hash = 'a1b2c3d4';
```
---
## 五、 MJMatrix 的展望
Prompt Engineering 正在消亡,**AI Engineering** 正在崛起。
手写 Prompt 是一种艺术,但管理 Prompt 必须是一门工程。通过构建基于 Git 的版本控制和 CI/CD 体系,我们将偶然的“灵光一现”变成了可重复、可预测、可审计的工业级能力。这是 MJMatrix 能够为客户提供稳定 GEO 服务的底气所在。
