AI 会写代码了,为什么项目还是会越做越乱?

AI 会写代码了,为什么项目还是会越做越乱?

——我对 Harness Engineering 的第一次理解

最近我一直在用 AI 开发自己的项目。

一开始,我关注的事情和很多人差不多:

  • 哪个模型写代码更强?
  • Codex、OpenCode、Claude Code、DeepSeek 到底谁更适合开发?
  • Prompt 应该怎么写,才能让 AI 一次性把功能做对?

但随着项目代码越来越多,我慢慢发现了一个比“模型够不够聪明”更麻烦的问题:

AI 很会写代码,但“会写代码”不等于“会长期维护一个越来越复杂的工程”。

这也是我读 OpenAI《Harness Engineering》之后,最大的认知变化。


1. 功能写出来,不代表系统真的变好了

假设我正在开发一个 Agent。

今天让 AI 做 Graph。

完成了。

明天让 AI 做 Evidence。

也完成了。

后天继续做 Hypothesis、ActionTrace、Tool Registry。

每个模块单独看都没有问题,测试甚至可能全部通过。

但放到一起以后,可能变成这样:

工具发现一个资产
↓
Evidence 记录了

但是 Graph 不知道

Graph 里出现了 Endpoint
↓
Hypothesis 没有消费

Hypothesis 产生了判断
↓
Planner 又完全没看到

这时候就会出现一种非常危险的错觉:

功能越来越多
≠
系统越来越完整

有时候甚至恰恰相反。

功能越多,模块之间的关系越复杂,AI 越容易写出“局部正确、整体脱节”的代码。

所以后来我开始刻意区分两个词:

implemented

和:

integrated

前者表示:

代码写出来了。

后者才表示:

这个能力真的进入了系统主流程,并且上下游都能消费它。


2. OpenAI 做了一个很极端的实验

OpenAI 在《Harness Engineering》里介绍了一个实验:

他们从一个空 Git 仓库开始,让 Codex 构建一款真实的软件产品。

五个月后,这个仓库已经达到大约一百万行代码,期间大约打开并合并了 1500 个 Pull Request。应用逻辑、测试、CI、文档、可观测性、内部开发工具等,都由 Codex 编写。人类工程师主要负责方向、环境、意图和反馈机制。

真正让我注意的不是“一百万行代码”这个数字。

而是 OpenAI 后面总结出来的一句话:

早期进展比预期慢,并不是因为 Codex 没有能力,而是因为环境规范不够明确,缺少完成高级目标所需要的工具、抽象层和内部结构。

这句话对我冲击很大。

因为以前 AI 做不好时,我第一反应往往是:

是不是 Prompt 不够详细?

于是继续补:

请仔细一点。
请不要破坏已有功能。
请遵循项目架构。
完成以后请测试。

但现在回头看,这些很多时候只是在“提醒模型”。

并没有真正解决能力缺口。


3. Prompt 和 Harness 的区别

假设你让 Agent:

修改页面以后记得检查 UI。

如果 Agent 根本不能打开浏览器,也不能读取 DOM,不能截图,那这句话没有意义。

这不是“模型不听话”。

而是:

Agent 根本没有验证 UI 的能力。

这时候正确解决方案不是:

把 Prompt 写得更严厉。

而是补:

Browser
DOM
Screenshot
Navigation
Logs

同样的道理。

如果你告诉 AI:

不要绕过 Scope。

但 Runtime 本身允许它直接执行 Tool,那么这个安全要求依然只是文本。

真正的解决应该是:

Action
↓
ScopeGuard
↓
Runtime
↓
Tool

没有通过 Scope:

Tool 根本不能执行。

这个时候,规则才真正进入系统。

所以我现在对 Harness 最简单的理解是:

Prompt 是告诉 Agent“应该怎么做”;Harness 是让整个环境“帮助它做对,并尽量阻止它做错”。


4. 为什么 AGENTS.md 也不是万能药

很多人在 AI 项目做大以后,会自然想到一个办法:

把所有规则写进 AGENTS.md。

一开始效果确实很好。

项目结构、编码规范、注意事项、架构要求,都塞进去。

但是随着项目增长:

100 行
↓
500 行
↓
2000 行
↓
5000 行

最后反而会出现新的问题。

OpenAI 自己也走过这条路,并明确说“大型 AGENTS.md”是一种失败尝试。

原因其实很好理解:

第一,Context 是有限的。

规则占得越多,真正的任务、代码和相关资料能占的空间就越少。

第二,当所有事情都写成:

IMPORTANT
MUST
CRITICAL

最后结果就是:

什么都重要
=
什么都不重要

第三,文档会过期。

旧规则继续留着,新规则又不断增加,Agent 很难知道哪个才是现在真正有效的。

所以 OpenAI 后来把 AGENTS.md 变成了一张“地图”。

大致思想是:

AGENTS.md
↓
告诉 Agent 去哪里找

ARCHITECTURE.md
docs/design-docs/
docs/exec-plans/
docs/product-specs/
SECURITY.md
RELIABILITY.md
...

也就是说:

不要一次把整个项目知识倒进 Agent 的脑子里。

而是:

先告诉它地图,需要什么,再去读什么。

这就是渐进式披露。


5. Repository 才应该是长期记忆

还有一个我以前很容易忽略的问题:

很多重要知识实际上只存在于聊天记录里。

比如我和 AI 讨论了一个小时以后,终于确定:

EO 只能由 Settlement 创建。

如果这个结论只留在聊天里,那么换一个新的 Session 以后:

新的 Agent 根本不知道。

人类团队也一样。

某次 Slack 讨论决定了一个重要架构原则,但三个月以后新来的开发者没有看过那条消息。

OpenAI 的做法是:

Repository = System of Record

也就是说真正重要的长期知识应该尽量进入仓库:

代码
架构文档
设计决策
执行计划
技术债
产品规格
测试
Schema

这样即使聊天历史全部消失,一个新的 Agent 也能重新理解这个项目。

这对 AI-first 开发尤其重要。


6. 文档还是不够,因为 AI 依然会违规

这也是 Harness Engineering 最重要的一步。

你可以在 ARCHITECTURE.md 里写:

Planner 不允许直接调用 Tool。

但是 AI 为了快速完成任务,依然可能写出:

Planner
↓
exec("nmap ...")

而且代码还真的能跑。

这时候问题已经不是:

AI 不知道规则。

而是:

系统允许它违反规则。

OpenAI 的解决办法就是把重要架构规则机器化。

例如用:

Custom Lint
Structural Test
CI

去验证依赖方向。

于是:

文档:
“不要这样做”

变成:

代码这样做
↓
FAIL

这才是真正稳定。


7. 我现在怎么看 AI 开发

以前我理解 AI 开发:

人提出需求
↓
AI 写代码
↓
人检查
↓
完成

现在我更愿意理解成:

人提出目标
↓
Agent 尝试
↓
观察它在哪里失败
↓
判断它缺的是:
知识?
工具?
状态?
反馈?
约束?
↓
把缺失能力补进 Harness
↓
Agent 再尝试

也就是说:

Agent 犯错本身,也是项目建设的信息。

如果一个错误以后还可能发生,那么最好的问题不是:

这一次怎么修?

而是:

为什么系统允许这个错误发生?

再进一步:

能不能让这个错误以后更难发生?

这时候解决方案可能是:

Docs
Tool
State
Runtime Guard
Integration Test
E2E
Lint
CI

而不是继续加 Prompt。


8. 一句话总结

如果一定让我用一句话解释 Harness Engineering,我会这样说:

它不是研究如何让 AI 写更多代码,而是研究如何把软件项目本身改造成一个 AI 更容易理解、更容易操作、更容易验证、也更难破坏的环境。

所以真正的 Agent 工程能力,并不只取决于模型。

更接近:

Model
×
Context
×
Tooling
×
Architecture
×
State
×
Feedback
×
Enforcement

这也是我现在做 AI 项目后越来越强烈的感觉:

AI 会写代码,只是开始。

真正困难的是:

今天这个 Agent 写出的东西,半年以后换一个完全没有聊天历史的 Agent,它还能不能理解、继续开发,并且不把整个系统搞坏?

如果可以,那这个项目才真正开始具备 AI-first 的工程能力。


参考资料

OpenAI,《工程技术:在智能体优先的世界中利用 Codex》

https://openai.com/zh-Hans-CN/index/harness-engineering/

注:本文中的部分小型项目案例与示意图是为了帮助理解而重新构造,并非 OpenAI 原文中的具体实现案例。

posted @ 2026-10-04 21:10  0xMouise  阅读(16)  评论(0)    收藏  举报