跳到主要内容

AI写代码总改错地方?Harness工程踩坑实录:90%团队都走偏了

企业做 AI Coding,从来不是工具问题,而是系统工程问题。

很多人试图把 AI 从写代码工具升级为系统协作角色,也通过度量与可观测让事情变得可管理。

但真正的分水岭,不在能不能用,而在:能不能长期稳定演进,而不是三个月后崩掉。

这一篇,我们只做一件事:👉 把企业在 Harness(工程驾驭层)建设中最容易踩的坑,讲透。

一、最常见的第一个误判:把问题当成检索问题​

需求来了,让 AI 改代码,最怕什么?

不是 AI 漏改,而是 AI 多改了。比如:用户取消订单的场景,需求要求加一段逻辑,但同样的入口,订单超时关闭也在调用。AI 改了取消订单的流程,超时关闭的行为也跟着变了,但没人发现。

于是开始做:

  • Code Graph:方法索引、调用关系、结构标签
  • 向量检索:让 AI 能快速定位相关代码

动机是合理的:没有 Code Graph,AI Agent 只能一次次调用 bash 工具执行 grep,效率低还容易漏。有了 MCP + Code Graph,AI 可以直接判断出影响面和改动的爆炸半径,一次调用就知道哪些地方会受牵连。

但这个方向隐含了一个前提假设:Code is Document(代码即文档)

这个方向的问题是什么?​

短期是有效的,但很快会遇到三个问题:

1. AI知道改哪里,但不知道该不该改

它可以回答:

  • 哪些接口相关
  • 哪些 service 会被影响

但回答不了:

  • 为什么这个字段不能删?
  • 为什么这个逻辑不能动?
  • 为什么这个接口设计这么奇怪?

👉 因为这些信息不在代码里。

2. 在复杂系统中,影响范围判断会失真

当系统出现:

  • 异步消息链路
  • 跨服务调用
  • 历史兼容逻辑

AI 会出现典型问题:路径找对了,结论错了。

3. 索引系统本身变成隐形技术债

  • 标签需要维护
  • 索引需要更新
  • 一旦滞后 → 检索质量下降

最后变成:你在维护一个半成品知识库,但你自己没意识到。

二、第二个极端:过度建设知识库​

另一类团队走向了反方向。

动机也很合理。

在企业的真实环境中,一个成熟的业务系统轻松十万行代码,从前台到管理端到数据分析端,涉及的角色和功能点特别多。一个需求过来,AI 首先要搞清楚:改哪些功能?涉及哪些模块?分析怎么改?

但问题是,从需求到代码,中间的转化是有误差的。代码注释不够、命名不够规范,AI 就无法精准定位到该改哪里。十万行代码里找一个逻辑入口,靠 AI 自己读代码,准确性没法保证。

所以团队的想法是:把业务知识补全,用知识库来弥补 AI 理解力的不足。

于是开始建设:

  • 架构文档
  • 业务文档
  • 隐性约定
  • 数据库清单
  • 接口清单

这对应另一种思路:用知识补全来对冲 AI 的不确定性。

这个方向的问题更隐蔽​

1. 文档维护成本极高,几乎必然失效

现实情况是:

  • 三个月后,没人更新
  • 六个月后,文档失真
  • 九个月后,没人再信

2. 文档与代码脱节,反而误导 AI

最危险的情况不是没文档,而是:

  • 文档说 A
  • 代码是 B
  • 实际行为是 C

AI 会优先相信文档 → **得出错误结论。**比没有文档更危险。

3. 不符合大模型的优势路径

当前大模型的能力特点很明确:

  • 强于:代码理解、局部推理
  • 弱于:文档真实性判断、长期一致性

👉 结果就是:文档越多,不一定越好,甚至可能更差。

三、核心误区:把 Harness 当工具,而不是系统​

无论是代码派还是知识派,本质都有一个问题:把 Harness 当成一个能力点,而不是系统架构。

但 Harness 的精髓是:**用稳定可靠的技术手段,替代 AI 不够精确的部分。**不是让 AI 更聪明,而是让 AI 在不确定的地方被约束住。

它本质上是一个系统认知层。

它要解决的是:

  • AI 怎么看系统
  • AI 怎么理解影响
  • AI 如何避免错误
  • 系统如何自我进化

四、正确路径:三层结构,而不是两种流派​

经过多轮实践,我们最终收敛出一个更稳定的结构:

第一层:Code Graph / 代码图谱(事实层)​

解决问题:系统长什么样。

包含:

  • 方法索引
  • 调用关系(call graph / 调用图)
  • 标签(自动生成)

👉 这是 AI 的感官系统。

举个例子:一个支付接口改了返回值,Code Graph 能立刻告诉你哪些方法在调用它,但不知道这个改动会不会引发业务问题。

第二层:Flow Graph / 流程图谱(路径层)​

解决问题:请求是怎么跑的。

包含:

  • API → service → DB → MQ 的完整链路
  • 定时任务链路
  • 外部依赖

👉 这是 AI 的血管系统。

接着上面的例子:Flow Graph 能告诉你这个支付接口的返回值,会被异步消息转发到对账系统,但不知道对账系统有兼容逻辑,删掉旧字段会导致对账失败。

第三层:Memory / 经验记忆(约束层)​

解决问题:系统不能犯什么错。

只保留三类信息:

  • 业务约束(必须遵守)
  • 事故记录(踩过的坑)
  • 架构决策(为什么这么设计)

👉 这是 AI 的经验系统。

同一例子:Memory 里有去年的一次事故记录:旧字段被删后对账失败,所以这个字段不能动。三层一起,AI 才能真正安全地改代码。

五、最大的分水岭:有没有自进化能力​

前面三层解决的是:让 AI 能用。

但企业真正需要的是:让系统越来越好用。

这就进入下一阶段:👉 Self-evolving Harness / 自进化驾驭系统。

六、第三个坑:以为自动化 = 自进化​

很多团队会尝试:

  • 自动提取文档
  • 自动生成规则
  • 自动学习经验

但很快会翻车:垃圾进 → 垃圾出。

真正的自进化必须具备三个引擎​

1️⃣ Risk Engine / 风险引擎

作用:在改代码前就告诉你:哪里可能炸。

核心逻辑:

  • diff → 向量化
  • 匹配历史事故
  • 输出风险等级

没有它:每次上线都是在赌博,AI 改了一行代码,你不知道会不会引爆三个月前埋的雷。 有了它:AI 动代码之前,系统自动告诉你这片区域上个月出过 P0,建议加测试。

2️⃣ Constraint Engine / 约束引擎

作用:在生成代码时强制遵守规则。

例如:

  • 状态不可逆(已支付不能回退为待支付)
  • 操作必须幂等(同一请求不能重复扣款)

👉 防止 AI 看起来对,其实错。

没有它:AI 生成的代码语法没问题、逻辑也对,但违反了业务铁律,上线就是事故。 有了它:AI 想删一个字段,约束引擎直接拦截:这个字段在订单状态机里,不能动。

3️⃣ Learning Engine / 学习引擎

作用:每次改动都让系统更聪明。

从哪里学?

  • diff(代码变更)
  • session(操作会话)
  • 错误记录

但关键点是:

  • ❌ 不能全自动入库
  • ✅ 必须有人审核

没有它:同一个坑,AI 今天踩、明天踩、后天还踩。 有了它:上次 AI 把异步消息当同步处理出了事故,审核入库后,下次遇到类似场景自动告警。

七、最关键的闭环(很多团队缺失)​

真正的自进化,不是某个能力,而是一个闭环:

需求 → 分析 → 风险评估 → 约束注入 → 代码生成 → 执行 → 复盘 → 更新知识 → 下一轮

举个例子:缺了复盘环节会怎样?

团队上线了一个 AI 改动的接口,出了问题但没复盘。风险引擎不知道这片区域出过事,约束引擎也没学到新规则。下一次 AI 在同一片区域改代码,同样的坑再踩一遍,系统毫无长进。

如果缺任何一个环节:👉 都不叫自进化。

八、企业最容易踩的三个致命坑​

坑一:只做 Code Graph(代码图谱)

结果:AI 会写代码,但经常改错地方。

坑二:过度建设文档

结果:AI 被误导,比没文档更危险。

坑三:没有风险体系

结果:每一次上线,都是一次赌博。

九、一个更现实的判断(给技术负责人)​

如果你只能做一件事,优先级应该是:

  1. Code Graph / 代码图谱:让 AI 看懂代码
  2. Constraint / 约束:让 AI 不犯错
  3. Risk Engine / 风险引擎:让系统可控
  4. Learning / 学习:让系统进化

而不是一开始就:我们要做一个知识库。

十、这一阶段的本质变化​

从个人提效到系统进化,其实是一次认知跃迁:

个人提效:AI 写代码

团队提效:AI 参与开发

系统进化:AI 参与决策

结尾​

很多团队会问一个问题:Harness 到底值不值得做?

答案其实不复杂:

如果你只是想让开发快一点,不值得。

如果你想让系统越来越稳定、越来越可控,那这是唯一的路。