主题
02 - Claude Code 核心技术详解
1. System Prompt 设计
Claude Code 的 System Prompt 是一个"万字级"的巨大提示词,
它定义了 Claude Code 的完整行为规范:
┌──────────────────────────────────────────────────────────┐
│ System Prompt 结构 │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 身份定义 │ │
│ │ "You are Claude Code, Anthropic's CLI..." │ │
│ └────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 工具使用规则 │ │
│ │ - 优先用专用工具(Read vs cat) │ │
│ │ - 并行调用独立工具 │ │
│ │ - Edit 前必须先 Read │ │
│ └────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 代码风格指令 │ │
│ │ - 不加不必要的注释 │ │
│ │ - 不过度抽象 │ │
│ │ - 修 bug 不要附带重构 │ │
│ └────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 安全规则 │ │
│ │ - 不执行破坏性 git 操作 │ │
│ │ - 不推送到 remote (除非明确要求) │ │
│ │ - 不提交敏感文件 (.env 等) │ │
│ └────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 沟通风格 │ │
│ │ - 简洁、不废话 │ │
│ │ - 不用 emoji (除非用户要求) │ │
│ │ - 探索性问题用 2-3 句话回复 │ │
│ └────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 环境信息 (动态注入) │ │
│ │ - 操作系统、Shell、工作目录 │ │
│ │ - 是否是 Git 仓库 │ │
│ │ - 当前日期 │ │
│ │ - 模型信息 │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ System Prompt 的设计哲学: │
│ ┌──────────────────────────────────────────┐ │
│ │ 不是告诉 AI "怎么写代码" │ │
│ │ 而是告诉 AI "在什么边界内做决策" │ │
│ │ 给足够的自由度 + 明确的底线 │ │
│ └──────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘2. 上下文管理与 Compaction
核心问题: 对话越来越长,上下文窗口终将耗尽
对话进行中:
Token 使用 ▲
│ ████████████████████
│ ████████████████████████████
│ ████████████████████████████████████
│ ████████████████████████████████████████
├────────────────────────────────────────── 上下文限制
│ ███████████████████████████████████████████
│
└──────────────────────────────────────────▶ 时间
解决: Compaction (上下文压缩)
┌──────────────────────────────────────────────────────────┐
│ │
│ 压缩前的对话历史: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ [User] 帮我看看这个 bug │ │
│ │ [Assistant] 让我读一下代码 │ │
│ │ [Tool: Read file1.go] │ │
│ │ [Tool Result: 200行代码...] │ │
│ │ [Assistant] 发现问题在第50行 │ │
│ │ [Tool: Read file2.go] │ │
│ │ [Tool Result: 150行代码...] │ │
│ │ [Tool: Edit file1.go] │ │
│ │ [Tool Result: 修改成功] │ │
│ │ [Assistant] 已修复 │ │
│ │ [User] 再帮我加个测试 │ │
│ │ ... (大量中间步骤) ... │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ▼ Compaction │
│ │
│ 压缩后: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ [System Summary] │ │
│ │ 之前的对话中: │ │
│ │ - 用户报告了 file1.go 的 bug │ │
│ │ - 我读取了 file1.go 和 file2.go │ │
│ │ - 修复了第50行的空指针问题 │ │
│ │ - 用户接着要求添加测试 │ │
│ │ │ │
│ │ [最近的对话保持原样] │ │
│ │ [User] 再帮我加个测试 │ │
│ │ ... │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ 压缩策略: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 1. 保留 System Prompt(不能压缩) │ │
│ │ 2. 保留最近 N 轮对话(保持连贯性) │ │
│ │ 3. 旧对话让 LLM 自己总结成摘要 │ │
│ │ 4. 工具结果(代码内容)是最大的 Token 消耗者 │ │
│ │ → 优先压缩工具结果 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────┘3. 权限沙箱模型
Claude Code 的权限控制系统:
┌──────────────────────────────────────────────────────────────┐
│ 权限分层模型 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 自动允许 (Auto-allow) │ │
│ │ │ │
│ │ 这些操作不需要用户确认: │ │
│ │ • Read: 读取文件 │ │
│ │ • Glob/Grep: 搜索文件 │ │
│ │ • 子 Agent: 探索代码库 │ │
│ │ → 只读操作,不会造成破坏 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 需要确认 (Needs Approval) │ │
│ │ │ │
│ │ 这些操作需要用户点击允许: │ │
│ │ • Edit/Write: 修改文件 │ │
│ │ • Bash: 执行命令 │ │
│ │ • WebFetch: 访问外部 URL │ │
│ │ → 有副作用的操作 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 可配置权限 (settings.json) │ │
│ │ │ │
│ │ 用户可以自定义 allow/deny 规则: │ │
│ │ { │ │
│ │ "permissions": { │ │
│ │ "allow": ["Bash(npm test)", "Bash(go build)"], │ │
│ │ "deny": ["Bash(rm -rf)"] │ │
│ │ } │ │
│ │ } │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 权限检查流程: │
│ │
│ 工具调用请求 │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 在 deny 列表? │──Yes──▶ 拒绝 │
│ └──────┬───────┘ │
│ │ No │
│ ┌──────▼───────┐ │
│ │ 在 allow 列表?│──Yes──▶ 自动执行 │
│ └──────┬───────┘ │
│ │ No │
│ ┌──────▼───────┐ │
│ │ 是只读操作? │──Yes──▶ 自动执行 │
│ └──────┬───────┘ │
│ │ No │
│ ▼ │
│ 弹窗询问用户 │
│ │
└──────────────────────────────────────────────────────────────┘4. CLAUDE.md 和记忆系统
┌──────────────────────────────────────────────────────────────┐
│ 项目上下文系统 │
│ │
│ CLAUDE.md — 项目级指令文件 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 放在项目根目录,每次对话都会被加载 │ │
│ │ │ │
│ │ 内容示例: │ │
│ │ - 项目用 Go 1.22 + PostgreSQL │ │
│ │ - 运行测试: go test ./... │ │
│ │ - 代码风格: 不用 panic,用 error return │ │
│ │ - API 格式: RESTful,返回 JSON │ │
│ │ │ │
│ │ 作用: 让 Claude Code 理解你的项目上下文 │ │
│ │ 类似于给新入职同事的 README │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ Memory 系统 — 跨会话的持久化记忆 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 存储在 ~/.claude/projects/{dir}/memory/ │ │
│ │ │ │
│ │ MEMORY.md (索引文件) │ │
│ │ ├── user_profile.md (用户背景和偏好) │ │
│ │ ├── feedback_style.md (用户给的反馈指导) │ │
│ │ ├── project_context.md (项目相关信息) │ │
│ │ └── reference_links.md (外部资源链接) │ │
│ │ │ │
│ │ 记忆类型: │ │
│ │ ├── user: 用户是谁,什么水平,什么偏好 │ │
│ │ ├── feedback: 用户纠正过的行为(做/不做) │ │
│ │ ├── project: 项目进展、决策、截止日期 │ │
│ │ └── reference: 外部系统的指针和链接 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 加载优先级: │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ System Prompt (最高优先级,不可覆盖) │ │
│ │ ↓ │ │
│ │ CLAUDE.md (项目级指令) │ │
│ │ ↓ │ │
│ │ Memory 文件 (持久化记忆) │ │
│ │ ↓ │ │
│ │ 对话历史 (当前会话) │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘5. 如果你想自己实现类似系统
从 Claude Code 学到的设计原则:
┌──────────────────────────────────────────────────────────┐
│ │
│ 1. System Prompt 是"宪法" │
│ → 定义行为边界,不是具体操作步骤 │
│ → 越详细越好,但要有层次 │
│ │
│ 2. 工具设计要"正交" │
│ → 每个工具做一件事 │
│ → Read ≠ Bash(cat),虽然结果一样但语义不同 │
│ → Edit(增量修改)比 Write(全量覆盖)更安全 │
│ │
│ 3. 上下文管理是核心难题 │
│ → 对话会变长,必须有压缩策略 │
│ → 压缩要保留"关键决策",丢弃"中间过程" │
│ → Prompt 缓存可以节省成本 │
│ │
│ 4. 权限模型要分层 │
│ → 只读自动允许 │
│ → 有副作用的要确认 │
│ → 破坏性操作要双重确认 │
│ │
│ 5. 记忆让 AI 变得"个人化" │
│ → 记住用户偏好,避免重复犯同样的错 │
│ → 记忆要有类型和过期机制 │
│ │
│ 6. 流式输出提升体验 │
│ → 用户能实时看到 AI 在"思考什么" │
│ → 工具调用前显示意图,执行后显示结果 │
│ │
└──────────────────────────────────────────────────────────┘模块七完成!
下一个模块: 模块八:OpenClaw & OpenCode 架构