☰
LangGraph == 图的状态(State)管理 (下)
2026/10/14 6:25:36 网站建设 项目流程

3.5. 预定义状态

3.5.1. MessagesState

LangGraph构建的计算图通常会和LLM结合使用,而LLM在运行过程中通常需要维护一组消息列表。为了提升开发效率,LangGraph官方提供了一个预定义状态类型:langgraph.graph.message.MessagesState。

开发者可以直接继承该状态类型,并在其基础上扩展自定义状态字段。

源码如下:

class MessagesState(TypedDict): messages: Annotated[list[AnyMessage], add_messages]

由此可知,MessagesState只有一个字段:messages。

该字段的类型是列表,元素类型为AnyMessage;同时,它通过Annotated绑定了内置Reducer函数add_messages。

add_messages的完全限定名(英文全称fully qualified name)是:

langgraph.graph.message.add_messages,正是上文 3.2.2.3.2 节介绍的内置Reducer函数。

示例如下:

from typing import NotRequired from langgraph.graph import StateGraph, START, END from langgraph.graph.message import MessagesState from langchain_core.messages import HumanMessage from langchain_deepseek import ChatDeepSeek from dotenv import load_dotenv load_dotenv(verbose=True) model = ChatDeepSeek( model="deepseek-v4-flash", extra_body={"thinking": {"type": "enabled"}}, ) class OverAllState(MessagesState): username: str output: NotRequired[str] # 关键:改为可选 # 不返回 output,让它保持未设置状态(或者返回空字符串) def node_a(state: OverAllState) -> OverAllState: return { "messages": [HumanMessage(content="你好,我是" + state["username"])], "username": state["username"], } def llm_node(state: OverAllState) -> OverAllState: res = model.invoke(state["messages"]) return { "messages": [res], "username": state["username"], "output": res.content, } builder = StateGraph(state_schema=OverAllState) builder.add_node("llm_node", llm_node) builder.add_node("node_a", node_a) builder.add_edge(START, "node_a") builder.add_edge("node_a", "llm_node") builder.add_edge("llm_node", END) graph = builder.compile() result = graph.invoke({"username": "小黄"}) print(result)

输出如下

{ "messages": [ HumanMessage( content="你好,我是 小黄", additional_kwargs={}, response_metadata={}, id="155e1ef4-5bbc-4250-b978-62a7a5918cef", ), AIMessage( content="你好呀,小黄!😊 我是DeepSeek,很高兴认识你!有什么我可以帮你的吗?无论是聊天、解答问题、帮你写作、编程,还是其他任何需要,尽管告诉我吧!你名字里的“黄”是哪个黄呀?😄", additional_kwargs={ "refusal": "None", }, response_metadata={ "token_usage": { "completion_tokens": 57, "prompt_tokens": 10, "total_tokens": 67, "completion_tokens_details": "None", "prompt_tokens_details": { "audio_tokens": "None", "cached_tokens": 0, }, "prompt_cache_hit_tokens": 0, "prompt_cache_miss_tokens": 10, }, "model_provider": "deepseek", "model_name": "deepseek-v4-flash", "system_fingerprint": "fp_8b330d02d0_prod0820_fp8_kvcache_20260402", "id": "17d57633-2ffb-4af3-be87-b3d58f9acd2b", "finish_reason": "stop", "logprobs": "None", }, id="lc_run--019e6890-4544-7212-b4f2-aa20fc079911-0", tool_calls=[], invalid_tool_calls=[], usage_metadata={ "input_tokens": 10, "output_tokens": 57, "total_tokens": 67, "input_token_details": { "cache_read": 0, }, "output_token_details": {}, }, ), ], "username": "小黄", "output": "你好呀,小黄!😊 我是DeepSeek,很高兴认识你!有什么我可以帮你的吗?无论是聊天、解答问题、帮你写作、编程,还是其他任何需要,尽管告诉我吧!你名字里的“黄”是哪个黄呀?😄", }

上述案例中,OverAllState继承了MessagesState,因此可用的状态字段为

messages username output

只关注messages状态,执行流程如下:

  1. node_a返回一条HumanMessage;
  2. LangGraph使用add_messages将该消息合并到messages状态字段中;
  3. llm_node从state["messages"]中读取完整消息列表,并调用模型;
  4. llm_node将模型生成的AIMessage作为状态更新返回;
  5. LangGraph再次通过add_messages将AIMessage合并到messages中;
  6. 最终状态中包含完整消息列表。

MessagesState帮开发者预先定义好了messages字段及其合并规则。在构建聊天机器人、Agent、工具调用流程、多轮对话流程时,它可以提升开发效率。

3.5.2. AgentState

AgentState是LangChain Agent内部使用的状态类型。由于LangChain Agent底层也是基于LangGraph运行图构建的,所以从技术上讲,开发者也可以将AgentState或其子类作为自定义LangGraph的状态类型。

AgentState的全类名,也可以称为类的完全限定名(英文全称:fully qualified class name)是:langchain.agents.middleware.types.AgentState

源码如下

class AgentState(TypedDict, Generic[ResponseT]): """State schema for the agent.""" messages: Required[Annotated[list[AnyMessage], add_messages]] jump_to: NotRequired[Annotated[JumpTo | None, EphemeralValue, PrivateStateAttr]] structured_response: NotRequired[Annotated[ResponseT, OmitFromInput]]

该状态中主要包含三个字段。

messages

messages: Required[Annotated[list[AnyMessage], add_messages]]

messages用于存储 Agent 运行过程中的消息列表。

该字段和MessagesState中的messages字段类似,也使用add_messages作为Reducer。

jump_to

jump_to: NotRequired[Annotated[JumpTo | None, EphemeralValue, PrivateStateAttr]]

jump_to是LangChain Agent内部使用的控制字段,主要服务于 Agent 中间件体系。

它通常用于表示运行流程的跳转意图,例如某些中间件希望影响 Agent 后续应该进入哪个节点。

需要注意的是,jump_to并不是普通 LangGraph 状态图中的通用跳转机制。

在自定义StateGraph中,即使状态中定义了jump_to字段,LangGraph也不会因为该字段的值自动跳转到某个节点。普通LangGraph运行图如果需要控制后续流向,通常应使用:

Command(goto="node_name")

见下文。

structured_response

structured_response: NotRequired[Annotated[ResponseT, OmitFromInput]]

structured_response用于存储 Agent 最终生成的结构化输出。

当使用LangChain Agent的结构化输出能力时,例如指定response_format,Agent 最终生成的结构化结果通常会被写入该字段。

其中,OmitFromInput表示该字段不应作为外部输入字段暴露给调用方,而是由 Agent 运行过程中内部生成。

总体来看,AgentState是专门为 LangChain Agent 运行时设计的状态类型。

因此,在普通自定义LangGraph项目中,一般不建议直接基于AgentState扩展图状态。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询