如何构建 AI 智能体喜欢的代码库
了解深模块和合理的代码库架构如何提升 AI 编码效率,掌握面向 AI 的代码库设计原则。
本页目录
AI 不是拥有超能力的开发者,而是一个没有记忆的新员工。每次启动智能体,都像《记忆碎片》的主角走进代码库,说:“好了,我到了,现在要做什么?”
相比提示词或 AGENTS.md 文件,代码库本身对 AI 输出的影响要大得多。如果设计有误,会在三个方面付出代价。
反馈循环薄弱。 AI 无法足够快地获得反馈,因此不知道自己的修改是否真正达到了预期。
难以导航。 AI 很难理解结构、找到文件,并判断该如何测试。
认知耗竭。 最终只能自己勉强维系 AI 与代码库之间的协作,并手动修补一切。
AI 实际看到的内容
假设这是你的代码库:
每个方块都是导出某项功能的模块,例如函数、变量或组件。内部只有模糊分组:缩略图编辑器、视频编辑器、身份验证、CRUD 表单。
你理解这张心智地图,但 AI 不理解。它看到的是:
一堆彼此都能相互导入的零散模块,没有分组,也没有关系。文件系统同样没有提供帮助,一切混杂在一起。
你每天都在让 20 多个新员工查看代码库并修改代码。因此代码库必须对它们友好且易于导航。
解决方案:深模块
代码库的文件系统和设计,需要与你脑中的内部地图一致。我找到的最佳方式是使用 深模块.
深模块来自《A Philosophy of Software Design》。核心思想很简单:用一个简单接口控制大量实现。
不要使用大量小模块:
最终得到的是大块功能,以及简单、可控的接口。所有导出都必须通过该接口。
灰盒模块
深模块会在代码库中形成天然接缝。你精心控制和设计接口,内部实现则交给 AI。
编写测试来锁定模块行为,这样就不必查看内部。当然,如果想施加品味、影响结果或改进性能,也可以查看;但只要测试通过,就不必操心。
这就是 灰盒模块。你负责接口,AI 负责实现,测试则确保实现可靠。
提升可导航性
为每个模块分配独立文件夹和清晰的公共接口。AI 可以在文件系统中看到所有服务、读取其类型并理解用途,而无需深入实现。
我们让代码库能够渐进式披露复杂度。 接口位于最上层,说明模块的作用;只有需要时才深入内部。
减少认知耗竭
无需在脑中维持数百个相互关联的模块,只要记住七八个功能块。AI 管理每个块的内部内容,你只需关注接口设计及其组合方式。
这与 氛围编程仍然相距甚远。你需要在边界处运用品味,决定哪些内容属于哪个模块。不过心智地图已经简单得多。
优秀实践依然是优秀实践
这并不新鲜,优秀代码库二十年来一直这样设计。对人类有效的方式,对 AI 同样有效。
自动让代码库对智能体更友好
/improve-codebase-architecture 会按照本文介绍的模式审计并重构代码库。
总结
你的代码库很可能还没有准备好迎接 AI。它没有深模块,只有一张由相互连接的浅模块组成的网:
这种结构难以导航、难以测试,也难以记在脑中。
解决方案是拥有清晰接口和强测试的深模块。从 PRD 到实现 issue,都要考虑模块边界。测试和反馈循环不可或缺,它们能让 AI 新员工知道修改是否有效。
有些语言更容易实现这种结构。在 TypeScript 中,强制这些边界并不容易;我越来越常使用 Effect,因为它能简化代码库模块化。