乐于分享
好东西不私藏

拆解 Claude Code 源码:我发现了和 AI 编程助手高效对话的底层逻辑

拆解 Claude Code 源码:我发现了和 AI 编程助手高效对话的底层逻辑

分析了”泄漏“的 Claude Code 的全部源码,从 4756 个还原文件中,找到了它的系统提示词架构、工具路由规则、Agent 编排逻辑、权限决策链路。这篇文章不讲玄学,只讲源码级别的事实 —— 告诉你 Claude Code 内部到底在想什么,以及你应该怎么说话才能让它又快又准地帮你干活。

— — —

前言:为什么你需要了解 Claude Code 的”内心世界”

大多数人使用 Claude Code 的方式是这样的:打开终端,输入一段话,然后等结果。效果时好时坏,有时候精准得像资深工程师,有时候又会犯一些让人哭笑不得的低级错误。

你可能会归结为”AI 就是这样”。但事实并非如此。

Claude Code 不是一个自由发挥的 AI,它运行在一套精密的系统提示词框架中 —— 总计超过 914 行的提示词代码,定义了它的行为边界、工具选择优先级、安全约束、输出风格,甚至连什么时候该犹豫、什么时候该果断都有明确规则。

核心事实:你的对话方式和这套规则的契合度,直接决定了 Claude Code 的表现。

当你的请求”顺着”规则说,Claude Code 会像一台精密的自动化流水线一样高效运转。当你的请求和规则”逆着来”,它会犹豫、绕弯、浪费 token,甚至产生幻觉。

接下来,我会从源码级别拆解 Claude Code 的内部运作逻辑,然后一条一条告诉你:基于这些逻辑,你应该怎么说话。

— — —

第一章:Claude Code 的”大脑”长什么样 —— 四层提示词架构

在深入使用技巧之前,你需要先建立一个基础认知:Claude Code 的系统提示词不是一段简单的文字,而是一个四层叠加的架构

第一层:静态核心提示词

这是 Claude Code 的”基因”,在源码中由 7 个函数生成,内容固定不变:

  • 身份识别
  • :告诉 Claude “你是一个交互式软件工程助手”
  • 系统机制
    :解释工具权限、标签处理、Hooks 等机制
  • 编码规范
    :定义”先读后改”、”最小改动”、安全编码等原则
  • 操作约束
    :规定破坏性操作需确认、授权不可扩大
  • 工具使用
    :建立专用工具优先级(Read 替代 cat,Grep 替代 grep)
  • 语调风格
    :不用 emoji、简洁回答、引用代码要带行号
  • 输出效率
    :开门见山、一句能说完的不用三句

这 7 段内容对所有用户、所有会话都一样,系统通过全局缓存来节省 API 成本。

第二层:动态上下文

这些内容根据你的会话状态动态生成,包括:会话指导、MEMORY.md 内容、环境信息(工作目录、OS、Shell、模型名、知识截止日期)、语言设置、MCP 服务器指令等。

第三层:系统上下文

追加在提示词末尾,包含 Git 状态(当前分支、主分支、最近 5 个提交、文件修改状态)。这是会话开始时的快照,不会实时更新。

第四层:用户上下文

以 <system-reminder> 标签注入到对话消息中,包含你的 CLAUDE.md 文件内容和当前日期。

为什么要知道这些? 因为每一层的”影响力”不同。第一层是硬规则,Claude 几乎不会违背。第四层的 CLAUDE.md 则被标注为”可能相关也可能不相关”,写得不够强势的指令可能被忽略。理解了这个架构,你才能理解后面所有技巧为什么有效。

— — —

第二章:减少幻觉的第一原则 —— 让 Claude 先看再说

源码中的硬性规则

系统提示词明确要求:

"Do not propose changes to code you haven't read." "If a user asks about or wants you to modify a file, read it first."

更关键的是,Edit 工具有硬性前置条件

"You must use your Read tool at least once before editing. This tool will error if you attempt an edit without reading the file."

这不是建议,是技术层面的强制。Edit 工具内部有检查机制,没有 Read 过的文件直接编辑会报错。

你应该怎么做

给出具体的文件路径,而不是模糊描述。

差:

“帮我改一下登录功能的 bug”Claude 不知道在哪,要猜测搜索,可能找错文件
好:

“src/auth/login.ts 第42行的空指针错误帮我修一下”Claude 直接 Read 目标文件,精准定位
更好:

“看一下 src/auth/login.ts 和 src/auth/session.ts,登录时 session.user 偶尔为 undefined,帮我排查原因”给出多个相关文件,减少搜索范围

如果你不确定文件在哪,显式要求搜索:

"先搜索项目里所有和认证相关的文件,列出来让我看看,然后再分析问题"

这句话的关键是”列出来让我看看” —— 把搜索和修改拆成两步。Claude 先搜索,你确认目标文件,然后再深入。

— — —

第三章:理解”最小改动”原则 —— Claude 的刻意克制

源码中的强硬约束

这是源码中最”强硬”的一段提示词:

"Don't add features, refactor code, or make 'improvements' beyond what was asked."  "Don't add error handling for scenarios that can't happen."  "Don't create helpers or abstractions for one-time operations. Three similar lines of code is better than a premature abstraction."

核心思想:只做你要求的事,不做你没要求的事。

你应该怎么做

“帮我改善一下这个文件”

范围模糊,Claude 不知道改多少,陷入犹豫
只修 bug:

“只修复这个空指针问题,不要改动其他代码”
想要更多:

“帮我重构这个文件,提取公共逻辑,加上类型注解和错误处理”

关键认知:系统默认倾向最小改动。你想要更多,必须明确表达。否则 Claude 会刻意克制自己。

— — —

第四章:工具路由 —— 别让 Claude 走弯路

源码中的工具优先级

系统提示词中用了极少出现的 “This is CRITICAL” 来强调:

"Do NOT use Bash to run commands when a relevant dedicated tool is provided. This is CRITICAL."  - Read instead of cat/head/tail - Edit instead of sed/awk - Glob instead of find/ls - Grep instead of grep/rg

你应该怎么做

自然语言描述意图,不要指定工具。

“用 grep -r ‘TODO’ 搜索所有文件”与系统规则冲突,Claude 会犹豫
“搜索项目里所有包含 TODO 的地方”Claude 自然选择 Grep 工具,更快更准
“用 cat 看一下 package.json”与 “Read instead of cat” 规则冲突
“看一下 package.json 的内容”Claude 自动使用 Read 工具

什么时候该用 Bash? 真正的系统命令和终端操作:

✅ "运行 npm test" ✅ "执行 docker-compose up -d" ✅ "启动开发服务器" ✅ "安装 lodash 依赖"

— — —

第五章:Agent 系统 —— 让多个”分身”并行工作

Claude Code 内部有 5 种内置 Agent:

Agent
角色
关键特征
GeneralPurpose
通用任务
可读可写,全能型
Explore
代码探索
严格只读,速度快
Plan
架构设计
严格只读,先分析再规划
Verification
对抗性验证
尝试”破坏”你的实现
ClaudeCodeGuide
使用指南
查文档回答使用问题

关键数字:3 次查询是 Agent 分派阈值。预计超过 3 次搜索才值得启动 Explore Agent。

你应该怎么做

简单搜索直接问:

✅ "找到 UserService 类在哪个文件里定义的" → 一次 Glob/Grep 就能搞定

复杂研究暗示深度:

✅ "深入分析这个项目的认证架构,包括 OAuth 流程、 token 管理、中间件调用链,给我一个完整的理解"

列出独立子任务触发并行:

✅ "并行帮我做三件事:   1. 搜索所有 API 端点   2. 检查测试覆盖率   3. 分析依赖关系"

关键词是“并行”。系统规则说”make all independent tool calls in parallel”。明确列出独立任务 + 使用”并行”关键词,Claude 会同时启动多个 Agent。

— — —

第六章:CLAUDE.md 的写法决定了 Claude 的”记忆质量”

源码中的注入机制

CLAUDE.md 被包裹在 <system-reminder> 中注入,且有一句关键说明:

"IMPORTANT: this context may or may not be relevant to your tasks. You should not respond to this context unless it is highly relevant."

重要:系统告诉 Claude 你的 CLAUDE.md 不一定要遵守。如果写得像”背景信息”,Claude 可能会忽略。只有写成明确的指令,才会可靠地遵守。

两种 CLAUDE.md 的写法对比

背景信息式(容易被忽略):

这个项目是一个电商平台的后端,用 TypeScript 写的, 数据库用 PostgreSQL,ORM 用 Prisma。

指令式(可靠遵守):

# 代码规范(必须遵守)  ## TypeScript - 所有新代码必须使用 TypeScript strict mode - 禁止使用 any 类型  ## 测试 - 每个新功能必须有对应的单元测试 - 测试框架:vitest - 运行测试:npm run test  ## Git - 提交信息使用 Conventional Commits 格式 - 不要直接 push 到 main 分支

多级 CLAUDE.md 的最佳实践

~/.claude/CLAUDE.md              ← 全局偏好(语言、风格) 
项目目录/.claude/CLAUDE.md        ← 项目规范(提交到 git,团队共享) 
项目目录/CLAUDE.local.md          ← 个人笔记(不提交到 git) 
项目目录/.claude/rules/*.md       ← 细分规则文件

— — —

第七章:权限系统 —— Claude 为什么老是问你”确认吗”

源码中定义了一套完整的风险评估框架,需要确认的操作包括:

  • 破坏性操作
    :删除文件/分支、rm -rf
  • 难以撤销
    :force-push、git reset –hard
  • 对他人可见
    :push 代码、创建 PR、发消息

而且源码明确说:

"A user approving an action once does NOT mean they approve it in all contexts."

你上次同意了 push,不代表这次也同意。

减少确认的三种方法

方法一:对话中预先授权

"帮我重构 auth 模块,过程中可以自由创建、编辑、删除 src/auth/ 下的文件,不需要每次问我确认。 但不要动 .env 文件,不要 push 代码。"

方法二:CLAUDE.md 中持久授权

# CLAUDE.md 权限设置 - 可以自由修改 src/ 下的任何文件 - 可以运行 npm test 和 npm run build - 不允许修改 .env 文件 - 需要 push 时必须先问我

方法三:给破坏性操作提供充分上下文

"我确认要 git reset --hard HEAD~3, 最近三个 commit 都是错误的,没有需要保留的修改"

— — —

第八章:Skill 系统 —— 一键触发标准化流程

源码中 Skill 的触发被定义为 BLOCKING REQUIREMENT(阻断性需求)—— 匹配到 Skill 后必须先执行,优先于任何其他响应。

内置 Skill 速查表

命令
用途
/commit
标准化 Git 提交
/review
代码审查
/simplify
代码简化和质量检查
/debug
调试诊断
/init
初始化 CLAUDE.md
/batch
批量并行处理

自定义 Skill —— 在 .claude/skills/deploy/SKILL.md 创建:

--- name: "部署到测试环境" description: "构建并部署" allowed-tools:   - "Bash(npm:*)"   - "Bash(docker:*)" --- 1. 运行 npm run build,确认构建成功 2. 运行 npm run test,确认测试通过 3. 执行 docker build -t myapp:latest . 4. 报告部署结果

然后只需输入 /deploy 即可一键执行。

— — —

第九章:Hooks —— 让质量检查自动化

系统提示词说:“Treat feedback from hooks as coming from the user.” Hook 的反馈被当作你的指令处理。

在 settings.json 中配置:

{   "hooks": {     "PostToolUse": [       {         "if": "Write|Edit",         "command": "npx prettier --write \"$CLAUDE_FILE_PATH\""       }     ],     "Stop": [       {         "command": "npm run lint -- --quiet"       }     ]   } }

效果:每次文件修改自动格式化,每次对话结束自动 lint。Claude 不会”忘记”检查 —— 即使它觉得代码没问题,Hook 也会自动运行并反馈。

— — —

第十章:减少幻觉的 5 个高级策略

策略一:涉及外部资源时自己提供链接

系统规则说 “NEVER generate or guess URLs”,但对 API、库方法名可能仍会猜测。

“帮我集成 Stripe 支付”Claude 可能用过时的 API
“帮我集成 Stripe,参考这个文档:https://docs.stripe.com/api/charges”基于真实文档工作

策略二:超出知识截止日期的技术必须提供文档

系统注入了知识截止日期(如 “May 2025″)。之后发布的技术更新,Claude 不一定知道。

策略三:要求看到实际输出

✅ "运行 npm test,把完整的测试输出贴给我看,不要总结" ✅ "编译一下,把所有 warning 和 error 都给我看"

策略四:主动要求对抗性验证

✅ "实现完成后,帮我验证:运行测试、试边界输入 (空值、超大值、特殊字符)、检查错误处理"

策略五:分离搜索和修改

第1步:"搜索所有处理用户输入的地方,列出文件路径和行号" → 你检查结果  第2步:"看一下这几个文件的具体实现" → 你确认理解正确  第3步:"基于你看到的代码,给所有用户输入加上 XSS 防护" → 基于真实代码修改

— — —

第十一章:对话节奏 —— 不同任务不同节奏

简单任务 —— 一句话直接搞定

"把 getName 改成 getFullName" "/commit" "删除 src/legacy/ 目录"

中等任务 —— 目标 + 范围 + 约束

"目标:给 src/api/routes.ts 加一个 GET /api/health 端点 范围:只改 routes.ts 和对应的测试 约束:返回 { status: 'ok', uptime: 进程运行时间 },   响应格式和其他端点保持一致"

复杂任务 —— 分阶段进行

阶段1(研究):"分析支付模块架构,给我完整报告"     ↓ 你审查分析结果 阶段2(规划):"制定 Stripe V2→V3 迁移计划"     ↓ 你审查并反馈 阶段3(实施):"按计划第一阶段开始实施"     ↓ 阶段4(验证):"运行所有支付相关测试"

为什么分阶段? 因为系统内部的 Coordinator 模式的工作流就是「研究 → 合成 → 实现 → 验证」。你手动分阶段,正好匹配 Claude Code 最优的内部处理流程。

— — —

第十二章:必须避免的 12 个反模式

反模式
为什么不好
正确做法
“帮我改善代码”
范围模糊
明确说改什么
“用 cat 看文件”
与工具规则冲突
“读一下这个文件”
不给文件路径
浪费搜索 token
给出具体路径
连续问”对吗”
与简洁规则冲突
一次说清楚
要求解释每一步
与输出效率冲突
做完后再问
“帮我查 bug”
范围太大易幻觉
指定函数和场景
忽略错误继续
系统要求先诊断
“先分析原因”
不提供外部文档
可能编造 API
给出文档链接
改完不验证
可能有回归
“跑一下测试”
新技术不给参考
超出知识截止
提供文档或示例
对抗权限确认
增加摩擦
CLAUDE.md 设置授权
重复说同样的话
浪费每次对话
写进 CLAUDE.md

— — —

总结:和 Claude Code “同频”的四条核心法则

法则一:具体胜于模糊

系统的每一层都在追求确定性。给路径比给描述好,给行号比给功能名好,给约束列表比说”改善一下”好。

法则二:顺势而为,不逆规则

系统说”先读后改”,你就先让它读。系统说”最小改动”,想要更多就明确说。每一次对抗都会消耗额外的处理成本。

法则三:分层控制,持久规则写进配置

一次性指令 → 对话中说项目规则 → CLAUDE.md自动化检查 → Hooks重复流程 → Skill全局偏好 → ~/.claude/CLAUDE.md

法则四:验证驱动,不要盲目信任

改完代码要跑测试。看到”已完成”要看实际输出。涉及外部 API 要验证地址。信任但验证 —— 这是和所有 AI 工具合作的核心原则。

— — —

Claude Code 不是一个黑盒。它的每一个行为都有源码级别的解释。理解了它的系统提示词架构,你就理解了它的”思维模式”。

你不需要记住这篇文章的每一个细节。记住核心的四条法则就够了:具体、顺势、分层、验证

然后在实际使用中,慢慢感受什么样的表述能让 Claude Code 发挥最好的效果。你会逐渐建立起一种直觉 —— 一种和 AI 编程助手”同频”的直觉。

这种直觉,会让你的编程效率进入一个全新的维度。

— END —

本文基于 claude-code-sourcemap 项目(Claude Code v2.1.88 源码还原)分析完成