Back to Article

用文档驾驭 LLM:一次 AI 辅助编程实践复盘

用文档驾驭 LLM:一次 AI 辅助编程实践复盘

在 AI 辅助编程的实践中,总会遇到一些值得反复琢磨的选择:该用什么模型?依赖多大的上下文窗口?又如何让整个开发过程不至于在某次 commit 之后完全失控?最近在一个自动化工具的构建过程里,这些问题全都浮现了出来,而最终的解决思路,指向了一个看似朴素但极其实用的方向——用文档来驾驭 LLM。

项目初期,对于模型的选择很容易被“速度”和“成本”这两个指标所牵引。一个响应快、性价比高的模型,确实能带来流畅的即时反馈,让编码节奏不受打断。但当项目逐渐膨胀,上下文窗口的限制就开始显露威力。为了保证对话不超出容量,不得不频繁地裁剪、重组提示,那种被工具限制打断思考的体验,会在不知不觉中消耗掉大量时间。而换用上下文窗口更大的模型后,情况明显改善——虽然首字响应稍慢,但省去反复调整提示的精力,整体的推进效率反而更高。

工具层面,整个项目都依赖同一款交互式编码助手完成,并且刻意没有启用任何“架构师模式”。之所以这样坚持,是因为后面采用了一种自文档化的开发方式,它本身就承担了架构与规划的职责。

AI 编码类项目,尤其当它不再是“用后即焚”的一次性脚本时,核心焦虑其实只有一点:可控性。这种可控性既要体现在开发者对项目方向的把握上,也要体现在对 LLM 行为的引导上。毕竟大模型受限于注意力机制、上下文长度以及不可完全避免的幻觉,并不是一个每一步都能完全信赖的搭档。反观人脑,在面对复杂信息时同样存在遗忘和偏差,甚至更加不稳定。那么解法就很清晰了:引入一套结构化的外部记忆,也就是文档。

有一种叫做 Memory Bank 的理念,本质上就是一个随着项目推进不断更新的自文档化系统。它的做法很简单:在 LLM 每次行动前,都通过文档告知它项目的当前状态和具体目标;行动后,再用文档记录变化。这样做的好处是多方面的:文档自动描述了项目的进展,模型不再需要通读所有源码就能理解上下文,避免了将大量代码塞进有限的对话空间;文档本身构成了下一次操作的提示,能有效指导模型朝哪个方向走;借助文档,任务可以被天然地拆分成小块,每一步的注意力更加集中,幻觉出现的概率也随之降低;而站在开发者的角度,当逐步引导模型迭代文档时,对项目的信心也会在不知不觉中建立起来。

不过,并非所有类似的实现方式都让人认同。那种一次性抛出大段需求、直接生成巨量代码的模式,产出的结果往往缺乏透明度,维护时很难让人信任它的每个细节。一个更务实的做法是,借助交互式工具,用文档将开发拆成明确的几个阶段。

具体操作是这样的:首先,给项目新建一份设计文档,可以称之为 RFC,把它加入可编辑列表中。然后频繁地切换到对话模式,与 LLM 逐点讨论需求,每一轮讨论结束,就用代码模式让模型将讨论结果落笔到文档里。这个过程反复迭代,直到需求的完备性和清晰度都达到满意的程度。往往在这个过程中,模型能够发现不少设计上的潜在缺陷,避免在实现阶段返工。

当设计文档定稿后,将它设为只读,再新建一份实现计划文档,用来规划具体的实现步骤。接着重复刚才的“讨论-修改”流程,直到生成一份清晰的、带完成状态标记(如未完成 [ ])的步骤清单。这一步做完,项目的规则文件和设计文档都保持只读,只留实现计划文档处于可编辑状态,然后开始让模型逐项实现。每完成一步,就将清单中对应的标记改为已完成([x])。到了后期,指令变得异常单调,几乎都是“请实现第 X 步”这样重复的句子,但这也恰恰说明,整个流程已经进入了稳定的惯性推进状态。

这种开发方式带来的最大惊喜,是模型对代码定位的精准度。依赖详尽的实现计划文档和工具自带的仓库结构映射,LLM 能够清晰地指出需要修改哪些文件。操作时通常会先输出一段思考分析,然后明确告知编辑目标。随后工具的交互会提示将这些文件加入可编辑列表,模型再基于最新的文件内容重新分析并执行修改。这种闭环不仅效率高,而且在实际感受上,它的准确度已经超过了不少常见的检索增强生成技术。

然而,顺畅的开发流程并不代表调试同样轻松。出错时,惯常的做法是把报错日志直接交给模型,让它自行修正。但麻烦在于,随着项目规模增长,这种单纯的修复模式很容易导致代码质量悄然下滑,陷入“修好一个地方,又碰坏另一个地方”的循环,如果不加干预,最终可能会演变成难以维护的烂摊子。如果重新走一遍这个流程,一个改进的方向是:在设计阶段就更清晰地定义出所有核心使用场景,然后进入实现计划阶段时,先引导模型依据这些场景写出单元测试,再着手具体实现。用测试作为安全网,或许能有效遏制那种连锁式的质量衰变。

回过头看,AI 编程最大的改变,或许并不是省去了多少敲击键盘的时间,而是极大降低了“启动”的心理阻力。很多想法过去明明觉得能够实现,也清楚自己的能力边界,但总是在真正动手前,因为预见到过程中会遇到的繁琐而一再推迟。如今,当那些前期规划、上下文管理、逐项推进的体力活可以被高效分担时,迈出第一步不再那么沉重,而将一个想法从脑海放进现实,也变成了一件触手可及的事。