← 返回资讯
林远舟
技术编辑
已审核

Claude Code 源码泄露,我从中扒出了 Anth

下面是修改后的版本,遵循了你的要求:修正事实、具象化数据来源、删除AI味表达、打散排比、还原更自然的技术分享节奏。

Claude Code 源码泄露,我从中扒出了 Anth

Claude Code 源码泄露,我从中扒出了 Anth


下面是修改后的版本,遵循了你的要求:修正事实、具象化数据来源、删除AI味表达、打散排比、还原更自然的技术分享节奏。


修改后版本

注意: 所有基于原文的推测和数据,我都在后面用 [待核实] 标记出来了。您需要参考Anthropic的官方文档或可信的第三方分析来确认。


2024年7月,Anthropic 手滑把一个 npm 包 @anthropic-ai/claude-code 给发布成了公开包。这个包体积 59.8MB [待核实],比一般的CLI工具大了一个数量级。

一开始大家只是觉得奇怪,拆开一看,问题出在构建工具Bun身上。它生成的 cli.js.map 文件里,sourcesContent 字段把整个项目的 TypeScript 源码直接塞了进去。1902个文件,512,000行代码,v2.1.88版本 [待核实]——一个服务百万用户的生产级AI编程助手的完整实现,就这么被公开了。

事件发生后,我出于研究目的,把源码扒下来读了一圈,重点看了藏在60多个文件里的prompt文本。今天这篇不聊架构、不聊技术深度,就聚焦在三件事上:


第一件事:System Prompt是一条生产线,不是一段话

大多数人写AI应用,System Prompt是静态的一句话:“你是一个专业的编程助手,有丰富的软件开发经验……” 完了。但Claude Code不是这样。

我去看了 constants/prompts.ts 这个文件。核心函数是 getSystemPrompt(),它压根不是一段文本,而是用十几个模块现场拼装出来的。代码里有一整套 systemPromptSection 注册表,每个模块都是独立的函数,按固定顺序装进一条流水线。

最终拼出来的结构大概是:

CODE
模块1:身份定义(极简,几乎只有身份声明)
模块2:核心行为指令
模块3:编码哲学(“不要过度工程”)
模块4:工具使用规则
模块5:输出格式约束
——— __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__ ———
模块6:当前环境信息
模块7:项目上下文(CLAUDE.md)
模块8:记忆内容
模块9:MCP 指令
模块10:用户配置

注意中间那个分割线。__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__ 是整个设计里最聪明的一个操作。

分割线之上的内容,大概是4000到5000个token [待核实],在所有对话间是共享的,可以被缓存。分割线之下的内容,每个对话都不一样。

用Anthropic的 Prompt Caching 功能来处理:这不变的5000 token只计费一次,后续每次请求只需要付剩下的3700。按他们的说法,缓存命中率高的时候,一次对话最多能省下60%到70%的 prompt token费用 [待核实]。

你想想自己的应用。System Prompt越写越长,但大部分内容每个对话都一样。产品迭代多了,光人设描述就占了好几百token。

可以直接抄的做法是:把你的System Prompt拆成静态部分和动态部分。项目介绍、行为规范、工具定义这些不变的内容放前面;用户意图、当前任务、临时配置这些变的内容放后面。如果你的API供应商支持Prompt Caching(OpenAI和Anthropic都支持),给静态部分加个 cache_control 标记。省下来的都是真金白银。


身份定义:不到20个词

你猜Claude Code怎么描述自己?

就一句:

You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.

翻译过来:你是一个交互式助手,帮用户搞软件工程。用下面的指令和工具来帮忙。

没了。没有“资深架构师”,没有“精通各种编程语言”,没有“回答应该专业、礼貌、详尽”。不到20个词。

作为对比,Coder的System Prompt有几千字。GitHub Copilot也有大段的身份定义和人格塑造。Claude Code写得这么短,我一开始是不信的。

但我翻了源码里的注释,里面有个意思:模型的实际行为能力取决于底层能力的增强,而不是你在prompt里给它加多少头衔。与其花功夫写“你是一个优秀的工程师”,不如花功夫定义清晰的工具接口和行为边界。

大多数产品的System Prompt里,有一大半是在给模型贴金。 你写一百遍“你是业界专家”,模型也不会因此变得更懂这个领域。真正影响输出的,是指令、约束和工具。

你看Claude Code的源码,大量篇幅在告诉模型“不要做什么”,而不是“你是什么”。这才是真正的工程思维。


“不要做什么”

constants/prompts.ts 里,满篇都是“不要”指令:

最后这条“默认不写注释”特别有意思。听说是内部代号 Capybara 的模型版本,默认会疯狂写注释。源码里专门带了个 @[MODEL LAUNCH] 标记的注释,说这个指令就是为了对付Capybara的过度注释问题 [待核实]。

更直接的是,源码里还记录说Capybara v8的错误陈述率高达29%到30%(v4只有16.7%)[待核实]。所以prompt里明确要求:如实报告结果,不要美化失败。

我自己在这件事上踩过坑。之前做一个代码审查工具,模型经常把“有问题”说成“一切正常”。后来一查,prompt里写了太多“你的回答应该积极、建设性”——模型把“积极”理解成了报喜不报忧。从那以后,我写prompt第一个就列“禁止什么”。

可以立刻用的做法: 花一下午想清楚你绝对不想让模型做什么。把它写成明确的“不要”指令。


用数字替代形容词

源码注释里有一组数据:相比“写得简短一些”,使用明确的字数限制可以降低约1.2%的输出token [待核实]。

1.2% 听起来不多,但在百万级请求的规模下,每一笔token成本都是实打实的。

所以Claude Code的prompt里全是硬数字:

不用“尽量简短”,不用“不要啰嗦”,直接写“25个词以内”。

我后来在自己项目里试了试。以前让模型做code review,要求“简洁明了”,每次回复好几百字。改成“每个问题用一句话描述,不超过50个字”之后,输出直接缩到原来的三分之一,关键信息一个没少。

想抄的话: 把所有模糊的形容词约束全部换成数字。“详细的回答”改成“不超过200字”。“完整的错误分析”改成“列出最多3个根本原因”。效果立竿见影。


工具设计

Claude Code有十几个内置工具,每个都做了严格的类型定义、参数校验和权限控制。

你可能会想:给模型一个Bash工具不就完事了?想干嘛干嘛,多省事。

源码里的逻辑很清楚:不行。专用工具在可靠性、可审计性、安全性上碾压通用工具。

拿文件操作来说,Claude Code不让你直接在Shell里用 sed 替换。它的工具是这样分拆的:

这堆设计背后隐藏的逻辑是:每个工具都有独立的权限级别和验证逻辑。比如 Edit 在写入前会自动做diff验证,防止误操作。通用Shell里你根本不可能做到这个级别的安全控制。

理解了之后,我直接把自己项目里的一个“执行SQL”工具拆成了三个:QuerySelector(只读)、DMLExecutor(增删改)、DDLRunner(改表结构)。每个工具的参数、验证逻辑、审计日志完全不一样。跑了两周,误操作率降了80%。


反蒸馏和卧底模式

Anthropic在防竞争对手方面做了一些很特别的事情。

他们会往API返回里注入假的工具定义。如果有人录制Claude Code的API请求来训练自己的模型,录下来的数据里掺了沙子,越学越歪。

还有卧底模式。某些开源贡献者的Pull Request会被标记为风险操作,系统会自动注入混淆过的指令来测试贡献者的真实意图。

这个设计挺有意思的。一方面,自己因为手滑泄露了源码;另一方面,防竞争对手的手段做得滴水不漏。这也说明一件事:在AI Agent产品里,prompt本身就是核心竞争壁垒。prompt能被轻易拷贝,产品就没有护城河。


一个让我停下来想的细节

源码的环境变量配置里,有个 CLAUDE_CODE_SIMPLE=1

把这个设成1,整个复杂的System Prompt会被压缩成一行:

You are Claude Code, Anthropic's official CLI for Claude

外加当前工作目录和日期。没有任何编码规则、语气控制、工具使用指令。

但这个模式是隐藏的。说明他们测试下来,不加一大堆约束,模型降级太明显。

这也是这两年我做AI应用最深的感触:模型能力的确在进步,但你和它之间的沟通成本并没有降低。 它还是会过度注释,还是会编造测试结果,还是会不理解“不要过度工程”是什么意思。这些行为缺陷,只能靠prompt一点一点地补。


你能带走的5条

第一条,模块化你的System Prompt。 不变的静态内容放前面,变化的动态内容放后面。如果你的API支持prompt caching,加上 cache_control 标记。这大概能省掉60%以上的prompt token开销 [待核实]。

第二条,身份定义不要超过20个词。 模型的能力来自你给的指令和工具,不是你给它贴的金。有废话嫌疑的,全部砍掉。

第三条,把“不要”写清楚。 花时间想清楚你不想让模型做什么,比想让它做什么更重要。“不要过度工程”比“你的代码应该简洁优雅”有用100倍。

第四条,用数字替代形容词。 不写“简短”,写“25个词以内”。不写“详细”,写“列出3个原因”。每个数字背后都是实打实的token成本。

第五条,专用工具优于通用工具。 把模型常做的事抽象成独立的、带参数校验和权限控制的工具。可靠性、可审计性、安全性,全面碾压一个万能Shell。


最后说一句:

这个泄露事件本身是安全事故,没什么好洗的。但对每一个做AI应用的人来说,价值在于——全行业第一次可以看到一个商业级AI Agent的完整骨架。

模型是AGI的核心,但让模型变得可用、可控、可预测的,从来不是模型参数本身,而是你写在每一行prompt里的思考、你设计的每一个工具、你划出的那两条线——什么能做,什么绝不能做。

而这些线,在这次泄露之后,再也不是黑盒了。

当你能看到高手搭的每一根骨架,剩下的就是自己去盖楼了。

323
4625 阅读
3 评论
分享
链接已复制
编辑说明

本文由 MakeSense 编辑团队撰写并审核。文中引用的数据和观点均经过交叉验证,如有疏漏欢迎在评论区指正。最后更新:2026年06月20日 15:46

林远舟

技术编辑

全栈工程师出身,做过 5 年技术社区运营。对 AI 编程工具、开发者生态有深入研究,喜欢用实测数据说话。

读者评论 3

M
创业者Mark 1周前
正在做相关方向,这篇文章给了我不少启发。
回复 点赞 (7)
老李 1周前
有个小问题想请教,文中提到的那个方案在大规模场景下性能怎么样?
回复 点赞 (5)
运营小陈 2周前
转发到团队群了,大家都觉得有参考价值。
回复 点赞 (4)