news 2026/6/25 18:21:45

LangGraph 状态管理实战:解锁追加式消息历史,打造流畅对话系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangGraph 状态管理实战:解锁追加式消息历史,打造流畅对话系统

追加式状态:对话系统的核心刚需

对话系统的本质是多轮交互、历史留存,用户的每一次提问、AI 的每一次回复,都需要完整保留在状态中,不能丢失任何一条消息。

如果用普通状态管理,每次更新都会覆盖之前的消息,对话会直接「断片」;而追加式状态的核心价值就是:新数据不会覆盖旧数据,而是自动拼接在原有数据之后,完美适配聊天机器人、对话交互等场景。

这种模式的优势非常直观:

  1. 自动保留完整对话历史,无需手动维护消息列表
  2. 状态更新极简,节点只需返回新数据,无需处理历史拼接
  3. 状态流转清晰,符合对话系统的交互逻辑
  4. 扩展性强,多轮对话、长文本交互都能轻松支持

二、LangGraph 追加式状态的核心实现原理

实现追加式状态的关键,是 LangGraph 结合 Python 类型注解的精准设计,核心依赖两个要素:Annotated类型注解 + 运算符合并规则。

1. 核心注解:Annotated 标记追加规则

在定义状态结构时,我们不再使用普通的列表类型,而是通过Annotated为状态字段绑定追加行为。这是告诉 LangGraph:这个字段的更新方式不是覆盖,而是追加。

2. 关键运算符:add 实现列表合并

搭配operator.add运算符,让 LangGraph 知道如何处理新旧状态的合并 —— 对于列表类型,add运算符等价于列表拼接,新消息会自动追加到原有消息列表的末尾,全程无需手动编写拼接逻辑。

这就是追加式状态的底层逻辑:通过注解声明行为,通过运算符定义规则,让框架自动完成状态追加

三、追加式状态的完整设计思路

基于这个核心原理,我们可以搭建一套完整的对话状态管理体系,整体分为三部分:

1. 状态定义:区分追加与普通字段

对话状态包含两类字段,各司其职:

  • 消息历史字段:使用追加规则,自动保留所有用户与 AI 的消息,是对话的核心数据
  • 辅助状态字段:使用普通覆盖规则,用于存储当前对话主题、状态标识等临时数据,每次更新直接覆盖

这种设计既保证了历史不丢失,又让辅助状态灵活更新,兼顾实用性与简洁性。

2. 节点函数:专注生成新数据,无需关心历史

LangGraph 的节点函数是状态更新的入口,在追加式模式下,节点的逻辑极度简化:

  • 每个节点只需要生成当前需要新增的一条 / 一组数据
  • 直接返回新数据即可,框架会自动将其追加到原有状态中
  • 无需读取历史消息、无需拼接列表,代码更简洁、可读性更强

比如用户输入节点只需要生成用户的新消息,AI 回复节点只需要生成 AI 的新回复,剩下的追加工作完全交给框架处理。

3. 图流程:线性流转,完成对话闭环

按照对话的自然流程构建图结构:起始节点 → 用户输入节点 → AI 回复节点 → 总结节点 → 结束节点。

每一步节点执行后,状态都会自动追加新消息,最终在总结节点可以拿到完整的对话历史,实现从交互到总结的全流程闭环。

四、追加式状态的核心优势总结

对比传统的手动维护状态,LangGraph 追加式状态的优势无可替代:

  1. 极简代码:告别手动列表拼接、状态合并,减少冗余代码
  2. 自动管理:框架自动处理消息追加,开发者专注业务逻辑
  3. 稳定可靠:避免因手动合并导致的消息丢失、顺序错乱问题
  4. 场景适配:完美匹配聊天机器人、对话系统、多轮交互等核心场景
  5. 易于扩展:新增节点、新增交互步骤,无需修改状态合并逻辑

五、适用场景与实践价值

这种追加式状态管理模式,不仅仅适用于简单的天气查询机器人,几乎所有需要保留历史交互记录的场景都能使用:

  • 智能客服机器人
  • 多轮对话式助手
  • 长文本交互应用
  • 带记忆功能的 AI 应用

它是 LangGraph 状态管理中最实用、最常用的模式之一,掌握这种设计思路,能让你基于 LangGraph 开发对话类应用时,效率翻倍、稳定性拉满。

结语

LangGraph 的追加式状态管理,通过Annotated+ 运算符的优雅设计,解决了对话系统中历史状态保留的核心难题。它把复杂的状态合并逻辑交给框架,让开发者专注于业务流程与节点逻辑,是构建高质量对话应用的必备技巧。

后续我会继续分享 LangGraph 状态管理的其他进阶模式,帮助大家彻底掌握 LangGraph 核心能力,轻松开发企业级 AI 应用。

实现代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

"""

📌 模式2: 消息历史追加

核心机制: Annotated[List, add] 实现自动追加(非覆盖)

适用场景: 聊天机器人、对话系统、需要保留完整历史的场景

"""

importasyncio

fromtypingimportTypedDict,List, Annotated

fromoperatorimportadd# 关键:列表追加操作符

fromlanggraph.graphimportStateGraph, START, END

fromlangchain_core.messagesimportHumanMessage, AIMessage

# ===== 1. 状态定义(关键:Annotated + add)=====

classChatState(TypedDict):

"""

聊天状态设计:

- messages: 使用 Annotated[List, add] → 自动追加新消息

- current_topic: 当前对话主题(普通字段,覆盖更新)

"""

messages: Annotated[List[HumanMessage | AIMessage], add]# ⚠️ 核心:add 操作符

current_topic:str

# ===== 2. 节点函数 =====

defuser_input_node(state: ChatState)->dict:

"""

用户输入节点: 追加用户消息

返回 {"messages": [新消息]} → 自动追加到历史

"""

print(f"\n[用户输入] 当前消息数: {len(state['messages'])}")

new_msg=HumanMessage(content="用户: 今天天气怎么样?")

return{

"messages": [new_msg],# 返回单元素列表

"current_topic":"天气查询"

}

defai_response_node(state: ChatState)->dict:

"""

AI回复节点: 追加AI消息

⚠️ 注意: 返回的 messages 会追加,不会覆盖历史!

"""

print(f"[AI回复] 当前消息数: {len(state['messages'])}")

new_msg=AIMessage(content="AI: 今天北京晴,25°C,适合外出")

return{

"messages": [new_msg],# 再次返回单元素列表

"current_topic":"天气详情"

}

defsummary_node(state: ChatState)->dict:

"""

总结节点: 展示完整对话历史

"""

print(f"\n[对话总结] 总消息数: {len(state['messages'])}")

fori, msginenumerate(state['messages'],1):

role="👤"ifisinstance(msg, HumanMessage)else"🤖"

print(f" {role} 消息{i}: {msg.content[:30]}...")

return{"current_topic":"对话结束"}

# ===== 3. 构建图 =====

defbuild_chat_graph():

builder=StateGraph(ChatState)

builder.add_node("user_input", user_input_node)

builder.add_node("ai_response", ai_response_node)

builder.add_node("summary", summary_node)

builder.add_edge(START,"user_input")

builder.add_edge("user_input","ai_response")

builder.add_edge("ai_response","summary")

builder.add_edge("summary", END)

returnbuilder.compile()

# ===== 4. 执行演示 =====

asyncdefmain():

print("="*60)

print("🧠 模式2: 消息历史追加(Annotated + add)")

print("="*60)

graph=build_chat_graph()

# 画图

print(graph.get_graph().draw_ascii())

# 初始状态(必须初始化 messages 为空列表!)

initial_state={

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 18:19:51

2026申博机构深度测评:申博有术十七连冠卫冕,7家精选机构实测

2026年博士申请季已落下帷幕。这一年,“申请-考核”制全面落地。国家卓越工程师学院2026年博士研究生招生实行“申请-考核”制,考生登录报名系统并向报考导师提出申请。物理学院2026年博士研究生“申请-考核”制招生中,学院成立招生委员会全面…

作者头像 李华
网站建设 2026/6/25 18:13:58

SQL Server 性能优化实战(第一期):索引——查询加速的基石

为什么需要索引?想象一下:你有一本 1000 页的书,没有目录,也没有页码。你想找到“索引优化”这一节,唯一的办法就是从第 1 页开始,一页一页翻下去——直到翻到第 800 页才找到目标。这就是全表扫描。SQL Se…

作者头像 李华
网站建设 2026/6/25 18:13:37

HS2-HF Patch:HoneySelect2终极增强补丁完整安装指南

HS2-HF Patch:HoneySelect2终极增强补丁完整安装指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的游戏增强补丁…

作者头像 李华
网站建设 2026/6/25 18:12:16

下月将发!Galaxy Watch 9外观变化不大,性能提升还搭载Wear OS 7系统

Galaxy Watch 9外观小变,下月携折叠屏手机登场从泄露的渲染图来看,三星Galaxy Watch 9至少在外观上变化不大。预计它将在下个月与新款折叠屏手机一同发布,为消费者带来新的选择。性能提升与新系统加持,满足用户需求尽管外观变化不…

作者头像 李华
网站建设 2026/6/25 18:10:25

移动云网络安全服务怎么样?

移动云以一体化安全体系为基础,以核心产品创新为抓手,构建出全栈、高效、可靠的网络安全解决方案。尤其针对AI大模型带来的新型安全风险,移动云创新推出大模型应用安全,该服务既能通过“以模型对抗模型”的创新方式,智…

作者头像 李华