当前位置: 首页 > news >正文

02 状态(State)


tags:/n - langgraph

  • 状态管理
  • TypedDict
  • Pydantic
  • 面试
    aliases:/n - State
  • 状态定义

02 状态(State)

State 是 LangGraph 最核心的概念,代表了整个图的数据目标和节点的修改目标

一、状态的定义

1.1 三种定义方式

方式一:TypedDict(推荐)

fromtypingimportTypedDictclassMyState(TypedDict):rag_result:strweb_search_result:strfinal_answer:strquery:str

方式二:Pydantic BaseModel

frompydanticimportBaseModelclassMyState(BaseModel):rag_result:strweb_search_result:strfinal_answer:strquery:str

方式三:Dataclass

fromdataclassesimportdataclass@dataclassclassMyState:rag_result:strweb_search_result:strfinal_answer:strquery:str

二、输入输出数据隔离

通过StateGraph的三个参数实现精细控制:

参数作用是否必须
state_schema图的完整内部状态必须
input_schema图接受的输入可选
output_schema图返回的输出可选

使用场景

  • input_schema:限制用户只能传入特定字段(如query
  • output_schema:限制返回给用户的结果(如只返回final_answer
  • state_schema:定义图内部所有可能用到的字段
""" 输入输出数据隔离演示 运行方式:python 02_输入输出隔离.py """fromtypingimportTypedDictfromlanggraph.constantsimportSTART,ENDfromlanggraph.graphimportStateGraphclassMyStateFull(TypedDict):rag_result:strweb_search_result:strfinal_answer:strquery:stra_new_key:strclassInputSchema(TypedDict):query:strclassOutputSchema(TypedDict):final_answer:strgraph=StateGraph(state_schema=MyStateFull,input_schema=InputSchema,output_schema=OutputSchema)defrag_search_node(state:MyStateFull):query=state["query"]return{"rag_result":f"关于{query}的rag_result","a_new_key":"value"}deffinal_answer_node(state:MyStateFull):rag=state["rag_result"]return{"final_answer":f"LLM基于{rag}的回复"}graph.add_node(rag_search_node)graph.add_node(final_answer_node)graph.add_edge(START,"rag_search_node")graph.add_edge("rag_search_node","final_answer_node")graph.add_edge("final_answer_node",END)compiled=graph.compile()# 输入只能是 InputSchema 中的字段result=compiled.invoke({"query":"如何使用LangGraph"})print(result)# 只返回 output_schema 中的字段

三、Reducer 函数

Reducer 解决多节点并发写入同一字段时的合并问题。

3.1 默认行为:覆盖更新

""" 默认 Reducer 演示(覆盖更新) 运行方式:python 02_默认Reducer.py """fromtypingimportListfromtyping_extensionsimportTypedDictfromlanggraph.graphimportStateGraph,START,ENDclassDefaultReducerState(TypedDict):foo:intbar:List[str]defnode_1(state):return{"foo":2}defnode_2(state):return{"bar":["bye"]}builder=StateGraph(DefaultReducerState)builder.add_node("node1",node_1)builder.add_node("node2",node_2)builder.add_edge(START,"node1")builder.add_edge("node1","node2")builder.add_edge("node2",END)graph=builder.compile()result=graph.invoke({"foo":1,"bar":["hi"]})print(result)# {'foo': 2, 'bar': ['bye']} ← 覆盖更新

3.2 自定义 Reducer

""" 自定义 Reducer 演示 运行方式:python 02_自定义Reducer.py """fromlanggraph.graphimportStateGraphfromlangchain_core.messagesimportHumanMessage,AIMessage,BaseMessagefromtypingimportAnnotated,TypedDict,Listfromlanggraph.constantsimportSTARTdefadd_message(left:list,right:list):returnleft+rightclassMyAgent(TypedDict):messages:Annotated[List[BaseMessage],add_message]deftool_node(state):return{"messages":[HumanMessage(content="来自tool的内容")]}defllm_node(state):return{"messages":[AIMessage(content="来自llm的内容")]}builder=StateGraph(state_schema=MyAgent)builder.add_node(tool_node)builder.add_node(llm_node)builder.add_edge(START,"tool_node")builder.add_edge("tool_node","llm_node")graph=builder.compile()result=graph.invoke({"messages":[HumanMessage(content="你好")]})print(result['messages'])

四、状态的存储

4.1 Checkpointer

""" 状态存储演示 运行方式:python 02_状态存储.py """fromlanggraph.checkpoint.memoryimportInMemorySaverfromlangchain.agentsimportcreate_agentfromlangchain.toolsimporttoolfromlangchain_openaiimportChatOpenAI# 1. 创建 checkpointercheckpointer=InMemorySaver()llm=ChatOpenAI(model="gpt-4o-mini")@tooldefweather_tool(city:str,date:str)->str:"""查天气的工具"""returnf'{city}{date}的天气是晴朗的'# 2. 构建 Agentagent=create_agent(model=llm,tools=[weather_tool],checkpointer=checkpointer)# 3. 第一次调用config={"configurable":{"thread_id":"user_1"}}result1=agent.invoke({"messages":"北京天气怎么样"},config=config)print(f"第一次:{result1['messages'][-1]}")# 4. 第二次调用(相同 thread_id,上下文自动延续)result2=agent.invoke({"messages":"适合出去玩吗"},config=config)print(f"第二次:{result2['messages'][-1]}")

4.2 故障恢复

""" 故障恢复演示 运行方式:python 02_故障恢复.py """importsqlite3fromlanggraph.checkpoint.sqliteimportSqliteSaverfromlanggraph.graphimportStateGraph,START# 使用 SQLite 持久化conn=sqlite3.connect("checkpointer.db",check_same_thread=False)memory=SqliteSaver(conn)# ... 构建图 ...graph=builder.compile(checkpointer=memory)# 第一次调用(可能在某节点报错)config={"configurable":{"thread_id":"123"}}try:graph.invoke({},config=config)exceptExceptionase:print(f"出错:{e}")# 恢复执行(传入 None + 相同 config)result=graph.invoke(None,config=config)

五、获取历史状态

""" 获取历史状态演示 运行方式:python 02_历史状态.py """# 获取所有历史状态history=list(graph.get_state_history(config))forstateinhistory:print(state)# 获取最近一次状态last_state=graph.get_state(config)print(last_state)

相关笔记

[[01-LangGraph概述与快速入门]] · [[03-节点]] · [[04-边]]

http://www.jsqmd.com/news/1093047/

相关文章:

  • 多发射器识别技术(SMEI)在无线通信安全中的应用
  • Ubuntu 下用 udev 固定 PX4 飞控 USB 设备名
  • AI大模型学习指南:Agent、MCP、Skill全解析,小白也能轻松收藏掌握
  • 如何高效捕获网页媒体资源:猫抓浏览器扩展的完整指南
  • 从Prompt到Harness:AI工程的三层进化,小白也能轻松掌握,建议收藏!
  • 豆包牛批普拉斯
  • 从多项式回归到“水平直线”:Matplotlib 绘图中的 NumPy 数组维度隐患
  • 汇编中寄存器寻址与立即数寻址混淆问题解决
  • Linux命令-quota(显示用户磁盘配额)
  • Matlab 麻雀优化双向长短期记忆网络(SSA-BILSTM)的时间序列预测(时序)
  • 京东抢购助手终极指南:免费开源工具实现自动化抢单
  • 2026证件照换衣服工具全解:手机APP、在线网页、小程序操作指南
  • RAG 搞定!告别「有库无答」,用 Rerank 让大模型精准回复(收藏版)
  • 别一上来就看复杂插件:先用 Delay看懂一个最小 VM 插件是怎么接进系统的
  • 小白程序员必看!收藏这篇,轻松入门大模型工具调用与Function Calling
  • 汇编——位移指令
  • 考验AI的“自我“-AI对《红楼梦》后40回的改写(30)
  • ReAct Inside —— 从 Message 到 State,看懂 AI Agent 的工作原理
  • Hutool 的 `TimedCache` 到期会自动清理吗? ——————hutool cache的“惰性清理“和“定期清理“
  • 递归函数Recursive Function
  • 如何评价GLM-5.2?
  • 联邦学习侧信道攻击:FLARE框架解析与防御
  • 成功企业的衰亡密码:从“看不见的癌症”到真正的长期主义
  • agency-agents-zh大更新:一句话,让 216个 AI 专家组队替你干活,上线桌面端和web端了!已开源
  • 每日一个开源项目(第145篇):Trellis - 把项目记忆、规范和任务上下文持久化进代码仓库
  • 2026好用的视频去水印工具电脑手机推荐,免费无广告精选
  • 量子约束优化搜索框架CBQS解析与应用
  • 计算机毕业设计之基于SSM框架技术的超市货品销售预警平台的设计与实现
  • 别让AI一直“读心“:冲突触发式心智理论的因果模型
  • 内网 Web 服务断外网后白屏卡顿?全链路排查手册与根治方案