AI创想

标题: 【LangGraph】langgraph.prebuilt.InjectedStore 类:在工具函数中注入 LangGraph 的存储对象(Store) [打印本页]

作者: AI小编    时间: 昨天 09:46
标题: 【LangGraph】langgraph.prebuilt.InjectedStore 类:在工具函数中注入 LangGraph 的存储对象(Store)
作者:彬彬侠
详细介绍 langgraph.prebuilt.InjectedStore 类

langgraph.prebuilt.InjectedStore 是 LangGraph 库中 langgraph.prebuilt 模块的一个类型注解类,继承自 InjectedToolArg,用于在工具函数中注入 LangGraph 的存储对象(Store)。LangGraph 是 LangChain 生态的扩展,专注于构建复杂、有状态、多步骤的交互式应用,通过状态图管理节点和边,支持动态路由、循环和状态管理。InjectedStore 允许工具访问持久化存储(如对话历史、用户数据),而不暴露给语言模型(LLM),确保安全性和开发效率。以下是对其详细、条理清晰的介绍,基于提供的参考信息和 LangGraph 文档。

1. 定义与功能

1.1 类定义
  1. from langgraph.prebuilt import InjectedStore
  2. classInjectedStore(InjectedToolArg):"""
  3.     用于工具参数的注解,表示该参数将注入 LangGraph 的存储对象。
  4.     参数:
  5.         field: 可选,指定存储中要注入的特定键。如果为 None,则注入整个存储对象。
  6.     示例:
  7.         @tool
  8.         def store_tool(x: int, my_store: Annotated[Any, InjectedStore()]) -> str:
  9.             '''处理存储的工具。'''
  10.             stored_value = my_store.get(("values",), "foo").value["bar"]
  11.             return stored_value + x
  12.     """
复制代码
1.2 核心功能

1.3 使用场景


2. 用法

InjectedStore 与 typing_extensions.Annotated 结合使用,注解工具函数的参数。基本步骤如下:

3. 实现原理

3.1 存储注入机制

3.2 与 ToolNode 的协作

3.3 存储格式


4. 使用示例

4.1 基本示例

以下是一个独立工具节点的示例,展示 InjectedStore 的使用。
  1. from typing import Any
  2. from typing_extensions import Annotated
  3. from langchain_core.messages import AIMessage
  4. from langchain_core.tools import tool
  5. from langgraph.store.memory import InMemoryStore
  6. from langgraph.prebuilt import InjectedStore, ToolNode
  7. # 创建存储并添加数据
  8. store = InMemoryStore()
  9. store.put(("values",),"foo",{"bar":2})# 定义工具@tooldefstore_tool(x:int, my_store: Annotated[Any, InjectedStore()])->str:"""处理存储的工具。"""
  10.     stored_value = my_store.get(("values",),"foo").value["bar"]returnstr(stored_value + x)# 创建 ToolNode
  11. node = ToolNode([store_tool])# 定义工具调用和状态
  12. tool_call ={"name":"store_tool","args":{"x":1},"id":"1","type":"tool_call"}
  13. state ={"messages":[AIMessage("", tool_calls=[tool_call])],}# 执行工具节点,传入存储
  14. result = node.invoke(state, store=store)print(result["messages"][0].content)# 输出: 3
复制代码
解析

4.2 集成到状态图

以下是将工具集成到完整状态图的示例。
  1. from langgraph.graph import StateGraph, END
  2. from langchain_openai import ChatOpenAI
  3. from langchain_core.prompts import ChatPromptTemplate
  4. from langchain_core.messages import HumanMessage
  5. # 定义状态classState(TypedDict):
  6.     messages: List[BaseMessage]# 定义 Agent 节点defagent(state: State)-> State:
  7.     prompt = ChatPromptTemplate.from_template("根据输入调用工具:{input}")
  8.     llm = ChatOpenAI(model="gpt-3.5-turbo").bind_tools([store_tool])
  9.     message = llm.invoke(state["messages"][-1].content)
  10.     state["messages"].append(message)return state
  11. # 构建状态图
  12. workflow = StateGraph(State)
  13. workflow.add_node("agent", agent)
  14. workflow.add_node("tools", node)
  15. workflow.add_edge("tools","agent")
  16. workflow.add_conditional_edges("agent",lambda state:"tools"if state["messages"][-1].tool_calls else END)
  17. workflow.set_entry_point("agent")# 编译并运行
  18. graph = workflow.compile()
  19. initial_state ={"messages":[HumanMessage(content="处理数字 1")]}
  20. result = graph.invoke(initial_state, store=store)print(result["messages"][-1].content)# 输出: 3
复制代码
解析


5. 使用场景

示例场景

6. 注意事项


7. 与其他注解的对比

注解用途是否暴露给 LLM示例场景
InjectedStore注入 LangGraph 存储对象工具访问持久化数据
InjectedState注入状态图状态工具访问对话历史或用户上下文
InjectedToolArg注入运行时参数(如特定值)注入动态用户 ID 或会话令牌
RunnableConfig注入运行时配置(如执行设置)传递执行超时或元数据
InjectedStore 专注于持久化存储,适合需要长期记忆的工具,而 InjectedState 更适合当前状态。

8. 总结

langgraph.prebuilt.InjectedStore 是一个高效的类型注解,用于在 LangGraph 工具中注入存储对象。它通过隐藏存储参数,防止 LLM 生成敏感数据,同时允许工具访问持久化数据,实现安全、上下文相关的操作。支持注入整个存储或特定字段,与 ToolNode 无缝集成,适用于聊天机器人、自动化工作流等场景。通过自动注入机制,它简化了存储管理,提升了开发效率。

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




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