LangGraph 中如何实现状态注入:InjectedState

注入状态 指的是让工具函数能够直接访问 LangGraph 图的当前状态(如定义的 AgentState,同时这个状态参数对 LLM 是不可见的。也就是说,LLM 在决定调用工具时,不会、也不需要去生成这个参数,它由 LangGraph 框架自动填充。这样做的好处是安全且解耦,工具内部可以按需读取或更新上下文


如何实现

实现状态注入的核心是使用 langgraph.prebuilt.InjectedState 这个特殊的类型注解,并结合 ToolNode 来执行工具

1. 定义带注入状态参数的工具

在工具函数中,为需要接收状态的那个参数添加 Annotated[状态类型, InjectedState] 注解

python 复制代码
from typing import Annotated
from langgraph.prebuilt import InjectedState
from langchain_core.tools import tool

# 假设状态定义如下
class AgentState(TypedDict):
    messages: Annotated[Sequence[BaseMessage], add_messages]
    document: str  # 新增的文档字段

@tool
def update_document(content: str, state: Annotated[AgentState, InjectedState]) -> str:
    """使用新内容更新当前文档。"""
    # 直接读取和修改状态
    old_content = state.get("document", "")
    state["document"] = content
    return f"文档已更新。\n旧内容: {old_content}\n新内容: {content}"

在这个例子里:

  • content: str 是正常的工具参数,由 LLM 根据提示词和工具描述来生成
  • state: Annotated[AgentState, InjectedState] 则是一个注入参数。InjectedState 注解告诉 ToolNode 在执行时,自动将当前的 AgentState 对象传递给这个参数

关键点

  • LLM 对此参数无感知 :LLM 在生成工具调用时,只会生成 content 字段,不会生成 state 字段,state 由系统在后台注入
  • 支持注入子字段 :也可以只注入状态中的某个特定字段,如 Annotated[str, InjectedState("document")],这样工具的这个参数就会直接接收到 state["document"] 的值

2. 使用 ToolNode 执行工具

ToolNode 包装工具列表,并将其作为图中的一个节点。ToolNode 会自动处理 InjectedState 注解的参数注入

python 复制代码
from langgraph.prebuilt import ToolNode

tools = [update_document, save_document]
tool_node = ToolNode(tools)

# ... 在图构建中 ...
graph.add_node("tools", tool_node)

3. 在 Agent 节点中绑定工具并调用

在主 Agent 节点函数中,将工具列表绑定到模型,并处理模型的响应

python 复制代码
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="mimo-v2.5-pro").bind_tools(tools)

def our_agent(state: AgentState) -> AgentState:
    # 构造消息并调用模型
    response = model.invoke([system_prompt] + state["messages"])
    return {"messages": [response]}  # 响应可能包含 tool_calls

注意事项

  • ToolNode 是必须的InjectedState 注解的自动处理依赖于 ToolNode 的执行上下文。如果通过其他方式直接调用工具函数,注入可能不会生效
  • 检查点与状态更新 :直接在工具中修改的 state 对象,它的变更会在图执行过程中被 checkpointer(如果配置了)自动记录下来,从而实现对话记忆或状态回滚功能,因此可以放心地修改它
相关推荐
早点睡啊Y5 小时前
深入学LangChain官方文档:Observability 与 Studio——先看清 Agent 到底做了什么
java·数据库·langchain
BraveWang6 小时前
【LangChain 1.x】12、HITL人机协同|敏感操作审批、四种决策与条件拦截
langchain
青山是哪个青山7 小时前
LangChain 1.x 学习笔记(一):为什么需要 LangChain?一文彻底理解 LangChain 生态
笔记·学习·langchain
草莓熊Lotso7 小时前
【LangChain】核心组件详解:文档加载器(Document Loaders)
开发语言·c++·python·langchain·软件工程
早点睡啊Y10 小时前
精读 LangChain 官方文档(三):
服务器·数据库·langchain
chaors1 天前
DeepResearchSystem 0x01:Agent 基础
langchain·aigc·ai编程
一只小bit1 天前
LangGraph 子图使用和房源搜索Agent综合案例实现
机器学习·langchain·llm·langgraph
bloglin999991 天前
langchain 和 langgraph 和 react
javascript·react.js·langchain
吃饱了得干活1 天前
LangChain Agent 高级玩法:命名、结构化输出与流式模式
langchain·llm·agent
phltxy1 天前
LangGraph智能租房助手实践
大数据·人工智能·python·深度学习·语言模型·langchain