Featured image of post 双代理法则: 开发新功能, 别被上下文淹没了
科技 软件开发 AI工具 工程实践 开发流程

双代理法则: 开发新功能, 别被上下文淹没了

一种实用的AI编程助手协作模式, 专门解决复杂代码库场景——理解上下文窗口的局限, 合理安排开发流程, 事半功倍。

用AI编程助手写点简单的小功能, 谁不会?可一旦要动点“大手术”——比如新功能开发、系统集成——不少人就会陷入一种“我是不是智商税交多了”的无力感。

本来目标很明确, AI一开始也挺聪明, 左看看右看看代码, 问几个问题, 甚至还给出点靠谱方案。可一到真动手写代码, 画风突变: 代码集成得四不像, 边界条件忘得一干二净, AI还一本正经提出些能直接把系统搞崩的改动建议。

于是你发现, 自己不是在写功能, 而是在debug AI的迷之思路……

其实, 问题不是AI不行, 而是我们用错了方法。别把AI当实习生, 什么都记得牢牢的。它们更像天赋异禀但记性极差的咨询顾问——短时记忆就那么点, 还经常“跑题”。

明白这一点, 开发流程就该升级了。

真正的难题: 上下文越积越乱

和AI助手聊得越久, 问题越大。每一次“走错路”, 每一个被推翻的假设, 每个查过的无关文件——对AI来说, 都是不可磨灭的“历史遗留”。不像人类能自我总结、自动遗忘, AI只会越背越重, 还全都塞在短期记忆里。

想象一下你专心写作时, 有个人把你所有草稿、废话、删掉的段落都大声朗读一遍。信噪比越来越低, 最后脑袋瓜子只剩“乱”。

这也是为什么有时候你和AI规划得头头是道, 真到实现阶段却步步踩坑。AI虽然最后想明白了, 但所有的歧路亡羊都还“留在脑子里”——一不小心就又走回老路。

解决办法不是少用AI, 而是让你的开发流程更适合AI的“脑回路”。

双代理模式登场

最靠谱的做法很简单: 一人 (代理) 负责探索, 一人 (代理) 专职实现, 各司其职, 分工明确。

第一个AI代理, 姑且叫“探索者”: 它就像项目里的“侦查兵”, 专注于搞清楚代码结构、问关键问题、梳理集成点, 最后输出一份清晰明了的开发方案。这步的核心是“把问题想透、把方案写清”。

第二个AI代理, 叫“实现者”: 它啥都不带入, 只接受探索者的成果文档, 干净利落地写代码。没有历史包袱, 没有莫名其妙的上下文污染。

其实, 这不就是高级工程师和开发小组的惯用套路吗?架构师负责搞清楚全局、制定方案, 开发同学根据方案实现。哪怕同一个人, 方案和实现也是“两副面孔”——前半场思考, 后半场执行。

第一阶段: 带约束的探索

首先, 你要清晰地描述清需求。别小看这一步, 后面一切的质量都靠它打地基。

给探索者AI指明方向: 要查什么模块, 只看相关代码, 别瞎溜达。比如要给用户认证系统加OAuth, 就请它“专注查auth相关文件”, 别让它在全仓库里迷路, 把宝贵的上下文窗口全浪费在无关代码上。

还得加一句“魔法提示”: “如果你有任何不确定, 先问清楚, 别自己脑补。”

这句话的力量堪比“防脱发洗发水”——大模型如果不被约束, 最喜欢自作聪明地瞎猜, 但你明确要求它“有疑问就问”, 它反而会提出不少专业、靠谱的问题。

这些问题要认真答, 别怕麻烦。比如它问“软删除用户还能登陆吗”, 你别只回答“不行”, 而是把用户删除的整个生命周期讲透, 顺带把相关联的系统规则都说清楚。

随着探索推进, AI会不断提问、查代码、细化理解。直到有一天, 它自信地宣布: “我明白了, 这就是完整方案。”

关键交接点

大部分人到这步就掉坑里了——一看到计划靠谱, 立刻喊: “好, 直接在这个对话里实现吧!”

千万别!这一步是分水岭。

你要让探索者AI不是写“操作指南”, 而是写“开发文档”给另一个开发者看。二者差别大得很。

“操作指南”像是: “给User模型加个deleted_at字段, 把UserService.get_active_users()方法改成排除已删除用户。”

“开发文档”则是: “models/user.py里的User模型, 当前没有软删除机制, delete()方法会直接删除。要做软删除, 可以加个deleted_at时间戳。services/user_service.py的UserService负责返回用户集合, 这里需要过滤掉已删除用户。admin/users.py是管理后台用户列表, 数据来源于UserService。”

前者是“照做”, 后者是“指导思路”——既指出重点位置, 又保留实现灵活性, 方便后续开发者 (AI) 独立思考。

交接文档里最好有:

  • 相关文件路径和大致内容
  • 集成点以及原因
  • 可能的实现方案和权衡
  • 具体需求、业务约束
  • 你的代码风格偏好

这就是“交接文档”。

第二阶段: 清爽实现

新开个对话, 把交接文档和最初的需求一起贴进去。

你会看到有趣的变化:

如果探索者AI的文档写得够好, 实现者AI通常会很快领会架构, 认认真真看了相关文件后说: “我可以开始写啦。”

这句话其实是个“质量信号”: 能顺利开工, 说明文档清晰全面。如果还要追问一堆细节, 说明探索阶段还差点火候。

此时实现者AI有如下优势:

  • 上下文极为干净, 只关注核心信息
  • 没有探索阶段的“杂音记忆”
  • 站在“局外人”的新视角, 容易发现集成盲点
  • 可以自主做实现决策

通常写出来的代码, 更贴合现有架构, 风格一致, 集成自然。

为什么这招真管用?

大模型不像人类“选择性遗忘”, 它会把上下文窗口里的每个token都平均权重地处理。你30条消息前的迷惑发言, 和刚刚描述的需求影响力几乎一样大。

重置上下文, 不只是省点token, 更是把那些“误导信号”一锅端, 避免影响实现。

这就像两种会议:

  • 一种东拉西扯两小时, 每条歪路都讨论一遍, 最后还要带着一堆废话来做决策
  • 一种是有人拿一页纸, 清清楚楚总结了重点, 大家直接讨论执行

后者的决策效率和质量, 自然高出一大截。

实战举例

比如你要给数据平台做数据导出功能。系统里权限复杂, 数据格式多, 敏感信息边界一堆。

“探索者”AI就要:

  • 仔细梳理权限系统, 弄明白各项控制规则
  • 查现有导出代码, 保证风格一致
  • 找出敏感数据的过滤点
  • 问清导出需求: 格式?大小?异步还是同步?
  • 看看类似功能怎么做错误处理和日志
  • 最后出一份覆盖数据流、权限、格式转换、异常处理的开发计划

交接文档可能会写: “services/reports.py里的报表生成用的是Celery异步任务, 大数据集建议也用这个模式, 防止请求超时。权限校验在服务层, 不是在API层, 参照ReportService.get_report()。数据脱敏统一用utils/sanitize.py。”

“实现者”AI看了文档和相关代码, 照着现有架构写导出功能: 用Celery做异步、在服务层校验权限、用统一的脱敏工具。

如果让同一个AI从头到尾搞, 很容易出现风格错乱: 权限校验位置不对、处理方式不统一、同步异步混用……这些细节虽然不致命, 但积累多了, 代码库就会越来越难维护。

什么时候适合用双代理?

不是所有需求都需要这么大阵仗。加个小工具函数、修个显眼bug, 让AI单兵作战就够。

这套流程特别适合:

  • 涉及多个系统模块的新功能
  • 集成比“单点突破”更重要
  • 需要新代码无缝融入既有体系
  • 对架构理解有要求
  • 你已经反复给AI补充上下文, 依然沟通不畅

一个简单判断: 如果你觉得“这活儿最好有高级工程师先审设计”, 那就用双代理。

模式变种

有些团队更“花哨”——

  • Architect (架构师) 代理专门做方案评审
  • Reviewer (评审员) 代理专门挑刺
  • Documenter (文档员) 代理专门写用户文档

核心原则不变: 每个代理只关心自己那一块, 脑子越干净越好。

隐藏的好处

除了代码质量提升, 这个模式还有个隐形福利: 逼着你自己把需求想明白。

要写出合格的交接文档, 自己必须先厘清思路。探索者AI问得越细, 你越不能蒙混过关, 反而提前发现了需求歧义和漏洞。

很多bug其实不是AI写得差, 而是“设计阶段就没想明白”, 这个流程刚好把问题提前暴露了。

实用建议

实际用的时候还有几点小窍门:

  • 一开始就告诉探索者你的需求和相关目录, 别让它全仓库乱跑
  • 探索阶段AI问的问题一定要认真答, 哪怕看起来“很傻”, 有些问题其实暴露了隐含冲突
  • 交接文档不用长, 三四段就行, 重在清晰, 不必面面俱到
  • 如果实现者AI还追问很多细节, 说明探索阶段还欠火候, 可以考虑补充
  • 你的代码风格 (格式、文档、命名) 要明说, AI不会“耳濡目染”吸收

局限性

这套方法不是万能的。实现者AI照样可能写出bug, 集成阶段也还是会有意外。代码评审依然必不可少。

但它至少解决了“上下文污染”这个大难题, 让复杂功能开发变得可靠许多。

拓展思路: 不只有编程

只要是复杂任务, AI都适合用这个分阶段流程: 先调研/探索, 产出清晰文档, 再执行/实现。

领域不同, 模式可变, 但核心铁律不会变——认知清晰, 远胜于“模型参数大”。一个“中等资质”模型, 拿着干净简洁的上下文, 往往能干掉“天赋型选手”却被上下文垃圾拖后腿的“天才”。


(本文由人类原创, 并在部分环节借助AI润色。)

© 2022 - 2026 张欣耕

保留所有权利