我一直留意到一个现象:同一个编码助手,有人用得风生水起,半天就把一个模块搭出来了;有人用了一下午,改来改去还是卡在同一段逻辑上。差距不在工具的智能程度,而在你与它打交道的方式。大部分人的习惯还是把 AI 当成一台高级执行器——下命令、拿结果、不满意再下命令。这种“命令—响应”的交互模式,应付简单任务没问题,一旦进入真实项目,立刻暴露出上下文断裂、规范失控、返工不断的毛病。真正拉开效率差距的,往往是少数已经切换到“协作”模式的人:AI 不再是执行命令的终端,而是持续参与设计、审查、决策的协作者。
下面这五个范式,是我在大量项目实践中逐步总结出来的。它们不需要你换工具,只需要改变与 AI 对话的方式,以及对话素材的组织方式。前三项解决“上下文”和“质量”问题,后两项解决“方向”和“决策”问题。每一项我都给出了可以直接照做的落地方法,以及实际使用时的避坑经验。
1. 范式一:从临时问答窗口到持续项目语境,让 AI 先认识你的代码库
1.1 为什么临时问答窗口撑不起复杂项目
先看一个很典型的场景。你负责一个订单模块,两周前让 AI 帮你写过一个库存扣减的服务类。今天你想让 AI 继续优化它,于是你打开一个新对话,把那段代码贴进去,然后开始解释业务背景、表结构、调用链。AI 听懂了,写出来的东西却和两周前定下的方案相冲突——因为你这次没有告诉它当时的决策,它也根本“不记得”你们讨论过什么。
这就是临时问答窗口的致命短板:每一次对话都是从零开始。你不得不反复描述背景、重新贴代码、再次解释约束条件,而这些解释本身不仅费时,还会污染模型的注意力。模型上下文是有限的,你塞进去越多冗余信息,它对关键逻辑的关注就越差。很多开发者以为问题出在“提示词不够长”,于是把背景越写越厚,结果反而让 AI 的输出更散。
真正的问题不是提示词长度,而是知识组织方式。项目里那些“后来才明白的坑”“大家默认的约定”“已经否决掉的方案”,都只存在于人的脑子里,AI 看不到。它每次进对话都像一个刚入职的实习生,需要你从头带起。这个实习生如果干两周就离职、再来一个新的,你永远带不完。
解决思路只有一个:把项目知识外部化,做一份 AI 可见的、持续维护的“项目语境”,每次开对话时按需加载,而不是靠临时在提示词里堆砌。
1.2 语境文件怎么搭:一份能直接落地的结构
我在实际项目中会维护一个project-context/目录。结构大概是这样的:
project-context/ ├─ decisions/ # 架构决策记录,每个决策一个文件 │ ├─ inventory-deduction-strategy.md │ └─ session-timeout-policy.md ├─ conventions.md # 编码约定、禁用写法、错误处理规范 ├─ glossary.md # 领域术语与概念映射 └─ session-start.md # 每次开新对话时的快捷入口这些文件不是论文,也不是 wiki,而是碎片化的“决策快照”。比如decisions/inventory-deduction-strategy.md里面会写:为什么选择先锁库存再扣减,而不是先扣减再锁;哪些表变更过结构;当时对比过哪些备选方案,为什么淘汰。全文不超过 300 字,只保留结论和关键背景。
glossary.md特别值得一提。领域术语是 AI 出错的高发区——如果某个订单状态在你的系统里叫“pending”而不是“created”,必须明确写出来,并且附上它出现在代码里的真实字段名。AI 在知道这些映射关系之后,生成的代码才不会出现“把语义等价但实现不同的概念混用”这类低级错误。
使用时,每次开新对话先贴session-start.md,然后根据手头任务,按需带上decisions/下相关的一到两个文件。不要全量粘贴,因为对话窗口不是硬盘,加载过多无关内容会让模型的注意力被分散,输出质量会明显下降。
1.3 语境与“堆长 Prompt”的关键区别
有人可能会说:我也在每次对话里写了很多背景说明,效果为什么不如你描述的语境方案?因为堆长 Prompt 是一次性的大剂量上下文,它的问题在于:第一,信息没有结构化,叙事冗长,模型难以快速定位关键约束;第二,这些上下文只在当次对话有效,下次又要重新写出,知识无法积累;第三,后续多轮对话中,模型注意力会逐渐衰减,开头塞进去的背景越到后面越容易丢。
语境是一套可检索的长期记忆。每一次对话,你只需要加载当前任务最相关的几个文件。而且决策文件本身会随着项目演进持续更新,今天的新方案会成为明天的历史背景。维护成本并不高,我一般每周花十来分钟,把新做的决策和踩过的坑补充进去。
这套方式的收益是复利式的。项目越复杂、生命周期越长,语境带来的节省越明显。你不再是每次带着 AI 从零开始认识代码库,而是每一次讨论都建立在之前所有决策的基础之上。
2. 范式二:让 AI 从码字工变成审稿人,挑战式审查比代码生成更值钱
2.1 AI 最强的能力其实是“读代码”
在很长一段时间里,我把 AI 当成一个快速生成工具:说需求,拿代码,改完,下一个。后来我才想明白一件事——生成代码只是 AI 能力的一半,而且是不太需要我额外引导的另一半;AI 真正被低估的能力,是“读代码”和“挑毛病”。
为什么?因为代码生成的本质是续写和推理,模型一旦写出了一段正确率很高的代码,它会顺着自己的逻辑惯性往下走,反而不容易发现自己思维里的盲点。但当你把它切换成审查模式时,它的推理逻辑会反转:它会主动寻找不变量、检查边界条件、对照同一文件里的其他写法,去找矛盾。这种能力就像一个编辑器里内置了一个不知疲惫的同行评审,可惜大多数人从没启用过。
我自己做过一个对比实验:同一段包含缓存读取逻辑的代码,我用“帮我看看这段代码有什么问题”得到一个敷衍的回答;用挑战式审查的方式问,得到的是三个真实隐患,其中一个差点在生产环境里引发事故。区别不在于模型,而在于你给了它一个明确的立场——你是让它当“配合你”的助手,还是当“挑你毛病”的审稿人。
2.2 挑战式审查怎么调教,一次成功的真实模板
要让 AI 的审查真正有分量,不能只说“帮我 review”,要给角色、给维度、给输出格式。我常用的提示词结构是这样的:
你现在是资深代码审查者,请对下面这段代码给出挑战式审查。 重点检查:并发安全、边界条件、异常处理、资源释放、对外接口兼容性。 要求: 1. 每个问题必须指出具体行号,并给出可复现的场景。 2. 按严重程度分级:P0致命/P1严重/P2建议。 3. 不许夸奖代码,只输出问题和修改建议。同样的代码,用“帮我看看”和用上面这套提示词,输出质量完全是两个级别。举一个很典型的例子,下面这段 Python 缓存初始化代码:
class UserService: def __init__(self, cache, db): self.cache = cache self.db = db self._user_cache = None def get_user(self, user_id): if self._user_cache is None: self._user_cache = {} if user_id not in self._user_cache: user = self.db.find_user(user_id) if user is not None: self._user_cache[user_id] = user return self._user_cache.get(user_id)普通模式下,AI 只会说“整体逻辑清晰,注意一下并发问题”。挑战模式下,它会给出:P1 问题——多线程下两个线程同时进入if self._user_cache is None分支,会各自建一份缓存,导致数据不一致;P2 问题——缓存只增不减,用户资料更新后读到的还是旧值;P2 问题——db.find_user返回空时不做负缓存,每次缺失都会打到数据库,形成缓存穿透。
这三个问题里,缓存穿透和并发都值得被当成 P0 处理。你不需要每段代码都这样审,但关键路径上的代码值得这么做。注意提示词里的那句“不许夸奖代码”——这一点很关键,因为默认情况下模型会倾向于配合用户,你取消它的“礼貌义务”,它才会真正开足马力挑刺。
2.3 什么代码值得送审,什么场景别浪费这个动作
不是所有代码都需要挑战式审查。我的经验是,下面这几类代码拿到 AI 审查的性价比最高:
- 并发与原子性相关:缓存初始化、分布式锁、库存扣减、计数增减。
- 边界与异常路径:空值处理、超时重试、上游接口返回不确定值。
- 权限与输入校验:对外暴露的接口、用户可传入参数的解析入口。
- 接口变更影响面:修改了公共函数签名、调整返回值结构、替换了底层存储。
- 删除/重构类改动:删掉一段逻辑之前,让 AI 列出这段逻辑被谁依赖过。
相反,那些纯 UI 调整、打印日志、复制配置类的小改动,就不用兴师动众送审。审查也有成本,一次深度审查加上来回沟通可能要十分钟,这十分钟花在核心逻辑上绝对值得,花在无关紧要的地方就是浪费。
审查结果出来后,记得把问题清单里的关键项回写到语境文件的decisions/里。比如这次发现的“缓存必须处理并发初始化”这类约束,下次新写代码时 AI 就会主动避开,不用再把同一块代码送审第二次。
3. 范式三:把编码规范写进协作协议,事后纠正不如生成前约束
3.1 传统工作流里规范为什么总是迟到
大多数团队的规范流程是这样的:先写代码,再拼功能,最后开代码评审会,评审人提出“这里不符合错误处理规范”“那个命名违反项目约定”,然后开发去返工。这种流程在纯人工作业时代勉强够用,但放到 AI 协作时代,问题会被急剧放大——AI 生成代码快,它制造的不规范代码的速度同样快,评审和返工的时间完全抵消了生成效率。
问题的根源在于规范传递的介质不匹配。人类之间沟通规范靠的是规则文档、代码风格指南、前辈经验,但模型天生是按照统计规律生成内容的,它给出一段代码时,默认携带的是全行业最常见的习作风格,而不是你团队里独特的那套约定。你想让它遵守你的规范,就必须把规范本身转化为它读得懂、记得住、能执行的显式约束。
很多人把团队 wiki 直接丢给 AI 让它遵守,效果很差。因为 wiki 是给人写的,描述充满了上下文约定和隐含经验,比如“异常处理要合理”“命名要有意义”——这类描述在人的理解里没问题,但在模型眼里没有可操作性。AI 需要的是条件、行为、反例结构清晰的指令。
3.2 把规范转写成 AI 可执行的语言,一个可复用的模板
把规范转写成一个“约束层”文件,是我在三年的 AI 辅助编码实践中找到的最稳定方案。约束层的写法与普通文档不同,每条规范写成“当 X 场景时,必须做 Y,不得做 Z”的结构,并且附上正反例。
下面是一份我经常用来做示范的约束片段:
错误处理规范: - 当从外部接口读取数据时,必须对超时和连接异常做重试,不得直接向上抛。 - 业务异常必须定义专属异常类型,不得直接抛通用 Exception。 - 所有返回给用户的消息,不得包含数据库字段名或 SQL 片段。 命名规范: - 出参对象统一使用 DTO 后缀,入参对象使用 Command 后缀。 - 布尔变量必须使用 is/has/can 开头,不得出现 flag、status 这类歧义名。 禁止模式(项目里已经否决过的写法): - 禁止在服务层直接操作数据库事务,统一走仓储接口。 - 禁止用 try-except 吞异常后只写 log 不处理。写完之后,最核心的动作是:把这份约束层和语境文件一起放进每次对话的开头。这样 AI 在生成代码之前就已经“被校准过”,它给出的第一版代码就会带着你的团队习惯,而不是通用风格。原来“生成完代码再按风格修改”的往返过程,被压缩成了“生成即合规”,省下的时间非常可观。
3.3 约束层的维护节奏,以及防“约束肥胖”
约束层不是一次性写死就完事。我的经验是,每次代码评审发现问题,都应该追问一句:这个问题能不能转写成一条规范?然后把新的约束补进约束层文件。这样会形成一个良性闭环——评审发现的每一次问题,都会沉淀成后续所有 AI 协作的默认知识。
但这里有一个很关键的陷阱:约束层会像雪球一样越滚越大。如果写得太多太细,同一个对话里塞进去几十条规范,模型不仅记不住,还会出现“规范间冲突”和新规范覆盖老规范的现象。我一般建议先落地最常违反的 10 到 15 条,按影响程度排序,把 P0 级别的写进去就够了。碰到一次新的问题,先确认它是不是高频问题,是,才补进约束层;不是,就只在评审报告里记录一下即可。
约束层文件的维护频率不需要很高,我习惯每两周集中更新一次,每次只加最必要的那几条。规范文件的使用频率高、更新频率低,本身就是一个信号——如果你的约束层每周都要大改,说明团队对自身工程习惯还没有形成稳定共识,这时候先去对齐共识,让 AI 遵守一份朝令夕改的规范反而会制造新的混乱。
4. 范式四:多方案推演让 AI 从“给答案”变成“给选项”,先决策后编码
4.1 直接要代码,本质上是一种过早优化
我在和不少开发者的交流中发现一个共同习惯:需求刚说清楚,马上就让 AI 直接写代码。理由是“反正生成成本低,不行再改”。表面看逻辑成立,但实际运作起来,大多数返工恰恰发生在这一步——AI 生成的代码方向错了,后面改的成本远远高于重新生成的成本。
需求理解偏差才是返工的第一来源。你让 AI 写“登录状态过期处理”,它默认会用最标准的 session 超时机制;但你的项目可能在多端共存、移动端离线场景上有特殊约束,真正需要的是一套与设备指纹绑定的过期策略。方向一旦错了,后续所有修改都是在错误地基上打补丁。
解决这个问题,只需要在让 AI 写代码之前,多问一句“有哪些方案可选”。这一步在传统开发流程里相当于做技术选型评审,但在 AI 协作模式下,成本已经低到可以针对每一个中等复杂度的需求都做一次快速推演。
4.2 怎么逼出高质量的多方案对比,而不是泛泛而谈
直接问“有哪些方案”得到的通常是一篇冗长但没什么用的科普。要让 AI 给出真正有决策价值的方案对比,提示词里得限定数量、限定维度、限定与当前代码库的关联度。我常用的结构是:
针对这个需求,给出 3 个可行的实现方案。 每个方案必须包含:核心思路、接入成本、性能特征、扩展性、运维影响。 最后根据我当前代码库的情况,给出你的推荐排序,并解释为什么。用“会话超时策略”这个需求举例,AI 在一轮多方案推演里给出的对比会类似下面这样:
| 方案 | 适用规模 | 接入成本 | 强项 | 弱项 |
|---|---|---|---|---|
| 服务端集中式会话表 | 中小系统 | 低,改一个中间件即可 | 控制力强,可主动踢人 | 会话表可能成为瓶颈 |
| JWT 无状态令牌 | 分布式/高并发 | 中,需处理密钥分发 | 无状态,扩展容易 | 过期没法主动撤销 |
| 混合模式(短令牌+刷新令牌) | 多端、移动广泛 | 中高,需加刷新接口与存储 | 兼顾安全与体验 | 实现复杂度最高 |
这套表格的价值在于:它同时呈现了结果的“广度”和“背景的关联度”。AI 不能只给出三种方案的名字,还得告诉我每个方案在当前代码库里的实施成本。有了这个信息,我可以在几分钟内做出决策——选混合模式,然后才让 AI 进入实现。
注意“最后根据我当前代码库的情况”这个限定条件。如果不加这个条件,模型只会给出一个通用答案,不会真正对照项目语境去权衡。加了之后,它给出的推荐排序才具备决策参考价值。
4.3 决策结果要写回语境,不能退出对话就丢了
多方案推演做完之后,真正的收尾动作是记录。选的方案是什么、当时比较过哪些备选、为什么淘汰其他方案,这些信息要写回decisions/目录下对应的文件里。这样下次再遇到类似需求,AI 可以直接读取当年的决策背景,不会重新推演一遍已经被否决过的方案。
这个动作的收益在项目后期尤其明显。我在做一个权限系统的时候,同一个架构问题出现过三次被重新推到桌面上的情况,每次都要从头解释为什么不用状态机方案。把决策写回语境之后,第四次讨论直接变成一个加载文件的事,AI 自己就能说出“根据之前的决策记录,这个场景优先用规则表而非状态机”。
先决策后编码,并不意味着所有需求都要做严格的多方案推演。它更像一种节奏感:中等以上复杂度的需求,花三分钟让 AI 列个方案再动手;简单明确的需求,直接写代码不耽误。这个习惯一旦建立,你会发现需求理解偏差带来的返工会大幅减少,因为大部分方向性问题在编码之前就已经被识别和处理掉了。
5. 范式五:给 AI 反问权,从单向指挥到双向校验
5.1 默认模式的顺从陷阱,以及为什么 AI 很少主动唱反调
如果把前面四个范式理解为“如何更好地让 AI 干活”,那最后一个范式要解决的是另一个问题:如何让 AI 不被你的权威带偏。现实是人很容易陷入确认偏误——你先想好了一个方案,再让 AI 帮你实现,AI 默认会顺着你的思路走,因为它接收到的指令就是“实现我的想法”。它不会主动说“这个方案有两个坑”,除非你赋予它说出来的权利。
这不是模型能力问题,而是交互范式问题。在默认的“命令—响应”模式下,AI 被训练成尽量让用户满意;你的方案写得越详细,它对方案的顺从度就越高。所以很多人在项目复盘时会发现:当时觉得很有把握的观点,其实经不起推敲;AI 明明一路上都在配合,但关键风险一个都没提示。不是 AI 不懂,是它没有“被允许”讲。
协作模式与命令模式的根本区别在于:协作中的另一方有“否决权”和“质疑权”。要让 AI 发挥出第二双眼睛的价值,必须显式地告诉它——这里可以反对我。
5.2 三种显式“抬杠”方法,让 AI 当那个捅娄子的人
我在实际工作中会用到三种对抗式提示方式,分别对应不同决策阶段。
第一种是风险清单模式:“下面是我设计的方案,请你站在最挑剔的架构评审员角度,列出这个方案最可能失败的 5 个点。每个点必须给出触发场景,不要考虑我的感受。”这种模式适合在设计已经成型、准备进入实现之前。它逼着 AI 从“维护你的方案”切换到“推翻你的方案”,输出的内容往往能直接补充进需求文档。
第二种是反向辩论模式:“我给出一个结论,你扮演反对者,给出三条最强理由说明我是错的。”这种模式适合在做技术选型、接口定义时。AI 会主动找出你逻辑中隐式假设的漏洞——比如你假设了调用方一定会按约定传参,它会指出如果调用方不按约定会怎样。
第三种是灾难测试模式:“描述一下当前方案在极端场景下的崩溃过程。比如流量放大 10 倍、上游故障持续 30 分钟、数据量增长 100 倍,会先出什么问题?”这种模式用在数据模型和缓存方案设计上特别有效,它让 AI 帮你在脑海里预先跑了一遍压力测试。
这三种模式的关键都在于“预设对抗立场”。模型本身有足够的能力去找问题,但它需要你给它一个不用委婉的角色设定。
5.3 什么场景值得开启“抬杠模式”,什么时候别开
对抗式提示不是每次都要用。我的判断标准是:这个决策的影响面大不大,一旦失误能不能低成本回滚。架构设计、对外接口定义、数据模型变更,这类场景影响面大、改造成本高,值得开一次抬杠模式,花十分钟做一场“事故预演”。而像调整函数内部逻辑、改一个日志级别、新增一个配置项,这类小改动完全不需要进入对抗环节,直接实现就行。
另外要提醒一点:抬杠模式开启之前,先把方案描述清楚,否则 AI 提出的反对意见会落在错误的前提上。方案越具体,AI 的“反对”才越有价值。我在实践中发现,一上来就要求 AI 泛泛地“给点意见”基本得不到有效输出;反而是把方案的完整文字稿先写出来,再问“哪里有可能被推翻”,得到的反馈质量很高。
初步使用对抗式提示时,心里可能会有点别扭——毕竟没有人喜欢自己的方案被挑刺。但实际操作几轮后,你会发现 AI 指出的问题里有相当一部分是真实的风险点,甚至可以直接转化为需求补充。让 AI 当那个不问人情世故的“最挑剔评审”,反而是硅基协作者最独特的价值。
6. 最后分享一点我自己的实操体会
五组范式讲完,最后说说我自己的使用感受。切换协作模式,初期确实比原来“更啰嗦”:要建语境文件,要让 AI 先列方案,写完还要让它抬杠。每一步看起来都多花了几分钟。但跑完一两个完整的迭代之后,变化是能明显感知的:对新需求的理解更准了,评审会上的低级问题少了,因为方向错误导致的返工也明显下降。
我还有一个固定习惯:每周五花十来分钟翻一遍这一周的 AI 对话记录,专门找那种“来来回回解释三遍才说清楚”的片段。这类片段通常意味着语境文件里缺了某条背景,或者约束层漏了一条规范。补上它们,下一周同类沟通就能直接被省略。这个复盘动作是五个范式能够持续发挥作用的底层驱动——它保证你的语境和约束层始终跟随项目在演进,而不是写一次就丢在角落。
如果你也想尝试这种新工作方式,不用一次全部铺开。先挑一个最容易上手的范式,我建议从“每周维护一份语境文件”开始,坚持两周看看变化。与其每天都在想怎么写出更长的提示词,不如把与 AI 的这个协作关系本身,重新设计一遍。