← 返回博客
AI Agent

当 Prompt 工程遇上软件工程:给你的 AI Agent 上版本管理

2025-03-22

如果你的 AI Agent 出了问题,你能回滚到上一个版本吗?

一个真实的痛点

某天下午,我更新了一个 Agent 的分析流程,加了几条看起来很合理的规则。第二天发现,它的输出质量明显下降——产出的文档里多了大量冗余内容,且遗漏了原本能覆盖到的边界场景。

问题是:我改了什么?具体改了哪一行?改之前是什么样子?

如果这是一段 Python 代码,答案显而易见——git loggit diffgit revert。但这是一段 prompt。你把它改了就改了,没有历史,没有 diff,没有回滚。

Prompt 正在经历代码曾经经历的演化

回看软件工程的历史,代码管理经历了清晰的阶段:

阶段 代码 Prompt
蛮荒 一个大文件,谁都往里面加 一个超长 system prompt
模块化 拆分成函数和模块 拆分成 Agent/Skill/Command
版本化 SVN/Git 管理历史 ???
工程化 CI/CD、Code Review、SemVer ???

把 Agent 定义当做代码管理

版本化

每个能力组件(Skill、Command、Rule)都有独立的版本号,遵循 Semantic Versioning:

  • MAJOR:Breaking change——比如输出格式变了,下游消费者需要适配
  • MINOR:新增能力——比如分析流程多了一个维度
  • PATCH:修复和优化——比如改善了某个边界场景的处理

CHANGELOG

每个 Skill 目录下都有一个 CHANGELOG.md,格式遵循 Keep a Changelog

## [2.1.0] - 2024-03-15
### Added
- 新增"共享写入方法调用方兼容性检查"步骤
### Changed
- 风险评估维度从 3 个扩展到 4 个

Code Review

所有 Agent 定义的修改都通过 PR 流程,像审查代码一样审查 prompt 变更。

事实上,审查 prompt 变更比审查代码变更更重要——因为一行 prompt 的改动可能影响所有后续输出的行为模式。

质量门禁:不只是跑测试

我设计了一个六维度的质量检查清单:

维度 检查内容 类比
结构完整性 必选章节是否齐全 编译通过
流程可执行性 Procedure >= 3 步且可操作 单元测试通过
示例充分性 Examples >= 2 个,含完整端到端 集成测试通过
业务无关性 换一个项目能不能用 可移植性检查
输出结构性 产出有明确 schema API 契约验证
约束明确性 明确声明"不做什么" 安全审计

依赖管理:Skill 之间的版本约束

当系统中有几十个 Skill 时,它们之间的依赖关系会形成一张网。通过 SKILL.md 的 metadata 来声明依赖:

upstream:
  - problem_definition    # 谁给我提供输入
  - task_decomposition
downstream:
  - test_case_authoring   # 谁消费我的输出
  - regression_planning

一些教训

教训 1:过度版本化也是病

最初我给每个 Rule 都加了独立版本号,结果发现 Rule 的变更频率很低,独立版本号带来的管理开销远大于收益。

教训 2:CHANGELOG 比 git log 有用 10 倍

Git commit message 通常是"fix: xxx"这种简短描述。而 CHANGELOG 可以解释"为什么做这个改动"。两者不可替代。

教训 3:不要假装在做软件工程

最常见的失败模式是"创建了 CHANGELOG 文件但从来不更新"。如果引入流程但不执行还不如不引入。

教训 4:AI 可以自己管理自己的版本

我建了一个"meta-plugin"——一个专门用来管理其他 plugin 内容的插件。让 AI Agent 管理 AI Agent 的定义。

这一切值得吗?

如果你的 AI Agent 只有一个 prompt 文件,用了就扔——不值得

如果你的 AI Agent 系统有多个角色、几十个能力模块、多人协作维护、长期迭代演进——绝对值得

核心洞察很简单:AI Agent 的定义文件就是代码。它需要代码的所有管理实践。


这是"AI Agent 工程化实践"系列的第二篇。下一篇将深入讨论 Skill 设计哲学。