AI创想

标题: 【LangChain】LangChain agents 迁移至 LangGraph [打印本页]

作者: dzmzyqy    时间: 昨天 16:51
标题: 【LangChain】LangChain agents 迁移至 LangGraph
作者:彬彬侠
代码中使用 initialize_agent 函数(通常用于创建 LangChain 代理,如 AgentExecutor),会触发 LangChainDeprecationWarning,提示虽然 LangChain 代理仍受支持,但新用例应使用 LangGraph,因为 LangGraph 提供更灵活、功能更强大的代理构建框架,支持工具调用、状态持久化和人机交互工作流。本文基于 LangChain 0.3.x,详细解释如何将基于 initialize_agent 的代理迁移到 LangGraph,并提供代码示例。
代码废弃告警:
LangChainDeprecationWarning: LangChain agents will continue to be supported, but it is recommended for new use cases to be built with LangGraph. LangGraph offers a more flexible and full-featured framework for building agents, including support for tool-calling, persistence of state, and human-in-the-loop workflows. For details, refer to the LangGraph documentation <https://langchain-ai.github.io/langgraph/>_ as well as guides for Migrating from AgentExecutor <https://python.langchain.com/docs/how_to/migrate_agent/>_ and LangGraph’s Pre-built ReAct agent <https://langchain-ai.github.io/langgraph/how-tos/create-react-agent/>_.
agent = initialize_agent( ……

为什么需要迁移?

initialize_agent 和 AgentExecutor 是 LangChain 早期用于快速创建代理的工具,适合简单的工具调用场景,但存在以下局限:
LangGraph 是 LangChain 推荐的新框架,优势包括:
官方建议参考以下资源:

迁移步骤

以下是将基于 initialize_agent 的代理迁移到 LangGraph 的详细步骤,假设原代码使用 OpenAI 模型和工具调用。
1. 分析原始代码

假设你的代码使用 initialize_agent 创建一个带工具的 ReAct 代理,如下:
  1. import os
  2. os.environ["OPENAI_API_KEY"]="Your OpenAI API Key"from langchain.agents import initialize_agent, AgentType
  3. from langchain.chat_models import ChatOpenAI
  4. from langchain.tools import Tool
  5. # 定义工具defsearch_web(query):# 模拟网络搜索 APIreturnf"搜索 {query} 的结果:[示例内容]"
  6. tools =[
  7.     Tool(
  8.         name="WebSearch",
  9.         func=search_web,
  10.         description="搜索网络以获取信息")]# 初始化 LLM
  11. llm = ChatOpenAI(temperature=0, model="gpt-4o")# 初始化代理
  12. agent = initialize_agent(
  13.     tools=tools,
  14.     llm=llm,
  15.     agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
  16.     verbose=True)# 调用代理
  17. response = agent.run("纽约的天气如何?")print(response)
复制代码
输出示例
  1. [代理使用 WebSearch 工具] 纽约的天气是晴天,最高气温 24°C。
复制代码
问题
2. 安装必要依赖

确保安装 LangChain 0.3.x、LangGraph 和 langchain-openai:
  1. pip install --upgrade langchain langchain-openai langgraph langchain-community
复制代码
3. 迁移到 LangGraph 的预构建 ReAct 代理

LangGraph 提供了 create_react_agent 函数,可直接替代 ReAct 代理。以下是迁移后的代码:
  1. import os
  2. os.environ["OPENAI_API_KEY"]="Your OpenAI API Key"from langchain_openai import ChatOpenAI
  3. from langchain_core.tools import tool
  4. from langgraph.prebuilt import create_react_agent
  5. # 定义工具@tooldefsearch_web(query:str)->str:"""搜索网络以获取信息。"""# 模拟网络搜索 APIreturnf"搜索 {query} 的结果:[示例内容]"
  6. tools =[search_web]# 初始化 LLM
  7. llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")# 创建 LangGraph ReAct 代理
  8. agent = create_react_agent(llm, tools)# 调用代理
  9. response = agent.invoke({"messages":[{"role":"human","content":"纽约的天气如何?"}]})for message in response["messages"]:if message["role"]=="assistant":print(message["content"])
复制代码
输出示例
  1. [代理使用 search_web 工具] 纽约的天气是晴天,最高气温 24°C。
复制代码
代码说明

4. 添加状态持久化(可选)

LangGraph 支持通过 MemorySaver 持久化代理状态(消息和工具调用)。以下是添加持久化的代码:
  1. import os
  2. os.environ["OPENAI_API_KEY"]="Your OpenAI API Key"from langchain_openai import ChatOpenAI
  3. from langchain_core.tools import tool
  4. from langgraph.prebuilt import create_react_agent
  5. from langgraph.checkpoint.memory import MemorySaver
  6. import uuid
  7. # 定义工具@tooldefsearch_web(query:str)->str:"""搜索网络以获取信息。"""returnf"搜索 {query} 的结果:[示例内容]"
  8. tools =[search_web]# 初始化 LLM
  9. llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")# 初始化内存
  10. memory = MemorySaver()# 创建 LangGraph ReAct 代理
  11. agent = create_react_agent(llm, tools, checkpointer=memory)# 生成唯一会话 ID
  12. session_id =str(uuid.uuid4())# 调用代理
  13. response = agent.invoke({"messages":[{"role":"human","content":"纽约的天气如何?"}]},
  14.     config={"configurable":{"thread_id": session_id}})for message in response["messages"]:if message["role"]=="assistant":print(message["content"])# 继续对话
  15. response = agent.invoke({"messages":[{"role":"human","content":"明天呢?"}]},
  16.     config={"configurable":{"thread_id": session_id}})for message in response["messages"]:if message["role"]=="assistant":print(message["content"])
复制代码
输出示例
  1. [代理使用 search_web 工具] 纽约的天气是晴天,最高气温 24°C。
  2. [代理使用 search_web 工具] 明天纽约的天气是多云,最高气温 22°C。
复制代码
说明
5. 使用数据库存储(可选)

若需生产环境中持久化状态,可使用 SQLite 代替内存存储:
  1. from langgraph.checkpoint.sqlite import SqliteSaver
  2. # 替换 MemorySaver 为 SqliteSaver
  3. memory = SqliteSaver.from_conn_string("agent_state.db")
  4. agent = create_react_agent(llm, tools, checkpointer=memory)
复制代码
状态将存储在 SQLite 数据库(agent_state.db),支持应用重启后恢复。
6. 测试与验证


注意事项


常见问题

Q1:可以继续使用 initialize_agent 吗?
A:可以,但不建议用于新项目。它将支持到 LangChain 1.0,但缺乏 LangGraph 的灵活性和未来兼容性。
Q2:LangGraph 使用难度高吗?
A:对于简单 ReAct 代理,create_react_agent 与 initialize_agent 一样简单。复杂工作流需学习 LangGraph 的图结构,但功能更强大。
Q3:工具复杂时怎么办?
A:使用 StructuredTool 定义多输入或复杂 schema 的工具,确保输出符合模型的工具调用要求。
Q4:持久化会影响性能吗?
A:MemorySaver(内存)开销极低,数据库(如 SqliteSaver)会增加轻微延迟,但提供持久性。

总结

从 initialize_agent 迁移到 LangGraph 的步骤包括:

原文地址:https://blog.csdn.net/u013172930/article/details/147641795




欢迎光临 AI创想 (https://llms-ai.com/) Powered by Discuz! X3.4