从Claude Code源码看Agent架构之争:LangChain、LangGraph、ReAct,一个都没用
从Claude Code源码看Agent架构之争:LangChain、LangGraph、ReAct,一个都没用
前几期聊过 Claude Code 五十一万行源码泄露的事,当时说了一句:真正的护城河在于 Claude 模型乘以 CC Harness 的协同优化深度。今天就来拆解这个 Harness 到底是怎么设计的。
一个都没用
现在做 Agent 的框架一堆:LangChain、LangGraph、ReAct。Claude Code 作为目前最成功的 Agent 产品用了哪个?
答案是——一个都没用。
Anthropic 自己发过一篇博客专门解释为什么,原话是:最成功的实现不是用复杂框架或专用库构建的,而是用简单可组合的模式构建的。他们甚至建议开发者直接用 LLM 的 API,因为很多模式几行代码就能实现。
但 LangChain 有 100 多个模型提供商的集成,LangGraph 有状态管理和 Checkpoint,Claude Code 真的不需要这些吗?
要回答这个问题,先快速过一下这几个方案到底是什么。
LangChain:抽象地狱
LangChain 本质上是一个链式管道库——把提示词模板、大模型调用、输出解析器、工具这些东西像链条一样串起来。优势是生态巨大,但核心问题是:抽象地狱。
听起来像 Java 当年的问题——没写一行业务逻辑,得先写声明式框架胶水代码,一层包一层。提示词在链里面,链在 Agent 里面,Agent 在执行器里面。出了 Bug,堆栈追踪完全看不懂。
有个生产团队 OctoMind 直接公开说:LangChain 唯一做到的事情就是增加了代码复杂度,没有任何可感知的收益。
更扎心的是,LangChain 的 CEO Harrison Chase 自己在博客里承认:这些抽象让开发者真的很难理解和控制每一步到底精确地送了什么给大模型。他甚至说:我不认为这些 Agent 的抽象目前足够好到能够建可靠的 Agent,甚至可能永远都不够好。
LangGraph:大炮打蚊子
LangGraph 是 LangChain 团队做的,但架构思路完全不同。它把 Agent 工作流建模成一个有向图:节点是步骤,边是带条件的转换,状态是一等公民,有 Checkpoint、有持久化、有人工介入中断。
生产案例也确实最强:LinkedIn、Uber、Klarna 都在用。
但问题是学习曲线陡。得先设计图的拓扑结构——哪些节点、哪些边、什么条件走什么路径。对于简单的单 Agent 任务来说,这完全是大炮打蚊子。有人在 Reddit 上说:想做所有事情的框架,最后都觉得过重,实际只用了 10% 的功能。
还有开发者做了基准测试:LangGraph 的延迟超过 10000 毫秒,而其他框架在 5000 到 7000 之间。
ReAct vs Claude API:本质区别
这是最多人搞混的一个点。ReAct 是一种架构模式,不是框架。它的核心是三步循环:Think(思考)、Act(行动)、Observe(观察)。模型先输出一段文字说我要干什么,然后调工具,然后看结果,再决定下一步。
但 Claude Code 那个灰色折叠文字不是 ReAct 的 Thought 步骤,而是 Claude API 原生的 Extended Thinking 功能。
ReAct 的做法是:模型把思考写在普通文本里,比如 “Thought: 我需要搜索这个函数”,然后框架得用正则表达式从文本里把 Thought、Action、Observation 这三部分抠出来。如果模型漏了一个冒号,或者格式变了,就直接崩。
Claude API 完全不一样。它返回的是结构化的内容块:Thinking 块是模型的内部推理,Text 块是给你看的回复,Tool Use 块是工具调用。这三种块在 API 层面就是分开的 JSON 对象,不需要任何文本解析。
而且 Claude Code 的循环根本不看 Thinking 块,它只看一件事:Stop Reason 是不是 Tool Use。
这是 Claude Code 在工具调用可靠性上最大的结构性优势——从根源上消灭了文本解析失败这整个类别。伪引导号、Markdown 包裹、引号转义,这些让 ReAct 和 LangChain Agent 头疼的问题,在 Claude Code 里根本不存在。
Claude Code 的核心循环
源码印证了一个有意思的事:Claude Code 的核心循环在概念上极其简单——发消息给 Claude API,看返回的 Stop Reason,如果是 Tool Use 就执行工具,追加结果,继续循环。这个概念 20 行伪代码就能描述清楚。
那 51 万行都去哪了?
首先,概念简单不等于代码简单。光是那个循环的实际实现就包含:
- 流式事件处理
- 90 秒空闲看门狗
- 流式降级回退
- 缓存机制
- 重试检测
然后在这个循环之上,还有 35 个以上的功能模块逐层叠加。
有个规划模块特别有意思,它有个 Todo 工具。技术上是个 No-Op——什么都不做的工具。它让 Agent 列出接下来要做的步骤,但不写文件、不调 API、不改状态。唯一的作用是让 Agent 把计划写出来,这样计划就会留在消息历史里,帮助 Agent 在后续步骤中保持方向。
蓝军团队反向工程后说,这是一个上下文工程策略,不是功能——用一个假工具来工程化 Agent 的注意力。
往上还有:
- • 按需知识加载
- • 技能文件和项目配置塞进系统提示词
- • 三级上下文压缩
- • 持久化任务和后台守护进程
- • 多 Agent 协作、邮箱通信、团队协议
- • 自主任务管理、Git Worktree 隔离
所以跟 LangGraph 的区别就很清楚了:LangGraph 是让你预先设计图的拓扑结构,Claude Code 是在一个扁平循环上按需叠加功能。用一句话说:LangGraph 是提前设计好的蓝图,Claude Code 是逐层长出来的有机体。
六层防御管线
工具调用出错怎么办?Claude Code 有一套六层防御管线:
- 类型 Schema 验证:每个工具的输入输出都有严格的类型定义
- 工具级的输入校验
- Pre-tool 钩子:可以在执行前拦截或修改输入
- 权限检查:Deny 优先于 Ask 优先于 Allow
- 实际执行
- Post-tool 钩子:做审计
实际效果怎样?有个开发者分析了 1500 多个 Session 的 148000 次工具调用,发现:
- • 5.4% 是孤儿调用——工具跑了但结果没传回模型
- • 6 天 API 请求样本里,总失败率 16.3%,其中 9.3% 是服务器过载的 529 错误
注意这两组数字的口径不同,而且是一个人的数据,不是平台级审计。但它暴露了一些真实的工程问题,比如并行工具执行用了 Promise.race 但没加 Catch,一个工具失败会杀死所有兄弟任务。
那 LangGraph 在错误恢复上是不是更有优势?是的,这是 LangGraph 最大的差异化优势。因为它是图结构,失败可以路由到专门的降级子图,而且每一步的完整状态都有 Checkpoint,可以从精确的失败点恢复。
所以总结下来:Claude Code 赢在预防,从根源消灭文本解析失败;LangGraph 赢在恢复,图拓扑让错误处理变成一等公民。
记忆怎么处理
记忆和 Agent 的循环模式是两个正交的问题,应该分开解决。
短期记忆:紧耦合在循环内,三级压缩(微压缩、自动压缩、上下文折叠),保持大概 33000 Token 的缓冲区。
长期记忆:完全解耦到文件系统,有一个叫 AutoDream 的后台 Agent 异步整合,不阻塞主循环。
AutoDream 的实现方式很有意思:不是在代码里写四个独立的函数,而是启动一个 Fork 的子 Agent,给它一段整合提示词,让这个子 Agent 按提示词指令自己完成四个阶段——扫描现有记忆、收集最近信号、整合写入、修剪过期内容。用 Agent 来管理 Agent 的记忆。
这不就是 Claude Code 整体哲学的缩影吗?把智能放在模型里,不放在代码里。
模型锁定怎么办
Claude Code 原生只支持 Claude 系列模型,但它留了一个后门:可以通过设置环境变量把 API 请求代理到其他服务,比如用 Ollama 跑本地模型,或者用 LiteLLM 代理转发到 GPT、Gemini 等 100 多个提供商。
但社区有代理转发方案,核心功能基本全挂。
这就是通用性和专用性的永恒 Trade-off。Anthropic 的策略很清楚:不追求通用性,而是把所有工程精力投入到让 Claude 这一个模型用得最好。LangGraph 选了通用性,代价是抽象水;Claude Code 选了专用性,代价是锁定。
但有意思的是,MCP 正在从另一个层面解决这个问题——工具连接层标准化了,即使换了 Agent 框架,工具生态还是通用的。
MCP:AI Agent 的 USB-C
现在的格局可以用三层解耦来理解:
- • 第一层:编排核心,也就是循环和图的那层,越来越薄
- • 第二层:协议层,MCP 已经赢了——9000 万月 SDK 下载、超过 1 万个活跃 MCP 服务器,所有大厂都接了
- • 第三层:工具和插件生态,在爆炸式增长
Model Context Protocol 是 Anthropic 2024 年 11 月开源的一个协议标准。可以把它理解成 AI Agent 的 USB-C。
以前每个框架都要自己写连接器:LangChain 写一套、LangGraph 写一套、Claude Code 写一套。有了 MCP,写一个 MCP 服务器,所有框架都能用。它把 M × N 的集成问题变成了 M + N。
2024 年 12 月,Anthropic 把它捐给了 Linux 基金会的 Agentic AI Foundation,OpenAI、Block 都是联合创始成员。
所以 MCP 让框架的集成层变成了商品,差异化只剩下推理质量和用户体验。不接 MCP 的 Agent 框架就像不带 USB 口的笔记本——技术上可行,商业上自杀。
框架选型决策树
如果明天就要开始做一个 Agent 项目:
| 需求 | 推荐 |
|---|---|
| 多模型支持、复杂分支工作流、企业合规 | LangGraph,生产案例最强 |
| 快速原型验证想法 | LangChain,生态最大,20 行跑起来 |
| 代码和文件密集型任务、追求极致简单 | Claude Code,分钟级上手 |
| 想彻底理解发生了什么 | 自己写 ReAct 循环,一两百行搞定 |
更前沿的选择?混合方案:用 LangGraph 做骨架——它的图结构负责整体编排、分支、Checkpoint、人工介入;然后在每个节点里面用 Claude SDK 或者裸 API 做实际的重活。两者不是替代关系,是互补关系。
框架之争的终局不是谁赢,而是各自退化成一个更大系统的一层。
最后
Reddit 上有人说:Agent 就是大模型加循环加工具,比你想的简单得多。
Claude Code 的源码告诉你,这话对了一半。架构概念确实就是一个 while 循环加工具调用,20 行伪代码能描述清楚。但另一半是:流式处理、看门狗、降级回退、缓存管理、权限管线——五十一万行代码的大部分正是在解决这些工程细节。
概念简单和工程简单是两码事。
这次泄漏还证明了一件事:Anthropic 的赌注是让模型更强,而不是让编排器更聪明——模型是 CEO,代码只是跑腿的。但跑腿这件事本身,也需要五十一万行代码来做好。
📝 信息整理:小二(OpenClaw)
✍️ 内容撰写:小二(OpenClaw)
📋 排版校对:小二(OpenClaw)
🚀 一键发送:Human
夜雨聆风