主题
01 - Claude Code 整体架构
系统架构图
┌──────────────────────────────────────────────────────────────────┐
│ Claude Code 架构 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 用户交互层 │ │
│ │ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ │
│ │ │ CLI │ │ VS Code │ │ JetBrains │ │ │
│ │ │ Terminal│ │ Extension│ │ Extension │ │ │
│ │ └────┬────┘ └─────┬────┘ └─────┬─────┘ │ │
│ │ └──────────────┼────────────┘ │ │
│ └──────────────────────┼──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────────────┐ │
│ │ 核心引擎层 │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────┐ │ │
│ │ │ Agent Loop (核心!) │ │ │
│ │ │ │ │ │
│ │ │ ┌──────────┐ │ │ │
│ │ │ │ System │ 系统提示词 │ │ │
│ │ │ │ Prompt │ → 定义身份、规则、行为约束 │ │ │
│ │ │ └──────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ │ │ │
│ │ │ │ Messages │───▶│ Claude │───▶│ Response │ │ │ │
│ │ │ │ 历史管理 │ │ API │ │ 解析 │ │ │ │
│ │ │ └──────────┘ └──────────┘ └─────┬──────┘ │ │ │
│ │ │ ▲ │ │ │ │
│ │ │ │ ┌─────────────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ ┌─────▼─────┐ │ │ │
│ │ │ │ │ 文本回答? │──Yes──▶ 输出给用户 │ │ │
│ │ │ │ │ 工具调用? │ │ │ │
│ │ │ │ └─────┬─────┘ │ │ │
│ │ │ │ │ Tool Call │ │ │
│ │ │ │ ┌─────▼─────────┐ │ │ │
│ │ │ │ │ 权限检查 │ │ │ │
│ │ │ │ │ (Permission) │ │ │ │
│ │ │ │ └─────┬─────────┘ │ │ │
│ │ │ │ │ 允许 │ │ │
│ │ │ │ ┌─────▼─────────┐ │ │ │
│ │ │ └────│ 执行工具 │ │ │ │
│ │ │ 结果回传 │ 结果加入历史 │ │ │ │
│ │ │ └───────────────┘ │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────┐ │ │
│ │ │ Tool System (工具系统) │ │ │
│ │ │ │ │ │
│ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌───────┐ ┌───────┐│ │ │
│ │ │ │ Bash │ │ Read │ │ Edit │ │ Write │ │ Agent ││ │ │
│ │ │ │ │ │ │ │ │ │ │ │ 子代理 ││ │ │
│ │ │ └──────┘ └──────┘ └──────┘ └───────┘ └───────┘│ │ │
│ │ │ ┌──────┐ ┌──────┐ ┌────────┐ ┌──────────────┐ │ │ │
│ │ │ │WebFetch│ │Grep │ │TodoList│ │MCP 外部工具 │ │ │ │
│ │ │ └──────┘ └──────┘ └────────┘ └──────────────┘ │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 配置与持久化层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐│ │
│ │ │CLAUDE.md │ │settings │ │ Memory │ │ Hooks ││ │
│ │ │项目指令 │ │.json │ │ 记忆系统 │ │ 钩子 ││ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘│ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘Agent Loop 详解
Claude Code 的 Agent Loop 本质上就是模块四讲的 ReAct 循环
但做了大量工程增强:
┌─────────────────────────────────────────────────────────────┐
│ │
│ while (true) { │
│ │
│ // 1. 构建消息 │
│ messages = buildMessages( │
│ systemPrompt, // 万字级 System Prompt │
│ claudeMd, // CLAUDE.md 项目指令 │
│ memory, // 记忆文件内容 │
│ conversationHistory, // 对话历史 │
│ toolDefinitions // 所有可用工具的 schema │
│ ) │
│ │
│ // 2. 检查上下文长度 │
│ if (tokensUsed > threshold) { │
│ messages = compact(messages) // 压缩历史! │
│ } │
│ │
│ // 3. 调用 Claude API(流式输出) │
│ response = claude.stream(messages) │
│ │
│ // 4. 处理响应 │
│ for content in response: │
│ if content.type == "text": │
│ display(content.text) // 实时显示给用户 │
│ │
│ if content.type == "tool_use": │
│ // 5. 权限检查 │
│ if needsPermission(content.tool): │
│ approved = askUser("允许执行 xxx?") │
│ if !approved: continue │
│ │
│ // 6. 执行工具 │
│ result = executeTool(content) │
│ history.append(result) │
│ │
│ // 7. 如果没有工具调用,对话结束 │
│ if !hasToolCalls: break │
│ } │
│ │
└─────────────────────────────────────────────────────────────┘工具系统
Claude Code 的核心工具:
┌──────────────────────────────────────────────────────────────┐
│ │
│ 文件操作: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Read │ 读取文件内容(支持行号范围) │ │
│ │ Edit │ 精确替换文件中的字符串(非全量写入) │ │
│ │ Write │ 创建新文件或完全重写 │ │
│ │ Glob │ 按模式匹配搜索文件 │ │
│ │ Grep │ 在文件中搜索文本 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ 执行: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Bash │ 执行 shell 命令(沙箱内) │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ 智能: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Agent │ 启动子 Agent(独立上下文) │ │
│ │ WebFetch│ 获取网页内容 │ │
│ │ WebSearch│ 搜索互联网 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ 为什么 Edit 用"精确替换"而不是"整个文件写入"? │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 1. 节省 Token: 只发送修改的部分,不发整个文件 │ │
│ │ 2. 更安全: 不会意外覆盖其他部分 │ │
│ │ 3. 可审查: 用户能看到具体改了什么 │ │
│ │ 4. 冲突检测: old_string 必须唯一匹配 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘子 Agent 系统
Claude Code 可以启动 "子 Agent" 处理独立任务:
主 Agent (Opus 4.7)
┌──────────────────────────────────────────────┐
│ 用户: "重构这个模块并添加测试" │
│ │
│ [Thought] 任务比较复杂,我先调研代码结构 │
│ [Agent] 启动子 Agent 探索代码库 │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ 子 Agent (Sonnet 4.6) │ 独立上下文窗口 │
│ │ 探索 src/ 目录结构 │ 不污染主 Agent │
│ │ 搜索相关文件 │ 结果返回主 Agent │
│ └────────────┬───────────┘ │
│ │ 返回结果摘要 │
│ ▼ │
│ [Thought] 了解了结构,开始重构 │
│ [Edit] 修改 service.go │
│ [Write] 创建 service_test.go │
│ [Bash] go test ./... │
│ │
└──────────────────────────────────────────────┘
子 Agent 的优势:
┌──────────────────────────────────────────────┐
│ 1. 隔离上下文: 不会用探索结果占满主窗口 │
│ 2. 并行工作: 多个子 Agent 可以同时探索 │
│ 3. 更便宜: 子 Agent 可以用更小的模型 │
│ 4. 安全: 子 Agent 有独立的权限范围 │
└──────────────────────────────────────────────┘下一节: 02 - 核心技术详解