news 2026/3/25 12:50:36

LangChain Agent 架构演进深度解析:从 AgentExecutor 到 LangGraph 与 LCEL

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain Agent 架构演进深度解析:从 AgentExecutor 到 LangGraph 与 LCEL

在过去的两三年中,LangChain 的 Agent 架构经历了翻天覆地的变化。对于许多开发者来说,从create_openai_tools_agentAgentExecutor迁移到现代化的架构不仅是 API 的替换,更是思维模式的根本转变。

本文将以极其详尽的代码实例,深度剖析 LangChain Agent 架构的“旧范式”与“新范式”,揭示它们背后的设计哲学差异,并指导你如何在企业级生产环境中做出正确的架构选择。

1. 旧范式:黑盒化的 AgentExecutor

1.1 核心组件

在 LangChain v0.1.0 时代(及更早),构建一个具备 Tool Calling 能力的 Agent 通常涉及两个核心组件:

  1. Factory Function (create_openai_tools_agent): 负责将 LLM、Prompt 和 Tools 组装成一个Runnable(Agent 定义)。
  2. Runtime Engine (AgentExecutor): 负责执行 Agent 的思考-行动循环(Think-Act Loop)。

1.2 代码解剖

让我们看一个典型的旧范式实现:

fromlangchain.agentsimportAgentExecutor,create_openai_tools_agentfromlangchain_openaiimportChatOpenAIfromlangchainimporthub# 1. 准备工具tools=[get_weather_tool,search_tool]# 2. 准备 Prompt (通常从 LangSmith Hub 拉取)# 这个 Prompt 包含了复杂的 {agent_scratchpad} 占位符,用于存放中间步骤prompt=hub.pull("hwchase17/openai-tools-agent")# 3. 初始化 LLMllm=ChatOpenAI(model="gpt-4-turbo",temperature=0)# 4. 创建 Agent (The Brain)# 这是一个 Runnable,输入是 {input, chat_history},输出是 AgentAction 或 AgentFinishagent=create_openai_tools_agent(llm,tools,prompt)# 5. 创建 Executor (The Body)# 这是一个循环控制器,负责解析 Agent 输出,执行工具,并将结果喂回给 Agentagent_executor=AgentExecutor(agent=agent,tools=tools,verbose=True,handle_parsing_errors=True,max_iterations=5)# 6. 执行result=agent_executor.invoke({"input":"What is the weather in SF?"})

1.3 致命缺陷

尽管AgentExecutor让 demo 跑得很快,但它在生产环境中暴露出了严重的问题:

  • 黑盒循环: 你无法控制循环的内部逻辑。比如,你想在 Tool 执行前人工审批?很难。你想在 Tool 报错时执行特定的重试策略?非常麻烦。
  • 流式输出困难:AgentExecutor的流式输出粒度非常粗(Step 级别),很难实现 Token 级别的平滑流式体验,尤其是在前端需要区分“思考内容”和“最终答案”时。
  • Prompt 强耦合: 它严重依赖特定的 Prompt 结构(如agent_scratchpad),导致切换模型或自定义 Prompt 变得异常痛苦。

2. 新范式:LCEL 与 LangGraph 的崛起

为了解决上述问题,LangChain 推出了两套互相配合的“新范式”:

  1. LCEL (LangChain Expression Language): 提供底层的、原子的组件组合能力。
  2. LangGraph: 提供状态机(State Machine)级别的循环控制能力。

2.1 方案 A:轻量级 LCEL (bind_tools)

如果你只需要一个简单的 Tool Calling 流程,不需要复杂的循环,LCEL 是最佳选择。

取代对象:create_openai_tools_agent

# 新范式:纯 LCEL 实现fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthrough# 1. 绑定工具 (Native Tool Calling)# 不再需要复杂的 create_xxx_agent,直接用 bind_toolsllm=ChatOpenAI(model="gpt-4-turbo")llm_with_tools=llm.bind_tools(tools)# 2. 定义简单的 Promptprompt=ChatPromptTemplate.from_messages([("system","You are a helpful assistant."),("user","{input}"),])# 3. 组合链chain=prompt|llm_with_tools# 4. 执行# 结果是原生的 AIMessage,包含 .tool_calls 属性msg=chain.invoke({"input":"What is the weather in SF?"})ifmsg.tool_calls:# 开发者自己决定如何执行工具,拥有完全的控制权fortool_callinmsg.tool_calls:print(f"Calling{tool_call['name']}with{tool_call['args']}")

优势:

  • 透明: 没有黑盒,每一步都是标准的 Runnable。
  • 原生: 直接利用模型原生的 Tool Calling API,不再需要 Prompt Hacking (agent_scratchpad)。

2.2 方案 B:LangGraph (prebuilt.create_react_agent)

如果你需要一个具备完整循环、记忆、流式输出能力的 Agent(即替代AgentExecutor),LangGraph 是标准答案。

取代对象:AgentExecutor

# 新范式:LangGraph 实现fromlanggraph.prebuiltimportcreate_react_agentfromlanggraph.checkpoint.memoryimportMemorySaver# 1. 初始化模型和工具model=ChatOpenAI(model="gpt-4-turbo")tools=[get_weather_tool]# 2. 状态持久化 (可选)checkpointer=MemorySaver()# 3. 创建 Graph# 这取代了 AgentExecutor,构建了一个标准的状态机图app=create_react_agent(model,tools,checkpointer=checkpointer)# 4. 执行 (支持细粒度流式)inputs={"messages":[("user","What is the weather in SF?")]}config={"configurable":{"thread_id":"thread-1"}}# stream_mode="values" 可以实时获取消息列表的更新foreventinapp.stream(inputs,config=config,stream_mode="values"):event["messages"][-1].pretty_print()

LangGraph 的核心优势:

  • 状态机架构: Agent 的逻辑被显式定义为图(Nodes & Edges)。你可以清晰地看到数据如何在Agent节点和Tools节点之间流转。
  • 完全可控的循环: 你可以插入Human-in-the-loop(人工介入)节点,可以在任何步骤暂停、修改状态、然后继续。
  • 原生持久化: 内置 Checkpointer 机制,完美解决长对话的记忆问题。

3. 深度对比总结

特性旧范式 (AgentExecutor)新范式 (LangGraph/LCEL)
控制流隐式、硬编码的 Pythonwhile循环显式的图结构 (Graph),可定制 Edge
Prompt依赖agent_scratchpad等魔术变量标准的消息列表 (list[BaseMessage])
流式能力弱,只能流式输出 Callback 事件强,支持 Token 级、消息级、更新级流式
调试难度困难,内部状态不可见容易,状态 (State) 是显式定义的字典
工具调用依赖 OutputParser 解析文本依赖模型原生的bind_toolsAPI

4. 迁移建议

  1. 对于简单任务: 如果你只是想让 LLM 调一个工具并返回结果,不要用 Agent。直接使用LCEL (llm.bind_tools)。它更快、更便宜、更稳定。
  2. 对于复杂 Agent: 立即迁移到LangGraphAgentExecutor已经被标记为 Legacy,且在复杂场景下(如多 Agent 协作)几乎不可用。LangGraph 提供了构建生产级 Agent 所需的一切原语。

拥抱新范式,意味着你不再是框架的“使用者”,而是 Agent 逻辑的“编排者”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 20:02:54

光伏电池 光伏电池输出特性 光照强度 环境温度 对输出特性的影响 UI曲线 PU曲线

光伏电池 光伏电池输出特性 光照强度 环境温度 对输出特性的影响 UI曲线 PU曲线 还有相关参考可以光伏电池这玩意儿挺有意思的,就像个看天吃饭的主儿。今儿咱们拿Python搞点实验,看看光照和温度怎么调戏它的输出特性。先整个基础模型——单二极管模型&a…

作者头像 李华
网站建设 2026/3/24 12:33:42

VibeVoice Pro一文详解:300ms TTFB如何通过音素预测实现实时开口

VibeVoice Pro一文详解:300ms TTFB如何通过音素预测实现实时开口 1. 什么是VibeVoice Pro:不只是TTS,而是实时语音基座 你有没有遇到过这样的场景?用户刚说完一句话,AI助手却要等1秒多才开始回应——那短暂的沉默&am…

作者头像 李华
网站建设 2026/3/15 19:51:06

亲测Z-Image-Turbo生成产品图,商业可用性强

亲测Z-Image-Turbo生成产品图,商业可用性强 1. 为什么这款图像生成模型值得电商人重点关注 你有没有遇到过这些场景: 刚上新一批保温杯,急着发小红书却卡在找图环节——请摄影师要排期、修图师手头紧、外包图库又千篇一律; 做跨…

作者头像 李华
网站建设 2026/3/22 11:18:23

Flutter 三端应用实战:OpenHarmony 简易倒序文本查看器开发指南

一、为什么需要“简易倒序文本查看器”? 在 OpenHarmony 的教育、开发与趣味探索场景中,字符串倒序是一个看似简单却极具启发性的操作: 编程初学者:理解字符串不可变性与序列操作;语言学习者:观察回文词&…

作者头像 李华
网站建设 2026/3/15 23:43:37

Z-Image-Turbo使用全记录:一次成功的AI尝试

Z-Image-Turbo使用全记录:一次成功的AI尝试 上周五下午三点,我合上笔记本电脑,盯着屏幕上刚生成的那张图——敦煌飞天手持琵琶悬于云海之间,金箔纹路清晰可辨,衣袂飘动如被风拂过,右下角一行小楷题跋“天衣…

作者头像 李华
网站建设 2026/3/15 23:43:35

C# 与 Halcon 17.12 的梦幻联动:打造强大视觉项目

C#联合Halcon视觉框架,可以根据项目配置工程,选择对应halcon脚本,可以编译修改脚本,调试相机,创建模板,可以查看检测信息,生产履历,保存历史图像,跟三菱FX5U以太网通讯&a…

作者头像 李华