聊天模型和编程智能体是两种不同的工具
这两者很容易被混为一谈,值得先说清楚。智能体式编程工具运行在你的编辑器或终端里,会读取你的代码仓库并写入文件。而聊天工作区是你思考的地方:在这里粘贴报错堆栈、争论某种方案、审查一份diff、弄懂一个从未用过的库,或者起草设计文档。
大多数开发者最终会两者都用,而在聊天这一侧,模型的选择才最关键,因为你看的是推理过程,而不是最终的diff。也正是在这里,为了对比三个模型而分别订阅三个产品,就显得没有必要了。
| 你在做什么 | 模型倾向 | 说明 |
|---|---|---|
| 复杂推理:并发、微妙的竞态、架构取舍 | Claude和GPT差异明显 | 两个都问一遍。这正是多问一个能带来真正价值的场景 |
| 在常见场景下的实现速度 | GPT | 快、地道,擅长样板代码和格式转换 |
| 阅读大型陌生代码库或长篇规格文档 | Gemini | 上下文窗口最大,能一次装下更多系统内容 |
| 解释一个错误或一个概念 | 哪种讲法更容易理解就用哪个 | 不同模型的讲法不同,这正是意义所在 |
| 严格的结构化输出:配置、JSON、模式(schema) | GPT | 最能严格遵守指定格式 |
比粘贴报错堆栈更有效的调试提示词
把报错粘贴过去问哪里错了,得到的只是一个猜测。这个猜测通常是对的,但一旦猜错,你就会浪费二十分钟去追一个看似合理、实际上根本不存在的修复方案。下面这些提示词能改变答案的结构。
提示词:先给假设,再给修复方案
这是报错信息、代码,以及我已经排除的可能性。先不要给我修复方案。列出四个最可能的原因,按概率排序,并针对每一个给出成本最低、能确认或排除它的检查方法。报错信息:[paste]。代码:[paste]。已排除:[list]。
提示词:偶尔才出现的bug
这个问题会间歇性地失败,大概[frequency]的频率,在[conditions]条件下发生。这是相关代码,以及我了解的环境情况。请列出可能导致这种具体症状的间歇性故障类别(时序问题、执行顺序、资源耗尽、外部依赖、多次运行之间的状态泄漏、时钟或时区问题、缓存问题)。针对每一类,说明我提供的信息里哪些证据支持或反驳它,以及我应该记录什么日志来区分它们。
提示词:在采纳修复方案前先解释清楚
解释一下这个修复方案为什么有效,它没有解决什么问题,以及它可能带来什么新问题。如果根本原因其实在别处,而这只是一个表面症状的修补,请直接说明。
最后这条提示词能抓住AI辅助中代价最高的一类问题:让症状消失,却让真正的缺陷继续留在代码库里。
对同一个问题用两个模型交叉验证,这不是噱头
答案显而易见的时候,一个模型就够了。这个技巧真正发挥价值的地方,是那些你自己也拿不准的问题,而它之所以有效,是因为不同模型的失败方式各不相同,而不是彼此雷同。
真正有用的做法不是同时问两个模型,然后挑一个自己喜欢的答案,而是先问一个模型,再把它的答案交给另一个模型:
提示词:对一个答案进行对抗式审查
另一位工程师针对这个问题提出了这个解决方案。请找出其中的问题:边界情况下的正确性、并发问题、错误处理、在[scale]规模下的性能,或者是否忽略了一种更简单的做法。如果这个方案其实是稳妥的,请直接说明,不要为了挑刺而硬找问题。问题:[paste]。提出的方案:[paste]。
结果只有两种,而且都有用。要么第二个模型找出了一个真实的漏洞,你在合并代码前就能知道;要么它表示认同,而这种认同是真正有说服力的证据,因为它本来完全有动机唱反调。相比之下,反复追问同一个模型,往往只会得到它对自己观点的重复认同。
同样的做法也适用于设计决策:
提示词:为对立方案辩护
在[context and constraints]的情况下,我选择了[approach A]而不是[approach B]。请为B给出最有力的论据。要让B成为正确的选择,我们的约束条件需要满足什么?其中有哪些在我们的实际情况中是成立的?
Whizi的并排对比功能正是为此而生,具体做法记录在并排对比模型这篇文档里。
代码审查与阅读陌生代码
提示词:像一位挑剔的审查者那样审查diff
审查这份diff。按以下顺序分类:正确性问题、安全问题、未处理的失败情形、竞态条件,最后才是风格问题。每个发现请给出严重程度、具体的行号,以及为什么这个问题在这里很重要,而不是泛泛而谈。不要评论格式问题。如果这份diff没有问题,请直接说明。背景:这个代码库使用[stack and conventions]。Diff:[paste]。
提示词:读懂你刚接手的代码库
这是主要的源代码文件。请给出:入口点、从请求到响应的数据流、被共享的状态以及它在哪里被修改、外部依赖以及每个依赖不可用时会发生什么,以及根据复杂度和耦合程度,最可能存在bug的三个部分。请明确说明你根据我给的内容无法判断的地方。
最后那条指令的作用比看上去要大。模型会很乐意根据文件名去推测并描述一个你根本没粘贴的文件的行为。强制要求它明确列出未知项,能告诉你接下来该去读哪些代码。
提示词:写出你没想到的测试用例
为这个函数写测试用例,重点关注我可能没考虑到的输入:边界值、空值和null、unicode字符、超大数值、并发调用,以及实现中的任何隐含假设。每个测试请说明它在验证哪个假设。函数:[paste]。
真正浪费时间的失败模式
编造出来的API。 模型会很自信地写出不存在的方法名、参数和配置键,尤其是对最近改动过或不太常见的库。它的签名看起来完全正确。在基于任何陌生内容继续开发之前,先查一下真实的文档。
信心十足却错误的修复。 语气里没有任何信号能区分对错。一个能真正解决问题的修复方案,和一个会引入新问题的修复方案,说出来的语气一模一样。永远要问一句,这个改动可能会破坏什么。
过时的写法。 训练数据偏向某个框架被大量讨论的那个版本,而那往往是上一个主要版本。如果答案给人一种好像是几年前的东西的感觉,那很可能就是。在提示词里说明你用的是哪个版本。
悄悄扩大的改动范围。 你要的是一个修复,得到的却常常是一次重构。加上一句尽量少改动,并列出你改的每一行以及原因,可以让diff保持在可审查的范围内。
安全表演。 模型能说出你代码里存在哪些漏洞类别,这对第一轮排查确实有用,但它并不是一次真正的安全审计。它不了解你的威胁模型、你的部署方式,也不了解你的数据敏感程度。
它在你现有工具链中处于什么位置
它不会取代你的编辑器集成,也不会取代你的智能体式编程工具。它取代的是你原本用来对比答案的三个浏览器标签页,以及为了同时打开这些标签页而需要订阅的另外两个产品。
大多数开发者最终采用的实用方案是:一个默认模型用来处理日常问题,第二个模型在第一个答案不够有说服力时切换过去,而当需要一次性把大量代码或长篇规格文档丢给模型时,就用Gemini。所有这些都在同一个对话里完成,这样你已经建立起来的上下文能随着切换一起延续,而不用重新粘贴一遍。
想了解更多,可以参考AI辅助编程指南、面向编程场景的替代产品对比,以及Claude编程提示词合集。在Whizi里具体如何搭建这套流程,详见用多个模型编写和调试代码。
- 在要求修复方案之前,先让模型给出按概率排序的假设和成本最低的验证方法
- 把第一个模型的答案交给第二个模型,让它找出其中的漏洞
- 始终问一句,提出的修复方案可能会破坏什么,以及它是否只是治标不治本
- 在提示词里说明你用的语言、框架和版本,避免得到过时的写法
- 在基于任何陌生API继续开发之前,先对照真实文档核实
- 加上尽量少改动,并列出每一处改动,让diff保持可审查
- 当问题涉及的代码量超出常规提示词容量时,使用大上下文模型
常见问题
为什么不干脆只用一个编程模型?
对日常工作来说,一个模型就够了。它的价值体现在那些你确实拿不准的问题上,因为不同模型的失败点各不相同,而不是集中在同一处。把模型A提出的解决方案交给模型B,请它找出其中的缺陷,要么能在合并代码前发现真正的问题,要么能给你一个有分量的确认。反复追问同一个模型,得到的大多只是它对自己观点的重复认同。
这能替代智能体式编程工具吗?
不能,它们解决的是不同的问题。智能体运行在你的代码仓库里,负责编辑文件。而聊天工作区是你思考的地方:报错堆栈、设计方案的争论、diff审查、理解陌生的库,以及起草设计文档。大多数开发者两者都会用,而在聊天这一侧,模型的选择更重要,因为你评估的是推理过程,而不是最终产出的diff。
哪个模型最适合写代码?
这取决于具体任务,这是最诚实的答案,也是这篇文章存在的原因。GPT在常见的实现类工作上往往更快、更地道。Claude在细腻的推理、陌生架构,以及解释某个行为背后原因方面往往更强。当问题需要一次性处理大量代码或规格文档时,Gemini更占优势。花一周时间用自己真实的问题对比它们,比看任何跑分都更管用。
我可以粘贴专有代码吗?
Whizi不会用你的对话内容进行训练,每个提供商的数据政策在你启用该模型之前都可以查阅。你所在公司的政策通常才是真正的约束条件,而且各家差异很大,所以务必先确认。如果存在限制,一个实用的做法是把问题重现在一个最小示例里,保留结构、去掉业务逻辑,这样做往往还能得到更好的答案。
怎样才能让它别把所有东西都重写一遍?
明确指示它:尽量少改动,保留现有的结构和命名,并列出你改动的每一行以及一句话的理由。不受约束的重构,是AI建议变得难以审查的主要原因,而限定diff的范围,决定了这次改动是你能理清逻辑去审查的,还是要从头重新读一遍的。