Post

Claude Code 原理与优化

Claude Code 的核心是单线程 while 主循环(ReAct 模式),通过工具调用触发循环,纯文本回复终止;支持实时打断(h2A 双缓冲队列)。为应对上下文窗口限制,设计五层压缩流水线(从丢弃旧消息到语义压缩),并强调状态外化到文件(如 CLAUDE.md)避免依赖内存。持久记忆由跨会话的 CLAUDE.md 和会话级扁平消息历史构成。四大扩展机制(MCP、Skills、Plugins、Hooks)与子代理(仅返回摘要)实现可控扩展。成本优化需分级选模型、主动压缩(/compact)、回退隔离及切换镜像。Agent SDK 复用核心 harness 加速开发。掌握工具触发循环、压缩策略和状态外化,可构建可控、可调试的生产级 AI 代理系统。

AI 应用 阅读 5 点赞 0 评论 0

导语

在 AI 代理开发领域,Claude Code 凭借其独特的架构设计和工具调用能力,成为了许多生产级应用的核心引擎。这篇教程将带你深入理解 Claude Code 的底层原理——从单线程主循环的核心机制,到上下文压缩、持久记忆、扩展机制,再到成本优化的实战技巧。无论你是想调试 Claude Code 应用,还是优化其性能,这篇教程都将为你提供清晰的方法论和可落地的操作指南。

1. 核心循环:单线程主循环的工作机制

Claude Code 的核心是一个单线程 while 主循环,它决定了模型如何与用户、工具和上下文进行交互。我们先通过一个直观的例子理解这个循环:

假设你让 Claude Code 帮你完成一个任务:“帮我检查最近一周的 GitHub 项目提交记录,找出代码重复率最高的文件”。Claude Code 的处理流程会是这样的:

读取用户输入 + 上下文 → LLM 决策 → 有工具调用?
 ├─ 有(例如:需要调用 GitHub API 搜索提交记录)→ 执行工具 → 结果回喂 → 继续循环
 └─ 无(纯文本回复:分析结果)→ 循环终止,交还用户

一句话总结:只要模型的回复中包含工具调用,循环就会继续;当回复是纯文本时,循环终止并返回结果。这本质上是 ReAct(思考→行动→观察)框架在 Claude Code 中的落地——用一个单线程的 while 循环替代了多步骤的独立思考。

为什么选择单线程 + 扁平消息历史?

Claude Code 刻意采用单线程主循环扁平消息历史(用户输入、模型回复、工具调用、工具结果按序追加),这背后是一个重要的架构决策:

  • 可预测性与可调试性:避免多线程会话或多个竞争的 Agent 人格,防止生产环境中出现不可预测的行为(如多 Agent 协作时的指令冲突、难调试的异步问题)。
  • 透明性与可观测性:单主线程和扁平历史让整个交互过程完全可追踪,便于监控和调试——生产环境中,“行为可预测”比“潜在更强但不透明”更重要。

实时打断(steering)机制

Claude Code 支持实时打断(即用户中途注入新指令时无需重启整个流程),这依赖于“h2A 异步双缓冲队列”实现。例如,当 Claude Code 正在调用 GitHub API 时,你突然输入“先检查最近 3 天的提交”,系统会通过双缓冲队列接收新指令,并在当前工具调用完成后重新触发循环,无需从头开始。

2. 五层上下文压缩流水线:应对上下文窗口限制

上下文窗口是 Claude Code 的“硬约束”(老模型为 200K token)。为了在有限窗口内高效处理长对话,Claude Code 设计了五层上下文压缩流水线,按“成本从低到高”的顺序执行,优先使用轻量操作:

压缩层 作用描述 成本
Tool Result Budget 工具结果(如文件读取、搜索结果)的长度限制 便宜
Snip Compact 直接丢弃历史中较旧的消息 便宜
懒加载指令 / 延迟工具 schema 指令和工具定义按需加载,避免一次性塞入窗口
Subagent 只返回摘要 子代理仅返回结果摘要,不传输完整历史
Auto-Compact 语义压缩 最后手段:对整段历史做语义摘要压缩

为什么按“便宜到贵”顺序执行?
我们的目标是用最小的计算成本解决问题:能用 Snip Compact(丢弃旧消息)就不用 Auto-Compact(语义压缩),确保上下文窗口始终保持干净可控。

关键思考:上下文腐化的应对

当对话历史过长导致上下文窗口溢出时,可通过以下方式修复:
- 主动压缩:使用 /compact 命令手动触发压缩(实测可释放 30-50% 上下文占用);
- 状态外化:将关键状态(如代码进度、工具调用结果)写入文件(如 CLAUDE.md),避免依赖内存中的上下文。

3. 持久记忆:CLAUDE.md + 扁平消息历史

Claude Code 的记忆系统分为两类,确保对话状态的持久与隔离:

1. 持久锚点:CLAUDE.md

CLAUDE.md 是跨会话的“结构化 onboarding 文档”,包含项目规范、架构决策、代码风格和工具配置。每次会话启动时,Claude Code 会自动加载该文件,确保不同会话间的规则一致性。

2. 工作记忆:扁平消息历史

本次会话的消息历史是仅追加的扁平日志(用户输入、模型回复、工具调用、工具结果按顺序记录),会话结束后自动清除。这种设计避免了多会话间的历史污染,确保每个任务的上下文独立。

核心原则:状态必须外化到文件系统(如 CLAUDE.mdprogress.txt),而非依赖内存中的上下文。例如,当子代理完成任务后,只需将结果摘要写入 CLAUDE.md,下次会话即可复用。

4. 四大扩展机制 + 权限系统

为了支持复杂任务,Claude Code 提供了四大扩展机制,形成完整的工具调用与权限管理体系:

四大扩展机制

机制 核心作用 层级定位
MCP 工具接入标准网关(如浏览器、GitHub) 跨平台工具复用层
Skills 操作经验/流程编排(如代码审查流程) 工具组合方法论层
Plugins 打包套件(整合 MCP + Skills + Hooks) 功能模块封装层
Hooks 事件钩子(如 after-tool-use 触发代码格式检查) 自动化质量闭环层

Subagent(子代理)设计

子代理是“受控并行”的核心机制:每个子代理从空白会话开始(无历史),仅加载自身的 system prompt 和项目级 CLAUDE.md,完成任务后仅返回摘要给主线程。这避免了多 Agent 同时竞争上下文窗口,确保流程可控。

为什么子代理只返回摘要?
直接传输完整历史会导致上下文窗口爆炸,而仅返回摘要既保留了关键信息,又避免了上下文膨胀。

权限系统:7 种模式 + ML 分类器

Claude Code 通过 7 种权限模式(如“仅读取文件”“禁止执行系统命令”)和 ML 分类器,确保工具调用的安全性。例如,当检测到敏感指令时,系统会自动拒绝执行并返回安全提示。

5. 成本优化实战:五招降本指南

Claude Code 的成本优化需从“上下文占用”和“模型调用次数”两方面入手:

1. 模型分级选择

  • 简单任务:使用 Haiku(轻量模型,成本低);
  • 常规任务:使用 Sonnet(平衡能力与成本);
  • 复杂任务:使用 Opus(高性能但成本高)。
    原则:不盲目追求最强模型,按任务难度匹配。

2. 主动压缩上下文

  • 命令触发:执行 /compact 手动压缩(优先丢弃低价值历史);
  • 监控占用:通过 /context 查看 token 分布(如工具结果占比过高则优先裁剪)。

3. 精准回退与隔离

  • 回退操作:使用 /rewind 命令回退到历史对话节点,避免错误上下文持续占用窗口;
  • 环境隔离:用 /sandbox 启动沙箱环境执行敏感操作(如代码调试),避免污染主会话。

4. 国内镜像与多 provider 切换

  • 镜像接入:使用国内镜像(如字节跳动镜像)可节省 50-70% 调用成本;
  • provider 切换:通过 cc-switch 工具一键切换调用提供商(如 Anthropic API 与开源模型)。

关键提醒:压缩 ≠ 省钱

注意:/compact 仅减少上下文占用,而成本取决于调用频率和模型单价。需通过“上下文占用 × 调用次数 × 单价”计算实际成本,避免混淆“降占用”与“降费用”。

6. Agent SDK:复用通用 harness 加速开发

为降低二次开发门槛,Anthropic 将 Claude Code 的核心 harness(主循环、工具执行、上下文管理)抽象为 Claude Agent SDK。开发者可基于 SDK 快速搭建自己的 Claude 应用,无需从零实现循环逻辑。

核心价值:通过 SDK 复用 Claude Code 的方法论(如 ReAct 循环、压缩流水线),同时保持自定义工具和权限控制的灵活性。

高频问题速答

Q1: Claude Code 核心循环是什么?
A: 单线程 while 循环:读输入+上下文 → LLM 决策 → 有工具调用则执行+回喂,无则终止。即 ReAct 框架的“思考→行动→观察”落地为循环。

Q2: 上下文超长如何处理?
A: 五层压缩流水线(工具结果裁剪→丢弃旧消息→懒加载→子代理摘要→语义压缩)+ 状态外化到文件 + 手动 /compact

Q3: 子代理为什么只返回摘要?
A: 避免上下文窗口爆炸,同时保留关键信息,平衡效率与可控性。

小结

Claude Code 的设计理念是“简单、可预测、易调试”,通过单线程主循环、扁平上下文历史、分层压缩流水线和工具扩展机制,构建了一套生产级 AI 代理系统。掌握其原理与优化技巧,关键在于:
1. 理解“工具调用触发循环”的核心逻辑;
2. 合理使用五层压缩流水线控制上下文窗口;
3. 通过状态外化和主动操作(如 /compact)降低成本;
4. 借助 Subagent 和 SDK 实现复杂任务的模块化开发。

这套架构为我们提供了一个“可控但不僵化”的 AI 代理开发范式,既适合快速原型验证,也能支撑大规模生产应用。

继续阅读

全部归档
混合技术应用
混合技术应用

本文通过9个典型场景,拆解RAG、Agent、多模态处理、工具调用、工程化部署等核心技术的混合应用逻辑。RAG构建企业知识库,解决幻觉与私有知识问题,生产端经文档解析、智能切片、向量化建库,消费端通过多路召回、重排、流式生成实现闭环。Agent通过意图路由、短期/长期记忆与工具调用形成对话记忆闭环;多Agent编排借助总控与子Agent分工处理复杂任务。FC、MCP与RAG构成“黄金三角”,分别负责动态工具调用、标准化接入与静态知识检索。多模态摘要降维、NL2SQL自助取数、高并发工程策略、数仓ETL及推荐系统三层链路进一步拓展应用边界。读者可掌握从技术选型到系统落地的完整思路,核心在于场景化组合RAG+向量库+大模型+工具链的底层逻辑。

OpenClaw 自托管 Agent 网关
OpenClaw 自托管 Agent 网关

OpenClaw是一个自托管开源AI助手网关,将飞书、钉钉、微信等聊天软件统一接入本地LLM Agent,实现多渠道统一接入、自托管安全可控。其核心三层架构(Channel/Brain/Body)实现关注点分离:Gateway层负责消息路由与鉴权,从不调用模型;Brain层负责指令解析、人格定义和LLM推理,支持Claude/GPT等模型无缝切换;Body层提供工具调用(如天气、日程)和文件操作。消息处理遵循七阶段Agentic循环(归一化、路由、上下文组装、LLM推理、ReAct工具循环、技能加载、持久化记忆)。记忆采用Markdown+YAML文件存储,支持人工编辑和Git备份,通过检索式访问避免上下文窗口爆炸。自动化任务支持Heartbeat心跳、Cron定时和Webhook事件触发。安全设计三道权限闸:入口闸(本地连接与配对码)、工具闸(默认拒绝白名单)、执行闸(Docker沙箱隔离)。实践踩坑提示包括记忆选择性遗忘、技能依赖耦合、Cron时区问题及Docker权限控制。核心优势:透明可控、安全隔离、灵活扩展。

Vanna 与 NL2SQL
Vanna 与 NL2SQL

Vanna 是一个基于 RAG 的开源 NL2SQL 框架,不微调模型,而是通过向量化存储 DDL、业务文档和示例 SQL 对,在用户提问时检索相关上下文,由 LLM 生成 SQL 并执行,支持安全校验和自校正。其核心优势在于低成本、可增量更新、可解释且框架无关(支持多种 LLM、向量库和数据库)。训练阶段仅需向量化语料,提问阶段自动完成检索、生成、执行和结果可视化。针对 Schema Linking、业务口径歧义、SQL 方言差异和安全风险等难点,Vanna 提供两级检索、业务文档定义、方言指定和三层安全防御等方案。评估应使用执行结果准确率而非文本匹配。Vanna 2.0 转向 Agent 化架构,支持多轮交互、用户权限和流式富 UI。读者可快速落地低成本、可扩展的文本转 SQL 方案,连接业务人员与数据库。

评论