国外大神逆向了 Claude Code,发现它好用的秘密
我花了几个月研究AI Agent,最后发现自己从一开始就在错误的方向上使力。一个月前,我注意到同样的模型,Claude Code表现得像一位熟练的助手,而我自己的Agent却像新手。我试过很多模仿它的开源项目,效果总差一点。一度以为是因为人家用了私有模型,有黑科技。
后来读到一篇逆向分析文章,才发现自己的思路完全是反的。我花了三天时间,用TypeScript项目验证这些发现——两万行代码,五个典型任务,每个跑三次取平均。结果让我印象深刻。
下面是几个我踩过的坑,以及学到的东西。
第一个反常识:一半以上的任务,交给了小模型
我以前信奉“大力出奇迹”,什么任务都用Sonnet甚至Opus,觉得顶配才可靠。逆向分析却显示,Claude Code超过一半的调用用的是小模型Haiku。
我不信,算了算自己的账单,发现费用高很多。我做了个盲测:让Sonnet和Haiku分别读取一个3000行的文件并总结函数列表,同事分不出哪个回答更好。Haiku耗时只有Sonnet的60%,费用只有20%。
读大文件、解析网页、处理Git历史、总结长上下文……这些高频任务,Haiku都够用。甚至界面里的“正在处理中”提示也是Haiku生成的。
所以别迷信最贵的模型。先把任务分类,高频的简单活交给小模型就够了,省下的钱能做很多事。
第二个反常识:它根本不依赖模型的记忆
很多Agent在长对话中容易失忆,要么截断上下文,要么简单压缩。调试涉及十几个文件的bug时,后半段会忘记前面改过什么。
Claude Code的做法是把文件系统当外部存储。观察结果直接写入文件,上下文只保留引用。在一个需要多次修改文件的调试过程中,普通Agent后半段开始打转,但Claude Code使用TodoWrite工具记录每步操作,进度一目了然。
另外,它处理连续对话时从最新的assistant回复开始反向处理,而不是从头扫描,高频调用下性能提升明显。
方法朴素但有效:不让模型硬记,用好外部存储。
第三个反常识:提示词工程不是写作文,是搭脚手架
我之前的Prompt很简单:“你是一个编程助手,按照要求编写代码”。而Claude Code的System Prompt有2800 tokens,工具描述9400 tokens,每次请求还附带一个claude.md文件,总共超过一万tokens,没有一句废话。
最有用的是claude.md,放在项目根目录下,团队可以一起维护。它记录代码里没有的隐性知识:不能修改的目录、必须用的UI库、测试命令、代码风格等。
我在自己的项目里加了一个claude.md后,Agent不再动node_modules,不会擅自用lodash替代原生API,commit message也符合我的团队规范。而且它每次请求都带上这个文件,不会聊一次就忘。
这种长期记忆的实现方式很直接:把要求写进提示词,每次重复。
第四个反常识:不给模型原始Shell,只给过滤后的投影
Claude Code不给模型原始shell,而是设计了各种工具:ReadFile只读一定行数,Grep只返回匹配行,LS只显示一层列表。每个工具都是文件系统的一个过滤切片。
每次工具返回后,系统会注入一条提示,更新待办列表和下一步操作。这帮助模型在长对话中保持专注。
我对比过,如果给Agent完整的shell,它容易在无关文件上浪费精力。使用这种有限工具后行为更聚焦。
所以设计Agent时,不要直接暴露整个文件系统,根据当前任务只提供所需的信息切片。
第五个反常识:多Agent必须禁止递归
Claude Code有子Agent(General-Purpose Subagent),但设计上禁止子Agent再启动新Agent——工具列表里没有“Agent”工具。子Agent的System Prompt与主Agent不同,它只输出简明总结,因为它的输出是对主Agent汇报,不是面向用户。
我尝试在子Agent中再次启动子Agent,被直接拒绝。一些开源框架没有这个限制,结果容易出现无限递归,要么超时要么烧光费用。
目前LLM不擅长委派其他Agent,开放递归是灾难。多Agent架构必须加上递归限制。
第六个反常识:安全检查要彻底
Claude Code的Bash安全检查包括23条规则,覆盖命令封禁、Unicode零宽字符注入、空字节注入等,还有HackerOne发现的malformed token绕过。
我故意在代码里塞了一个看起来无害的反引号注入,被它拦住了。我常用的Agent框架通常没有这种级别的防护。
如果让Agent执行shell,安全配置不能省。
从我的测试结果看,差别很明显:
任务完成率从65%提升到95%(Prompt明确要求“必须持续直到问题解决”),平均每次任务费用从0.32美元降到0.11美元(因为小模型分流)。长对话中记忆混淆从频繁变为偶尔,误操作概率从30%降到接近零。安全防护从无到有,递归失控不再发生。
总结一下我学到的东西:
- 别迷信最强模型。把任务分类,高频杂活交给小模型。
- 使用类似claude.md的机制,把长期偏好写死,而不是每次靠模型自己悟。
- 工具设计成过滤投影,只提供当前任务所需的信息。
- 安全配置不能少,特别是涉及shell执行时。
- 多Agent架构必须限制递归。
Claude Code真正值得学的不是它做了什么,而是它选择不做什么——不做复杂编排(单线程while循环就够了),不做向量搜索(regex就行),不塞太多上下文(用外部文件代替)。这种设计的克制,才是它好用的原因。
如果你在做Agent,可以仔细想想这些决策原则,它们比抄代码更重要。当你的Agent不再依赖全能终端、不再无条件信任最强模型、不再允许无限制递归时,它的行为会明显改善。
真正的聪明,是知道不做什么。
读者评论 5