1、前言
简单总结一下个人使用AI的路线演进:
- 定义prompt优化AI提示和补全效果
- 定义规则rules约束AI生成的可控性
- 定义工作流,让AI分步执行任务
- 通过Agent实现AI自动化可控式迭代
前面3个步骤比较常见,这里避免啰嗦,直接最后一步;另外本文不涉及具体实现细节,只分享整体架构以及对应的演化思路。
2、最初的设想
graph TB
A[线上系统运行] --> B[线上错误监控]
A --> C[用户反馈]
D[接口文档]
E[需求文档]
%% MCP 模块
B --> M[MCP Server]
C --> M
D --> M
E --> M
M --> F[AI Agent]
F -->|自动分析与决策| G[生成 / 修改代码]
G -->|自动提交| H[部署上线]
H -->|形成闭环| A
style M fill:#e3f2fd
style F fill:#e1f5ff
style G fill:#e1ffe1
style H fill:#fff4e1
style A fill:#ffe8e1
最初的想法很简单,就是把日常开发需要的东西全部丢给AI,自己做撒手掌柜,这里解决向AI传输数据的核心方式是通过MCP协议构建的MCP Server服务。
MCP全称(Model Context Protocol),可以自己搜一下,主要是用来解决这些Prompt的问题:
- 不可校验
- 不可diff
- 不可回滚
- 不可组合
- 不可规模化
为了解决这些个问题,大家不得不打成了共识。
3、遇到的问题
3.1、AI项目迭代的失控
如果大家有自己亲手尝试从零开始生成一个项目进行迭代,就会遇到一些很明显的场景:
- 初始生成,惊为天人
- 后续修改,逐渐崩溃
- 细节调整,开始混乱
- 对话过长,胡言乱语
- 问题修复,陷入循环
实际运行效果如下😅:
graph TB
D1[Day 1: AI快速搭建系统]
D2[Day 2: AI修改功能]
P1[遗忘早期设计决策]
P2[修Bug引入新Bug]
P3[代码膨胀 5k -> 12k 40%冗余]
P4[同一需求多次生成结果不一致]
M3[Day 3: 不敢再让AI改代码]
%% 主线
D1 --> D2
D2 --> P1
D2 --> P2
D2 --> P3
D2 --> P4
P1 --> M3
P2 --> M3
P3 --> M3
P4 --> M3
遇到问题就解决问题:
graph TB
%% 起点
A[反思为什么失败] --> B[根本原因]
%% 顿悟阶段
B --> C1[AI没有长期记忆]
B --> C2[代码是唯一载体]
B --> C3[每次都要重读代码]
%% 永久记忆阶段
C1 --> D[思考&顿悟]
C2 --> D[思考&顿悟]
C3 --> D[思考&顿悟]
%% 解决方案阶段
D --> E1[AI需要长期记忆]
E1 --> E2[提取项目核心元数据 - AST]
%% 产物阶段
E2 --> F1[AST是项目的基因]
E2 --> F2[代码是基因编译的一次性产物]
E2 --> F3[AI是基因编译实体的工具]
%% APS-DSL诞生
F1 --> G[APS-DSL诞生]
F2 --> G[APS-DSL诞生]
F3 --> G[APS-DSL诞生]
然后我们的整体流程就变成了这样:
graph TB
A[线上系统运行] --> B[线上错误监控]
A --> C[用户反馈]
D[接口文档]
E[需求文档]
%% MCP 模块
B --> M[MCP Server]
C --> M
D --> M
E --> M
M --> N[项目基因AST& AI_GUIDE.MD]
N --> F[AI Agent]
F -->|自动分析与决策| G[生成 / 修改代码]
G -->|自动提交| H[部署上线]
H -->|形成闭环| A
style M fill:#e3f2fd
style F fill:#e1f5ff
style G fill:#e1ffe1
style H fill:#fff4e1
style A fill:#ffe8e1
这个流程里增加了核心模块AST,解决AI需要外部记忆系统的问题。后续项目的迭代,就成了以AST作为核心基因,进行基因表达式的演进流程
上面这个是最为关键的一步,应该算是独创的流程,没见过类似的。
这里AST可以理解为项目知识图谱Knowledge Graph,核心元数据等等,个人还是喜欢称为AST,和抽象语法树没关系。
AST的模版最初参考DSL选择了yaml,因为这个东西很像是容器里的DockerFile,目标是设想有了这个后,代码可以像容器一样随意删除。
后来便于AI校验和识别,以及便于阅读,改为json文件。
我这里定义了主要13个基础模版,细节就不展示了,仅供参考:
**_meta.ast.json** - 📌 **入口文件**:项目元信息、技术栈、团队、架构,**包含所有AST文件清单**
**_ast_index.json** - AST索引文件:全局统计和关系图谱(最后生成)
**api.ast.json** - API接口定义 API 接口(基础信息:id, name, method, path, params, response)
**api.enhanced.ast.json** - API增强定义(含semantics、implementationHints等AI分析)
**config.ast.json** - 配置信息、环境变量、构建配置
**contexts.ast.json** - 应用上下文(认证、缓存、数据库连接等)
**domain.ast.json** - 数据模型、实体、字段、关系
**infrastructure.ast.json** - 中间件、工具函数、公共服务
**permission.ast.json** - 权限定义、角色、资源访问控制
**response-format.ast.json** - API响应格式标准、错误码定义
**ui-components.ast.json** - UI组件抽象定义(框架无关)
**ui.ast.json** - UI页面、路由、布局结构
**workflow.ast.json** - 业务流程、工作流定义
3.2、信息源造成的混乱
实际场景:
Sentry说:User.save()报错
Swagger说:POST /user需要email字段
用户反馈说:注册后没收到邮件
老代码说:User模型有username字段
→ AI整合4个信息源,生成了"看似正确"的代码
→ 实际运行:逻辑冲突,更多Bug
解决思路:
graph TB
A[多信息源] --> B[Sentry错误]
A --> C[用户反馈]
A --> D[Swagger文档]
A --> E[现有代码]
B & C & D & E -->|AI提取| F[AST元数据]
F -->|AI自动化审核| G{完备性检查}
G -->|62%| H[生成缺失报告]
H --> I[详细清单:<br/>- 32个参数缺说明<br/>- 18个缺验证规则]
I -->|补充| F
G -->|>95%| J[唯一可信源]
J -->|自动生成| K[代码]
J -->|自动生成| L[文档]
J -->|自动生成| M[测试]
style F fill:#fff4e1
style G fill:#ffe1f5
style J fill:#e1ffe1
style K fill:#e1f5ff
style L fill:#e1f5ff
style M fill:#e1f5ff
这个流程增加了核心模块:AST完备性检查,用来确认数据是否冲突,是否完整,等等。
3.3、无法保证生成结果的一致性
失败案例:
需求:实现User注册接口
AI第1次生成:
- POST /api/user/register
- 使用bcrypt加密密码
- 返回JWT token
AI第2次生成(同一需求):
- POST /api/v1/users
- 使用md5加密密码
- 返回session cookie
AI第3次生成:
- POST /register
- 明文存储密码(!)
- 返回user_id
→ 同一需求,3种完全不同的实现!
根本原因:
- AI的生成过程包含随机性
- 缺乏标准化约束
- 没有确定性生成机制
- 没有明确指示的,AI就会漂移摇摆不定
解决思路:
graph LR
A[AST定义] -->|标准化| B[134个预定义动作]
B --> C[禁止AI自创]
A -->|模板引擎| D[自定义模板]
D -->|决定性生成| E[代码输出]
E -->|10次生成| F[哈希验证]
F -->|完全一致| G[diff = 0]
H[失败方案] -->|AI自由发挥| I[每次不同]
style A fill:#fff4e1
style B fill:#e1ffe1
style G fill:#e1ffe1
style I fill:#ffe1e1
到这里大家可能会发现一个问题,怎么搞模版了,这是不是变成了类似‘低代码平台’JSON Schema类似的东西,恭喜你猜对了一半,给你点个👍。
其实到这一步确实遇到了偏离最初设想的问题:
我们想要:有限的基因AST + 无限制的语言/框架/库/工具 === 去实现有限的结果输出。
但是: 1+无限=无限, 1x无限=无限
在这种要求下,我们只能通过迭代流程等要素,无限趋近于100%的实现有限和一致的输出,但是就像圆周率永远算不尽,永远没有绝对光滑的圆,我们也只能实现有一定波动的输出。
这种波动并非没有意义,比如我们用来重构项目时,更换一下框架语言,升级一下依赖和运行环境版本等,实现一个95%完成率的重构项目,也是很有价值的,具体不再过多讨论。
3.4、现有项目的知识流失
真实案例:
核心开发人员离职
↓
业务逻辑散落在代码中,难以理解
↓
文档缺失或已过时
↓
新人上手需要2-3周,频繁踩坑
↓
维护成本越来越高,不敢重构
根本原因:
- 业务逻辑隐藏在代码实现细节中
- 文档与代码分离,容易不同步
- 缺乏结构化的知识沉淀机制
- 项目知识随人员流失而消失
解决思路(反向提取)
graph TB
A[现有源码项目] -->|AI分析提取| B[AST元数据]
B --> C[13类结构化知识]
C --> C1[API定义]
C --> C2[数据模型]
C --> C3[业务流程]
C --> C4[权限规则]
C --> C5[UI组件]
C --> C6[配置项]
C1 -->|自动生成| E[API文档]
C2 -->|自动生成| F[ER图]
C3 -->|自动生成| G[流程图]
B -->|自动生成| H[架构图]
C4 -->|自动生成| I[权限矩阵]
E & F & G & H & I & C -->|综合生成| D[项目接手指南]
D --> D1[架构图]
D --> D2[API列表]
D --> D3[ER图]
D --> D4[业务流程图]
D --> D5[权限模块]
D --> D6[源码核心摘要]
D --> D7[开发流程/注意事项]
B -->|可追溯| J[源码位置记录]
J --> K[文件路径+行号]
style A fill:#e1f5ff
style B fill:#fff4e1
style D fill:#e1ffe1
style E fill:#e1ffe1
style F fill:#e1ffe1
style G fill:#e1ffe1
style H fill:#e1ffe1
style I fill:#e1ffe1
style K fill:#ffe8e1
这个流程其实只是增加了一些文档: PROCESS_PROJECT_ONBOARDING_DOC_GENERATION.md,用于生成项目使用指南。 AI_GUIDE_V2.md ,迭代后的AI指引入口文档,用于让AI参考指定的文件分步执行流程。
总结
其实还有很多细节。
比如:如何进行AI流程开发的调试工作,如何生成AI修改报告等,网上也能搜到,这里就不再赘述了。
以上就是个人总结的一些思路,希望对大家有所帮助。
写文章太痛苦了,有用的话点个赞,掘金的mermaid图貌似版本有点低?后面该画图的我都省了。