当前位置: 首页 > news >正文

我用 LangGraph 写过 6 次 ReAct 样板代码,DeepAgents 一行就把它装好了

用 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,把这件事说清楚。

阅读提示读完你能拿到三个东西:

  1. DeepAgents 和 LangGraphStateGraph在"定义 Agent"这件事上的精确差异
  2. 一张能贴在屏幕边的 Agent 生命周期状态机图,知道每个状态对应什么时机
  3. 一段从 LangGraph ReAct 迁移到create_deep_agent的对照代码 全文约 10 分钟。

一、全局地图:Day 4 在哪一层

12 天计划进入第二阶段——核心模块。前三天我们看了"是什么 / 怎么装 / 源码长什么样",从 Day 4 开始进入"每个核心能力到底怎么用"。

Day 4 这一篇专注一件事:Agent 本身是怎么被定义和管理的。这是后面所有内容的基础——Tool(Day 5)、Memory(Day 6)、Workflow(Day 7)、Multi-Agent(Day 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: returnf"It's always sunny in {city}!"model = ChatOpenAI(model="gpt-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(content=out, tool_call_id=tc["id"])) return {"messages": results}# 5. 条件边def should_continue(state: State) -> Literal["tools", "__end__"]: return"tools"if 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 f"It's always sunny in {city}!"agent = create_deep_agent( model="openai:gpt-4o", tools=[get_weather], system_prompt="You 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_file
SubAgentMiddleware提供task工具,能 spawn 子 Agent
SummarizationMiddleware长对话自动压缩
AnthropicPromptCachingMiddleware用 Anthropic 时自动开 prompt cache
PatchToolCallsMiddleware工具调用被中断时自动修复消息历史

只有当你用了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,回到 Reasoning

WaitingForHuman(虚线,可选)

  • 入口:当且仅当配置了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 loop,DeepAgents 没有发明新机制,它只是把这套循环和中间件栈打包好了。


五、最小实验:把 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( model="openai:gpt-4o", tools=[], # 故意不给任何自定义工具 system_prompt="You 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 state(return {"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、严格事件驱动 → 直接 LangGraph,DeepAgents 帮倒忙
  • 超轻量场景:你只想做 “一次模型推理 + 一次工具” 这种两步任务 → 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%免费

http://www.jsqmd.com/news/1034109/

相关文章:

  • 钱学森的理想世界与我们的行动:走向人机共生的新文明
  • 三指电爪该怎么甄别?2026年优质三指电爪供货商家参考 - 品牌深度评测
  • 第10章:多模态输入入门
  • AI驱动三分钟搭建SM2国密应用:InsCode云IDE实战指南
  • ai欧美模特生成与商品展示,AI图工具实测如何助力服饰电商?
  • 售后完善的人力外包公司梳理,小白狮软件多少钱 - mypinpai
  • 豆包AI实操指南:从工具使用到认知协作的进阶地图
  • Gemini 3.1 Pro学术写作7大实战技巧:提升论文产出效率
  • Web自动化测试中的多窗口切换:原理、实战与避坑指南
  • 猎豹浏览器双核切换原理与Chromium内核调优实战
  • 085、PCIE MSI/MSI-X使能与配置
  • 微信聊天数据完全掌控指南:WeChatMsg让你永久保存每一段珍贵对话
  • DeepSeek V4推理经济学:KV Cache压缩与跨平台MoE工程实践
  • 机械臂夹爪怎么选?2026年实力机械臂夹爪厂家合作指南 - 品牌深度评测
  • 普通人如何真正用好Deepseek:四类生活场景实操指南
  • Windows安卓子系统WSABuilds完整教程:2407.40000.4.0_v2版本高效安装与优化指南
  • 基于Go的现代Web应用架构实践:从webgoc理念到云原生部署
  • 微信评选投票活动怎么做,西瓜评选+云帆投票+腾讯投票,投票调研测评 - 投票小程序
  • 终极指南:如何使用GSE高级宏编译器彻底改变你的魔兽世界游戏体验
  • Hutool SM2国密算法注释优化:从密钥格式到签名编码的实战解析
  • Midscene.js:5分钟搭建AI驱动的自动化测试沙盒环境
  • PCL-CHO 醛基化聚己内酯席夫碱反应配比优化避坑实验指南
  • 2026 宁波全域彩钢瓦翻新防水修缮四大正规企业权威横评|厂房金属屋面除锈喷漆公司优选对比 + 全套避坑指南 - 本地便民网
  • AI工具合规使用指南:账号安全与内容质量双保障
  • Linux SSH日志安全分析实战:从手动排查到自动化防御
  • 2026年6月熔化炉烟尘净化设备生产厂家推荐,工业环保设备/压铸机脱模剂气雾收集装置,熔化炉烟尘净化设备企业找哪家 - 品牌推荐师
  • 从零开始:如何为ACE-Step AI音乐生成器打造个性化主题界面
  • 2026年知名的8头多头拉丝机厂家 合作实力参考 - 工业品牌热点
  • 远程医疗+ChatGPT-4o:基层医生的智能钢笔实战指南
  • AES与RSA混合加密实战:原理、实现与安全部署指南