如何在LangChain的React Agent或OpenAI工具代理的工具中访问LangGraph的状态?
如何在LangChain的React Agent或OpenAI工具代理的工具中访问LangGraph的状态?
嘿,我来给你捋捋怎么解决这个问题~你想在工具里拿到LangGraph的状态或者传递user_id这类变量,其实有几个实用的办法,我一个个给你说:
方法一:把状态变量作为Agent输入传递,让工具直接接收参数
首先,你需要确保LangGraph的状态里包含user_id这类你需要的变量,然后在调用Agent的节点里,把这些变量从状态中提取出来,加到Agent的输入上下文里。比如:def agent_node(state): # 从LangGraph状态里取出user_id user_id = state["user_id"] # 构造Agent的输入,把user_id和用户提问、对话历史一起传进去 agent_input = { "input": state["input"], "user_id": user_id, "chat_history": state.get("chat_history", []) } # 调用Agent执行器 result = agent_executor.invoke(agent_input) # 返回更新后的状态 return {"agent_outcome": result}然后你的工具就可以直接把
user_id作为参数接收,记得要在工具的描述里明确说明参数用途,这样Agent才知道要传递这个值:@tool def get_goals(user_id: int): """ Returns the user's goals. Args: user_id: The ID of the user whose goals you want to retrieve. """ # 这里就可以用user_id查询对应数据啦 return f"Goals for user {user_id}: ..."方法二:用类工具绑定状态变量
如果你不想依赖Agent自动传递参数,也可以把工具定义成类,这样就能直接把LangGraph的状态变量绑定到工具实例上。比如:from langchain.tools import BaseTool class GetGoalsTool(BaseTool): name = "get_goals" description = "Returns the user's goals." # 定义属性存储需要的user_id user_id: int def _run(self): # 直接用绑定好的user_id就行 return f"Goals for user {self.user_id}: ..."然后在LangGraph的Agent节点里,动态创建工具实例并传入
user_id:def agent_node(state): user_id = state["user_id"] # 动态生成带user_id的工具实例 tools = [GetGoalsTool(user_id=user_id)] # 重新创建Agent执行器(或者也可以把工具列表放到状态里管理) agent_executor = create_openai_tools_agent(tools=tools, llm=llm, prompt=prompt) result = agent_executor.invoke({"input": state["input"]}) return {"agent_outcome": result}方法三:修改Agent提示词,引导它传递状态变量
你还可以在Agent的提示词里明确告诉它,要使用状态里的user_id来调用工具。比如:from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个助手,调用需要用户ID的工具时,必须使用上下文里的{user_id}参数。"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}") ]) # 创建Agent时用这个提示词 agent_executor = create_openai_tools_agent(tools=tools, llm=llm, prompt=prompt)搭配方法一的Agent输入传递,这样Agent就会自动把
user_id作为参数传给工具啦。
最后别忘了,要确保LangGraph的状态结构里包含你需要的变量,比如用TypedDict定义状态:
from langgraph.graph import StateGraph, END from typing import TypedDict, List class State(TypedDict): input: str user_id: int chat_history: List agent_outcome: dict # 构建并编译LangGraph graph_builder = StateGraph(State) graph_builder.add_node("agent", agent_node) graph_builder.set_entry_point("agent") graph_builder.add_edge("agent", END) graph = graph_builder.compile() # 调用时传入初始状态 result = graph.invoke({ "input": "我的目标是什么?", "user_id": 12345, "chat_history": [] })
备注:内容来源于stack exchange,提问作者Javier Tejero
相关产品推荐
相关产品推荐

