AI创想

标题: 【LangGraph】langgraph.prebuilt.InjectedState 类:工具函数中注入状态图的当前状态 [打印本页]

作者: AI小编    时间: 昨天 09:31
标题: 【LangGraph】langgraph.prebuilt.InjectedState 类:工具函数中注入状态图的当前状态
作者:彬彬侠
langgraph.prebuilt.InjectedState 是 LangGraph 库中 langgraph.prebuilt 模块的一个特殊类型注解,继承自 InjectedToolArg,用于在工具函数中注入 LangGraph 状态图的当前状态。它允许工具在运行时访问状态(如对话历史或用户上下文),同时隐藏该参数,使语言模型(LLM)无法生成或修改状态,从而提高安全性和开发效率。以下是对 InjectedState 类的有序、清晰介绍,基于提供的参考信息和 LangGraph 文档。

1. 定义与功能

1.1 类定义

InjectedState 是一个类型注解类,定义如下:
  1. from langgraph.prebuilt import InjectedState
  2. classInjectedState(InjectedToolArg):"""
  3.     用于工具参数的注解,表示该参数将注入状态图的当前状态。
  4.     参数:
  5.         field: 可选,指定状态中要注入的特定键。如果为 None,则注入整个状态。
  6.     示例:
  7.         @tool
  8.         def state_tool(x: int, state: Annotated[dict, InjectedState]) -> str:
  9.             '''处理状态的工具。'''
  10.             if len(state["messages"]) > 2:
  11.                 return state["foo"] + str(x)
  12.             else:
  13.                 return "消息不足"
  14.     """def__init__(self, field: Optional[str]=None)->None:
  15.         self.field = field
复制代码
1.2 核心功能

1.3 使用场景


2. 参数与用法

2.1 参数

2.2 用法

InjectedState 通常与 typing_extensions.Annotated 一起使用,注解工具函数的参数。以下是基本用法:

3. 实现原理

3.1 状态注入机制

3.2 与 ToolNode 的协作

3.3 状态格式


4. 使用示例

以下是一个完整的示例,展示如何使用 InjectedState 在状态图中注入状态到工具。
4.1 示例代码
  1. from typing import List
  2. from typing_extensions import Annotated, TypedDict
  3. from langchain_core.messages import BaseMessage, AIMessage
  4. from langchain_core.tools import tool
  5. from langgraph.prebuilt import InjectedState, ToolNode
  6. # 定义状态classAgentState(TypedDict):
  7.     messages: List[BaseMessage]
  8.     foo:str# 定义工具 1:访问整个状态@tooldefstate_tool(x:int, state: Annotated[dict, InjectedState])->str:"""根据状态中的消息数量处理输入。"""iflen(state["messages"])>2:return state["foo"]+str(x)else:return"消息不足"# 定义工具 2:访问特定字段@tooldeffoo_tool(x:int, foo: Annotated[str, InjectedState("foo")])->str:"""处理状态中的 foo 字段。"""return foo +str(x +1)# 创建 ToolNode
  9. tools =[state_tool, foo_tool]
  10. node = ToolNode(tools)# 定义状态和工具调用
  11. tool_call1 ={"name":"state_tool","args":{"x":1},"id":"1","type":"tool_call"}
  12. tool_call2 ={"name":"foo_tool","args":{"x":1},"id":"2","type":"tool_call"}
  13. state ={"messages":[AIMessage("", tool_calls=[tool_call1, tool_call2])],"foo":"bar"}# 执行工具节点
  14. result = node.invoke(state)for msg in result["messages"]:print(f"{msg.__class__.__name__}: {msg.content}")
复制代码
4.2 输出示例
  1. ToolMessage: 消息不足
  2. ToolMessage: bar2
复制代码
4.3 代码解析

4.4 集成到状态图

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

5. 使用场景

InjectedState 适用于以下场景:
示例场景

6. 注意事项


7. 与其他注解的对比

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

8. 总结

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

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




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