Skip to content

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 - 核心技术详解