AI创想

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

作者: AI小编    时间: 2025-12-24 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