【自然语言处理与大模型】LangChainV1.0入门指南:AgentState介绍

AgentState是LangChain中用来表示智能体 在执行过程中描述当前状态 的核心数据结构。它是整个工作流的"上下文容器"或"共享内存",在各个节点之间传递,并随着流程推进不断被读取、修改和持久化。所以我一般叫他**"运行时上下文状态对象"**

一、AgentState本质

它本质就是一个TypedDict,里面包含了任务执行过程中的状态数据(比如对话历史、中间结果、用户信息等)。它由下面三个组件组成:

组件 说明
State(状态) 在图中流动的共享内存对象,存储用户输入、中间结果、工具调用日志等
Schema(模式) 规定状态的数据结构和类型(通常用 TypedDict 或 Pydantic 定义)
Reducer(归约器) 控制状态更新方式的函数(默认是覆盖,也可以追加、合并等)

二、LangChain中的AgentState

在LangChain和LangGraph里面,提供了开箱即用的默认状态类,最常见的就是MessagesState

1、 默认 MessagesState

python 复制代码
# 从langgraph中导入它
from langgraph.graph import MessagesState


# 就等价于自己手动定义了一个TypedDict
from typing import TypedDict, Annotated
import operator

class MessagesState(TypedDict):
    messages: Annotated[list[BaseMessage], operator.add]
  • messages 字段 :存储完整的对话消息序列(HumanMessage, AIMessage, ToolMessage 等)。
  • Annotated[..., operator.add] :这是关键!它表示当多个节点返回对 messages 的更新时,不是覆盖,而是追加(concatenate)。这确保了对话历史不会丢失。

2、自定义AgentState

完全可以自己扩展默认状态,添加业务所需字段。

python 复制代码
from typing import TypedDict, Annotated, Optional
from langgraph.graph import MessagesState
from langchain_core.messages import BaseMessage
import operator

class CustomAgentState(MessagesState):
    user_id: str                          # 用户标识
    session_data: dict                    # 会话级临时数据
    task_status: Optional[str]            # 任务状态("pending", "completed")
    search_results: Annotated[list[dict], operator.add]  # 工具调用结果(可追加)

然后在创建 Agent 时传入自定义的运行时上下文状态对象。

python 复制代码
# 假设之前定义好了下面的参数
agent = create_agent(
    model=llm,
    tools=[search_tool],
    state_schema=CustomAgentState,   # ← 传入自己定义的
    checkpointer=checkpointer
)

调用的时候传入在AgentState中自定义的字段。

python 复制代码
# config 作用是langgraph的可配置参数,用来控制运行时上下文。
config = {"configurable": {"thread_id": "1"}}  # 线程级会话 id 当 Agent 被调用时,LangGraph 会自动从 检查点器Checkpointer中加载该 thread_id 对应的最新状态

# 初次调用输入数据,作用是传递给Agent,初始化State更新
inputs = {
    "messages": [{"role": "user", "content": "查一下北京天气"}],
    "user_id": "u_123",
    "session_data": {"locale": "zh-CN"}
}

response1 = agent.invoke(input=inputs, config=config)

# 后续调用只需提供新消息,其他状态自动恢复
next_inputs = {"messages": [{"role": "user", "content": "那上海呢?"}]}
response2 = agent.invoke(next_inputs, config=config)  # 仍记得 user_id 和之前的问题
相关推荐
AC赳赳老秦13 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
结网的兔子13 小时前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
水瓶夜之13 小时前
.NET 中的新增功能系列文章——.NET SDK中的新增功能
前端·chrome·.net
笨笨狗吞噬者14 小时前
VS Code 内置浏览器打开网页
前端
SamChan9014 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
甲维斯14 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·人工智能
奈斯先生Vector14 小时前
大模型 Agentic Workflow 架构解构:异构 API 调度与 Token 路由的多模态系统设计
开发语言·前端·架构·prompt·aigc·音视频
海带紫菜菠萝汤14 小时前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
名字还没想好☜14 小时前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件14 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access