LangChain 与 LangGraph 在记忆管理上的核心差异可以概括为LangChain 是提供记忆工具的“工具箱”而 LangGraph 则是赋予了 Agent 管理状态能力的“骨架与引擎”。两者并非替代关系而是在构建复杂 AI 应用中互补协作。下面这个表格可以帮你更清晰地理解它们的区别 LangChain vs. LangGraph核心概念对比表维度LangChainLangGraph核心定位模块化工具箱提供各类标准组件工作流编排引擎定义复杂执行逻辑核心抽象链Chain、管道Pipeline图Graph执行模型严格线性难以实现循环和回溯支持循环、分支、条件路由和状态回溯状态/记忆管理方式通过Memory组件在外部管理独立于调用逻辑内置State图对象作为图的一部分在各节点间共享和流转状态/记忆实现层级基础为会话缓冲支持缓冲窗口、摘要、实体等多种预置类型核心为图状态的 Checkpoint并可实现短期、长期、分层混合记忆系统适用场景线性问答、RAG、工具链调用复杂 Agent、多轮对话、人工审批、状态需恢复或审计的场景为了让理解更透彻我们通过具体的代码案例来看看它们在实践中是如何工作的。 LangChain 案例使用ConversationBufferMemory实现基础记忆这个例子直接展示了如何让基于 LangChain 构建的对话链拥有短期记忆。# LangChain Memory 示例importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportConversationChain# 使用最简单的内存缓冲区来保存对话历史fromlangchain.memoryimportConversationBufferMemory load_dotenv()# 1. 初始化模型以阿里云百炼的 Qwen 为例llmChatOpenAI(modelqwen-plus,temperature0.7,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL,https://dashscope.aliyuncs.com/compatible-mode/v1),model_kwargs{extra_body:{enable_thinking:False}})# 2. 创建 Memory 和 ChainmemoryConversationBufferMemory()conversationConversationChain(llmllm,memorymemory,verboseTrue# 设为 True 可以看到内部处理流程)# 3. 多轮对话测试print(LangChain Memory 示例)response_1conversation.predict(input我叫小明我喜欢编程。)print(f助手:{response_1}\n)response_2conversation.predict(input你还记得我叫什么名字吗)print(f助手:{response_2}\n)代码分析ConversationBufferMemory是一个外部组件负责记录对话历史。ConversationChain将 LLM、Prompt、Memory 串联成一个线性链条。每次调用时它会自动从 Memory 中加载历史并拼接到 Prompt 中。局限性这是一种“被动”的记忆。记忆和“思考”调用模型是两个分离的步骤很难处理记忆需要根据模型输出进行复杂更新的场景。 LangGraph 案例基于状态图的智能 Agent这个案例构建了一个能进行多轮对话并可以根据用户指令“重置记忆”的 Agent。这是 LangGraph 管理的“动态状态”的一个典型应用。# LangGraph 状态管理示例importosfromtypingimportTypedDict,Literalfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,AIMessagefromlanggraph.graphimportStateGraph,END load_dotenv()# 1. 初始化模型llmChatOpenAI(modelqwen-plus,temperature0.7,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL,https://dashscope.aliyuncs.com/compatible-mode/v1),model_kwargs{extra_body:{enable_thinking:False}})# 2. 定义状态图的状态结构 (TypedDict)classAgentState(TypedDict):messages:list# 对话历史should_reset:bool# 重置标志# 3. 定义图节点 (Graph Nodes)defagent_node(state:AgentState):Agent 节点调用模型处理当前状态messagesstate[messages]responsellm.invoke(messages)return{messages:state[messages][response],should_reset:False}defcheck_reset_node(state:AgentState):分析是否需要重置状态last_messagestate[messages][-1].content# 如果用户说了“重置会话”则将 should_reset 标志设为 Trueif重置会话inlast_message:print( 检测到重置指令准备清空记忆...)# 清空历史消息保留最新一条是 AI 的响应return{messages:[],should_reset:True}return{should_reset:False}defreset_node(state:AgentState):执行状态重置并给出提示return{messages:[AIMessage(content好的我已经重置了我们的对话记忆。)],should_reset:False}# 4. 定义条件路由defshould_continue(state:AgentState)-Literal[continue,reset,end]:ifstate.get(should_reset):returnreset# 若没有重置指令判断是否是结束ifstate[messages]and退出instate[messages][-1].content:returnendreturncontinue# 5. 构建状态图 (StateGraph)builderStateGraph(AgentState)builder.add_node(agent,agent_node)builder.add_node(check_reset,check_reset_node)builder.add_node(reset,reset_node)builder.set_entry_point(agent)builder.add_edge(agent,check_reset)builder.add_conditional_edges(check_reset,should_continue,{continue:agent,reset:reset,end:END})builder.add_edge(reset,agent)# 重置后回到 agent 节点继续对话graphbuilder.compile()# 6. 运行测试print(LangGraph 状态管理示例)initial_state{messages:[HumanMessage(content我叫小明我喜欢编程。)]}final_stategraph.invoke(initial_state)print(f助手:{final_state[messages][-1].content}\n)# 告诉 AI 要重置会话second_stategraph.invoke({messages:final_state[messages][HumanMessage(content重置会话)]})print(f助手:{second_state[messages][-1].content}\n)# 重置后再次对话third_stategraph.invoke({messages:second_state[messages][HumanMessage(content你还记得我叫什么吗)]})print(f助手:{third_state[messages][-1].content})代码分析AgentState是图的核心。messages和should_reset这两个字段共同构成了 Agent 的“记忆”。agent_node和check_reset_node都能读取这个共享状态。check_reset_node根据模型输出动态修改should_reset标志触发了reset_node重置messages的操作。这里的“记忆”messages不再是独立组件而成为了 Agent“思考”agent_node和“行动”路由到不同节点的内在燃料。 LangChain 与 LangGraph协同工作的两种模式在实际开发中你不需要二选一因为 LangGraph 本身就是 LangChain 生态的一部分。它们通常以以下方式协同LangGraph 是“骨架”LangChain 是“血肉”LangGraph定义整个 Agent 的工作流骨架而每个图节点内部的具体任务如“调用 LLM”、“加载文档”等则由LangChain提供的工具和模块来完成。分层的记忆体系你可以使用LangChain的ConversationSummaryMemory对长对话生成摘要解决 LLM 上下文窗口限制然后将这个摘要作为“压缩后的历史”存入LangGraph的状态State中供后续节点使用。✨ 实践建议与面试准备今日实践修改LangChain案例中的 Memory 类型为ConversationBufferWindowMemory或ConversationSummaryMemory感受不同记忆策略的行为差异。在LangGraph案例中为AgentState添加一个user_preference字段并在对话中根据用户输入更新这个偏好让 Agent 表现得更加个性化。尝试将LangChain的ConversationSummaryMemory集成到LangGraph的agent_node中实现一个分层记忆的 Agent。面试准备问LangChain 和 LangGraph 能替代对方吗答不能。两者是互补而非替代关系。LangChain提供构建块LangGraph负责将这些块编排成复杂流程。LangGraph是LangChain生态向高复杂度场景的自然演进。问什么时候该用 LangGraph 而不是 LangChain答当你的 Agent 需要支持循环和回溯或需要长对话记忆与中断后恢复或需要人工介入审批又或是涉及多 Agent 协作时。问LangGraph 如何实现持久记忆答通过它的Checkpointer接口。它能在每一步执行后将整个图的状态State保存下来。当用户再次发起请求时如重启后的对话我们可以加载之前的checkpoint让 Agent 无缝“回忆”起之前的所有信息。如果对某个细节想要更深入的了解随时可以告诉我
16.3分别总结langchain 和langgraph 之间的区别
LangChain 与 LangGraph 在记忆管理上的核心差异可以概括为LangChain 是提供记忆工具的“工具箱”而 LangGraph 则是赋予了 Agent 管理状态能力的“骨架与引擎”。两者并非替代关系而是在构建复杂 AI 应用中互补协作。下面这个表格可以帮你更清晰地理解它们的区别 LangChain vs. LangGraph核心概念对比表维度LangChainLangGraph核心定位模块化工具箱提供各类标准组件工作流编排引擎定义复杂执行逻辑核心抽象链Chain、管道Pipeline图Graph执行模型严格线性难以实现循环和回溯支持循环、分支、条件路由和状态回溯状态/记忆管理方式通过Memory组件在外部管理独立于调用逻辑内置State图对象作为图的一部分在各节点间共享和流转状态/记忆实现层级基础为会话缓冲支持缓冲窗口、摘要、实体等多种预置类型核心为图状态的 Checkpoint并可实现短期、长期、分层混合记忆系统适用场景线性问答、RAG、工具链调用复杂 Agent、多轮对话、人工审批、状态需恢复或审计的场景为了让理解更透彻我们通过具体的代码案例来看看它们在实践中是如何工作的。 LangChain 案例使用ConversationBufferMemory实现基础记忆这个例子直接展示了如何让基于 LangChain 构建的对话链拥有短期记忆。# LangChain Memory 示例importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportConversationChain# 使用最简单的内存缓冲区来保存对话历史fromlangchain.memoryimportConversationBufferMemory load_dotenv()# 1. 初始化模型以阿里云百炼的 Qwen 为例llmChatOpenAI(modelqwen-plus,temperature0.7,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL,https://dashscope.aliyuncs.com/compatible-mode/v1),model_kwargs{extra_body:{enable_thinking:False}})# 2. 创建 Memory 和 ChainmemoryConversationBufferMemory()conversationConversationChain(llmllm,memorymemory,verboseTrue# 设为 True 可以看到内部处理流程)# 3. 多轮对话测试print(LangChain Memory 示例)response_1conversation.predict(input我叫小明我喜欢编程。)print(f助手:{response_1}\n)response_2conversation.predict(input你还记得我叫什么名字吗)print(f助手:{response_2}\n)代码分析ConversationBufferMemory是一个外部组件负责记录对话历史。ConversationChain将 LLM、Prompt、Memory 串联成一个线性链条。每次调用时它会自动从 Memory 中加载历史并拼接到 Prompt 中。局限性这是一种“被动”的记忆。记忆和“思考”调用模型是两个分离的步骤很难处理记忆需要根据模型输出进行复杂更新的场景。 LangGraph 案例基于状态图的智能 Agent这个案例构建了一个能进行多轮对话并可以根据用户指令“重置记忆”的 Agent。这是 LangGraph 管理的“动态状态”的一个典型应用。# LangGraph 状态管理示例importosfromtypingimportTypedDict,Literalfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,AIMessagefromlanggraph.graphimportStateGraph,END load_dotenv()# 1. 初始化模型llmChatOpenAI(modelqwen-plus,temperature0.7,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL,https://dashscope.aliyuncs.com/compatible-mode/v1),model_kwargs{extra_body:{enable_thinking:False}})# 2. 定义状态图的状态结构 (TypedDict)classAgentState(TypedDict):messages:list# 对话历史should_reset:bool# 重置标志# 3. 定义图节点 (Graph Nodes)defagent_node(state:AgentState):Agent 节点调用模型处理当前状态messagesstate[messages]responsellm.invoke(messages)return{messages:state[messages][response],should_reset:False}defcheck_reset_node(state:AgentState):分析是否需要重置状态last_messagestate[messages][-1].content# 如果用户说了“重置会话”则将 should_reset 标志设为 Trueif重置会话inlast_message:print( 检测到重置指令准备清空记忆...)# 清空历史消息保留最新一条是 AI 的响应return{messages:[],should_reset:True}return{should_reset:False}defreset_node(state:AgentState):执行状态重置并给出提示return{messages:[AIMessage(content好的我已经重置了我们的对话记忆。)],should_reset:False}# 4. 定义条件路由defshould_continue(state:AgentState)-Literal[continue,reset,end]:ifstate.get(should_reset):returnreset# 若没有重置指令判断是否是结束ifstate[messages]and退出instate[messages][-1].content:returnendreturncontinue# 5. 构建状态图 (StateGraph)builderStateGraph(AgentState)builder.add_node(agent,agent_node)builder.add_node(check_reset,check_reset_node)builder.add_node(reset,reset_node)builder.set_entry_point(agent)builder.add_edge(agent,check_reset)builder.add_conditional_edges(check_reset,should_continue,{continue:agent,reset:reset,end:END})builder.add_edge(reset,agent)# 重置后回到 agent 节点继续对话graphbuilder.compile()# 6. 运行测试print(LangGraph 状态管理示例)initial_state{messages:[HumanMessage(content我叫小明我喜欢编程。)]}final_stategraph.invoke(initial_state)print(f助手:{final_state[messages][-1].content}\n)# 告诉 AI 要重置会话second_stategraph.invoke({messages:final_state[messages][HumanMessage(content重置会话)]})print(f助手:{second_state[messages][-1].content}\n)# 重置后再次对话third_stategraph.invoke({messages:second_state[messages][HumanMessage(content你还记得我叫什么吗)]})print(f助手:{third_state[messages][-1].content})代码分析AgentState是图的核心。messages和should_reset这两个字段共同构成了 Agent 的“记忆”。agent_node和check_reset_node都能读取这个共享状态。check_reset_node根据模型输出动态修改should_reset标志触发了reset_node重置messages的操作。这里的“记忆”messages不再是独立组件而成为了 Agent“思考”agent_node和“行动”路由到不同节点的内在燃料。 LangChain 与 LangGraph协同工作的两种模式在实际开发中你不需要二选一因为 LangGraph 本身就是 LangChain 生态的一部分。它们通常以以下方式协同LangGraph 是“骨架”LangChain 是“血肉”LangGraph定义整个 Agent 的工作流骨架而每个图节点内部的具体任务如“调用 LLM”、“加载文档”等则由LangChain提供的工具和模块来完成。分层的记忆体系你可以使用LangChain的ConversationSummaryMemory对长对话生成摘要解决 LLM 上下文窗口限制然后将这个摘要作为“压缩后的历史”存入LangGraph的状态State中供后续节点使用。✨ 实践建议与面试准备今日实践修改LangChain案例中的 Memory 类型为ConversationBufferWindowMemory或ConversationSummaryMemory感受不同记忆策略的行为差异。在LangGraph案例中为AgentState添加一个user_preference字段并在对话中根据用户输入更新这个偏好让 Agent 表现得更加个性化。尝试将LangChain的ConversationSummaryMemory集成到LangGraph的agent_node中实现一个分层记忆的 Agent。面试准备问LangChain 和 LangGraph 能替代对方吗答不能。两者是互补而非替代关系。LangChain提供构建块LangGraph负责将这些块编排成复杂流程。LangGraph是LangChain生态向高复杂度场景的自然演进。问什么时候该用 LangGraph 而不是 LangChain答当你的 Agent 需要支持循环和回溯或需要长对话记忆与中断后恢复或需要人工介入审批又或是涉及多 Agent 协作时。问LangGraph 如何实现持久记忆答通过它的Checkpointer接口。它能在每一步执行后将整个图的状态State保存下来。当用户再次发起请求时如重启后的对话我们可以加载之前的checkpoint让 Agent 无缝“回忆”起之前的所有信息。如果对某个细节想要更深入的了解随时可以告诉我