Claude Code 核心机制与扩展
这一页深入 Claude Code 的运行时机制:agentic loop 怎么转、上下文怎么压缩、token 预算怎么管、权限怎么把关,以及 MCP/Hooks/Skills/子 Agent 四大扩展。功能见 功能总览,架构见 代码架构。
一、Agentic Loop:自主循环的核心
┌──────────────────────────────────────────────────┐
│ 1. 组织上下文(system prompt + CLAUDE.md + 历史 + │
│ 工具定义 + 当前消息) │
│ 2. 流式调用模型 API │
│ 3. 解析返回:是文本回复,还是工具调用? │
│ 4. 若是工具调用 → 权限检查 → 执行(可并行多个) │
│ 5. 工具结果作为新消息回喂 → 回到 1 │
│ 6. 模型认为任务完成 → 输出最终回复,结束 │
└──────────────────────────────────────────────────┘要点:
- 每一步都是模型自主决策(用哪个工具、什么参数、是否继续)。
- 并行工具执行:模型一次可发起多个独立工具调用,框架并发执行再一起回传,省往返。
- 错误恢复:工具失败时,把错误信息作为结果回喂,模型通常能自我修正重试。
- 通用原理对照 编程 Agent 底层架构与机制 与 Agent 基础。
二、上下文压缩(Compaction):长任务不崩的关键
上下文窗口有限(如 200K token),但一个大任务可能跑几十轮、读很多文件,迟早塞满。Claude Code 用分层压缩应对(社区分析):
| 层 | 机制 |
|---|---|
| 会话记忆 | 把关键信息沉淀到外部(项目记忆/笔记),不全靠窗口 |
| API 摘要 | 上下文逼近上限时,把历史总结成摘要替换原文,释放空间 |
| 局部微压缩(MicroCompact) | 对单个大块(如超长工具输出)就地压缩/截断 |
核心思想就是 上下文工程 的 Compress:保留目标、关键决策、当前状态,丢弃冗余的中间过程,让长任务「续航」。
三、Token 预算管理
编排层动态计算 token 预算:
- 实时估算「系统提示 + 记忆 + 历史 + 工具定义 + 待生成」占用,预留输出空间;
- 超阈值则触发截断(裁剪旧历史)或自动压缩;
- 大工具输出做截断/分页,避免一次吃爆窗口。
这解释了为什么 Claude Code 能在有限窗口里干完远超窗口容量的任务——靠的不是更大窗口,而是更聪明的上下文管理。
四、System Prompt 与项目记忆
- System Prompt 动态组装:按需拼装角色、工具说明、环境信息、安全规则等「段落」,并利用 prompt caching 让稳定前缀命中缓存、省成本(前缀稳定的工程意义见 上下文工程)。
- CLAUDE.md 合并:用户级 + 项目级 + 子目录级记忆文件合并注入,让 Claude 持续「记得」项目约定。
- MEMORY.md 索引:文件型持久记忆的索引,跨会话召回(文件型记忆思路见 Agent 记忆)。
五、权限模型:安全的核心
Agent 能跑任意命令,所以权限是第一公民。Claude Code 用 Allow / Ask / Deny 三级 + 多层规则优先级:
某工具调用(如 Bash: rm -rf …)
↓ 按优先级匹配规则(企业策略 > 用户配置 > 项目配置 > 默认 …)
├─ Allow → 直接执行
├─ Ask → 暂停,询问用户确认
└─ Deny → 拒绝执行配套机制:
- Plan Mode(计划模式):「先看后做」——先只读调研、给方案,你批准后才允许改动,切换权限上下文。
- Auto Mode:用分类器判断操作风险,低风险自动放行、高风险才问,减少打断。
- 沙箱:第二层防线,限制可访问范围、拦截危险操作。
- 间接 Prompt 注入防护:工具读到的外部内容(代码/网页/issue)是不可信数据,不能当指令执行——这是编程 Agent 最大的安全威胁(见 大模型安全)。
六、四大扩展机制
| 扩展 | 是什么 | 用途 |
|---|---|---|
| MCP | 标准协议接入外部工具/数据 | 连数据库、API、第三方系统(见 MCP) |
| Hooks | 工具生命周期钩子(前/后等多种事件) | 拦截、校验、通知,实现确定性工程约束 |
| Skills | 「提示即能力」的可复用技能包 | 带 Frontmatter 描述、按需加载,扩展专长 |
| Slash Commands | 自定义 / 命令 | 封装常用工作流 |
设计哲学:Hooks 提供确定性(代码级拦截)、Skills/MCP 提供能力扩展——把「不可控的模型」用「可控的工程机制」框起来。Hooks 的「确定性」尤其关键:它不依赖模型「记得」遵守,而是用代码强制执行(如「提交前必须跑 lint」)。
七、子 Agent 与多 Agent
- 子 Agent(Task 工具):主 Agent 派生子 Agent 处理子任务,子 Agent 有独立上下文,只把结论回传——避免主上下文被中间过程污染(Isolate)。
- 协调者/蜂群模式:更复杂的多 Agent 协作(一个协调者派发、多个 worker 并行),配合 Mailbox 通信、Git worktree 隔离各自工作区。多 Agent 范式见 多 Agent 与进阶范式。
高频追问
Q:Claude Code 怎么在 200K 窗口里完成远超窗口的大任务? 靠上下文管理而非更大窗口:按需读取(不预载整库)、token 预算动态计算、分层压缩(历史摘要化、大输出截断)、外部项目记忆、子 Agent 隔离上下文。核心是「窗口里只保留当前步骤的最小充分信息」。
Q:上下文压缩(compaction)会丢信息吗?怎么尽量不丢关键的? 会——压缩是有损的。策略是优先保留「目标、关键决策、当前状态、未完成事项」,丢弃冗余中间过程;关键约束尽量沉淀到外部记忆文件(不依赖易失的对话历史)。这也是为什么重要约定要写进 CLAUDE.md 而非只在对话里说。
Q:Hooks 和 Skills/MCP 有什么本质区别? Hooks 是确定性机制——用代码在工具生命周期点强制拦截/校验(如「写文件前必须通过格式检查」),不依赖模型自觉;Skills/MCP 是能力扩展——给模型更多专长(提示包)或更多工具(外部系统)。一个管「强制约束」,一个管「扩展能力」。
Q:权限的多层优先级是怎么回事? 同一个操作可能被多处规则匹配(企业策略、用户全局配置、项目配置、默认规则等),按优先级裁决最终是 Allow/Ask/Deny。企业/安全策略通常最高优先级,保证组织级管控不被项目级配置绕过。
Q:为什么子 Agent 要用独立上下文? 隔离。一个子任务(如「调研整个 auth 模块」)会产生大量中间内容,如果都灌进主上下文会迅速塞满、还引入噪声干扰主线。让子 Agent 在自己的上下文里折腾、只回传结论,主 Agent 的上下文保持干净聚焦——这是上下文工程的 Isolate 操作。
Q:Plan Mode 解决什么问题? 防止 Agent「一上来就乱改」。复杂或高风险任务先进入只读的计划模式,让 Claude 调研并给出方案,你审阅批准后才切换到可写权限执行。把「不可逆的改动」前面加了一道「人类确认」闸门,是高风险场景的安全实践。