
用 LangGraph 写 ReAct Agent套路是固定的定义MessagesState→ 写call_model节点 → 写call_tool节点 → 写should_continue条件边 →add_node/add_edge串图 → 最后compile。每次写都一样每次写都要测每次写都担心条件边返回END漏掉。我自己工程上至少写过 6 次这套样板写到第三次就觉得不对——这玩意儿应该是默认的不该让我每次都重写。直到我去看create_deep_agent的源签名create_deep_agent(...) - CompiledStateGraph[AgentState[ResponseT], ContextT, ...]返回的就是CompiledStateGraph——也就是说它没造新东西它就是把上面那六步替你写好了。这篇是 Day 4把这件事说清楚。阅读提示读完你能拿到三个东西DeepAgents 和 LangGraphStateGraph在定义 Agent这件事上的精确差异一张能贴在屏幕边的 Agent 生命周期状态机图知道每个状态对应什么时机一段从 LangGraph ReAct 迁移到create_deep_agent的对照代码 全文约 10 分钟。一、全局地图Day 4 在哪一层12 天计划进入第二阶段——核心模块。前三天我们看了是什么 / 怎么装 / 源码长什么样从 Day 4 开始进入每个核心能力到底怎么用。Day 4 这一篇专注一件事Agent 本身是怎么被定义和管理的。这是后面所有内容的基础——ToolDay 5、MemoryDay 6、WorkflowDay 7、Multi-AgentDay 8都是在这个基础上叠的。二、对比一下同样一个 ReAct Agent两种写法先把差异具象化。2.1 LangGraph 版我以前写过 N 遍的样板from typing import Annotated, TypedDict, Literalfrom langgraph.graph import StateGraph, END, STARTfrom langgraph.graph.message import add_messagesfrom langchain_openai import ChatOpenAIfrom langchain_core.messages import ToolMessage# 1. 定义 Stateclass State(TypedDict): messages: Annotated[list, add_messages]# 2. 准备模型 工具def get_weather(city: str) - str: returnfIts always sunny in {city}!model ChatOpenAI(modelgpt-4o).bind_tools([get_weather])# 3. call_model 节点def call_model(state: State): return {messages: [model.invoke(state[messages])]}# 4. call_tool 节点def call_tool(state: State): last state[messages][-1] results [] for tc in last.tool_calls: if tc[name] get_weather: out get_weather(**tc[args]) results.append(ToolMessage(contentout, tool_call_idtc[id])) return {messages: results}# 5. 条件边def should_continue(state: State) - Literal[tools, __end__]: returntoolsif state[messages][-1].tool_calls else END# 6. 串图 编译graph StateGraph(State)graph.add_node(model, call_model)graph.add_node(tools, call_tool)graph.add_edge(START, model)graph.add_conditional_edges(model, should_continue)graph.add_edge(tools, model)agent graph.compile()40 来行。能跑但每个项目你都得抄一遍。2.2 DeepAgents 版同一个能力from deepagents import create_deep_agentdef get_weather(city: str) - str: Get weather for a given city. return fIts always sunny in {city}!agent create_deep_agent( modelopenai:gpt-4o, tools[get_weather], system_promptYou are a helpful assistant.,)8 行。**返回的依然是CompiledStateGraph**这是事实看create_deep_agent的类型签名。也就是说你用create_deep_agent定义出来的对象和你用StateGraph().compile()编译出来的对象是同一个类型。 DeepAgents 不是新东西它是把那一套样板做成了内置中间件 默认配置。三、那 DeepAgents 内部到底装了什么看官方文档docs.langchain.com/oss/python/deepagents/customization能直接列出来——create_deep_agent默认会在中间件栈里塞6 个默认 Middleware干什么的TodoListMiddleware提供write_todos工具让 Agent 能写计划FilesystemMiddleware提供ls/read_file/write_file/edit_fileSubAgentMiddleware提供task工具能 spawn 子 AgentSummarizationMiddleware长对话自动压缩AnthropicPromptCachingMiddleware用 Anthropic 时自动开 prompt cachePatchToolCallsMiddleware工具调用被中断时自动修复消息历史只有当你用了memory/skills/interrupt_on这三个参数时才会按需挂上MemoryMiddleware/SkillsMiddleware/HumanInTheLoopMiddleware。这件事的工程含义是你用 LangGraph 自己写的话“长对话压缩、文件读写、子 Agent 调度、HITL”——这四个一个都没有DeepAgents 把它们做成了默认行为不传参数就有传参数才升级。四、一次 invoke 里 Agent 经过了哪些状态光看类型签名不够要理解一个 Agent 实例在invoke期间是怎么流转的。我画了一张状态机图是 Day 4 这一篇最值得贴在屏幕边的图4.1 状态逐个解读Compiled / Ready入口create_deep_agent(...)返回时进入这个状态含义图已经被编译中间件栈已经装配好等待invoke()触发这一步只发生一次之后所有invoke都从这里出发Reasoning入口每次invoke进来或工具执行完回灌含义跑 LLM 推理决定输出哪些tool_calls重要每个中间件的before_model/after_model钩子都在这一步触发ToolExecuting入口模型输出非空tool_calls含义并行执行所有被调用的工具出口把结果以ToolMessage形式追加回 state回到 ReasoningWaitingForHuman虚线可选入口当且仅当配置了interrupt_on{tool_name: True}含义在工具真正执行之前暂停等待人 approve / edit / reject出口人工动作后回到 ToolExecuting 或终止Done入口模型返回空 tool_calls含义循环结束把messages写入 checkpointer返回结果Failed入口异常 / 超时 / 拒绝含义异常落到 state但因为底层是 LangGraph可以从 checkpoint 恢复4.2 这张图的关键判断如果你已经画熟了 LangGraph 的图这张状态机的形状你应该会觉得很熟——它本质上就是 LangGraph 那张 ReAct 图的状态视角。核心循环就是那条紫色虚线ToolExecuting → Reasoning每次工具执行完把结果回灌给模型模型再决定要不要继续。这正是 Day 2 里讲的 tool calling loopDeepAgents 没有发明新机制它只是把这套循环和中间件栈打包好了。五、最小实验把 LangGraph 的 ReAct 迁过来如果你已经有一段 LangGraph 的 ReAct 代码迁移其实很机械三步Step 1把StateGraph(State)那一坨删掉全删。Step 2把模型和工具列表整理出来传给create_deep_agent。Step 3调用方式不变——agent.invoke({messages: [...]})。完整代码就 8 行2.2 节已经贴过了。5.1 看清框架替你做了什么的笨办法最直观的验证让 Agent 干一件需要文件系统的活看它有没有自己用上write_file。from deepagents import create_deep_agentagent create_deep_agent( modelopenai:gpt-4o, tools[], # 故意不给任何自定义工具 system_promptYou are a research assistant.,)result agent.invoke({messages: [{ role: user, content: 帮我把 LangChain、LangGraph、DeepAgents 三者的关系写成一份大纲存到 outline.md}]})for m in result[messages]: tcs getattr(m, tool_calls, []) or [] for tc in tcs: print(f调用工具: {tc[name]} args{tc[args]})你会在输出里看到write_file这种工具被调用——但你没传任何工具那就是FilesystemMiddleware自带的事实参考官方默认中间件清单。这就是 DeepAgents 和 LangGraph 在定义 Agent上最直观的差异你声明意图框架替你装齐能力。六、踩坑记录现象原因解决system_prompt写得很短但 Agent 行为完全不像我说的DeepAgents 会把你的 prompt 和内置BASE_AGENT_PROMPT拼接你的指令在最前知道这个机制明确写覆盖 / 优先于用 Anthropic 模型时输出多了一段不像我写的话Anthropic profile 自带system_prompt_suffix看 customization 文档Prompt assembly小节必要时用 profile 覆盖配置了interrupt_on但程序就卡死了HITL 状态需要外部输入才能继续用 LangGraph 的Command(resume...)或在 LangGraph Studio 里手动 approve自定义中间件里用self.x ...累计计数并发下数据错乱文档明确警告不要 mutate middleware 实例属性改用 graph statereturn {x: ...}想从某个失败点重跑没传checkpointer创建时传一个MemorySaver()/SqliteSaver()然后用thread_id恢复想要结构化输出用response_format参数传 Pydantic model 或 dict schema一个我自己撞到的细节第一次跑带subagents的版本时我以为子 Agent 会继承主 Agent 的 system prompt——不会。子 Agent 的 prompt 是独立组装的spec[system_prompt] 子 Agent 自己的 profile主 Agent 的 USER 段不会传过去。这点 customization 文档里写得很清楚但容易忽略。七、什么时候不该用create_deep_agent诚实说一句任务形状根本不是 ReAct比如严格 DAG、严格 pipeline、严格事件驱动 → 直接 LangGraphDeepAgents 帮倒忙超轻量场景你只想做 “一次模型推理 一次工具” 这种两步任务 → LangChain 的create_agent就够DeepAgents 多余你需要完全自定义 Agent 循环逻辑比如先并行 N 个不同 prompt 投票再决策 → 自己写 LangGraph 图DeepAgents 的甜区是长任务 多步骤 需要规划/委派/记忆。这是它的 README 里long-horizon, multi-step work那行字背后的东西。八、Day 4 一句话结论在 LangGraph 里你定义的是图在 DeepAgents 里你声明的是意图。 编译产物是同一个CompiledStateGraph差别只在你写多少代码。判断标准你的 Agent 是不是 ReAct 形状是 → 用 DeepAgents 省样板不是 → 留在 LangGraph。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】