MessageGraph 和 StateGraph 的区别
在 LangGraph 中,StateGraph 和 MessageGraph 的核心区别在于它们如何定义和处理图的“状态(State)”。
简而言之:
StateGraph是最基础、最强大的图,允许你定义任意结构的状态(通常是一个包含多个变量的字典)。MessageGraph是StateGraph的一个特定的、简化的子类,它的状态被硬编码为“一个消息列表”(List of Messages),专门用于处理纯对话场景。
以下是它们的详细对比:
1. StateGraph (状态图) —— 核心与全能
StateGraph 是 LangGraph 的核心组件。在使用它之前,你必须通过 Python 的 TypedDict 或 Pydantic 模型来明确指明“状态”的结构。
- 状态结构:完全自定义。你可以包含消息历史,还可以包含结构化数据、标志位、错误信息、外部 API 返回的上下文等。
- 状态更新方式(Reducers):你需要通过
Annotated来指定每个字段更新时的行为(比如是覆盖旧值、还是追加到列表中)。 - 适用场景:复杂的 Agent 架构、多 Agent 协作、需要记忆中间计算结果的 RAG(检索增强生成)系统。
代码示例:
python
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph
import operator
# 1. 完全自定义状态结构
class AgentState(TypedDict):
messages: Annotated[list, operator.add] # 遇到新消息时,追加(add)到列表
context: str # 遇到新字符串时,覆盖旧值
retries: int # 遇到新数字时,覆盖旧值
# 2. 节点接收整个字典,并返回需要更新的部分
def my_node(state: AgentState):
current_messages = state["messages"]
# ... 处理逻辑 ...
# 返回一个字典来更新状态
return {"messages": ["New Message"], "context": "New Context"}
builder = StateGraph(AgentState)
2. MessageGraph (消息图) —— 极简与专用
MessageGraph 是为了让开发者快速搭建简单的聊天机器人而设计的便利封装。
- 状态结构:固定不变。状态永远只是一个纯粹的列表:
List[BaseMessage]。 - 状态更新方式:内置且固定。每个节点只需要返回一条新消息或一个新消息列表,LangGraph 会自动将它们追加(append)到现有的消息历史的末尾。
- 适用场景:只关心对话历史、不需要保存其他任何结构化变量的简单 Chatbot 模型。
代码示例:
python
from langgraph.graph import MessageGraph
from langchain_core.messages import AIMessage
# 1. 不需要定义状态类,直接实例化
builder = MessageGraph()
# 2. 节点直接接收消息列表,返回单个消息(自动被 append 到状态里)
def my_node(messages: list):
# messages 就是 [HumanMessage(...), AIMessage(...)]
# ... 处理逻辑 ...
return AIMessage(content="这是一条新回复")
3. 核心区别对比表
| 特性 | StateGraph | MessageGraph |
|---|---|---|
| 底层关系 | 基类(核心引擎) | StateGraph 的子类(便利封装) |
| 状态数据类型 | 自定义的字典 (TypedDict / Pydantic) |
固定的列表 (List[BaseMessage]) |
| 如何更新状态 | 节点返回一个字典,根据定义的 reducer 更新对应键值 | 节点返回消息对象,自动 append 到列表末尾 |
| 灵活性 | 极高(可以携带任意类型的上下文变量) | 极低(只能携带消息) |
| 学习曲线 | 稍陡峭(需要理解 Reducer 和状态合并机制) | 极其平滑 |
| 适用场景 | 生产环境、复杂业务流程、多 Agent 协作 | 快速原型开发、极简对话机器人的 Demo |
💡 现在的最佳实践(重要提示)
随着 LangGraph 的发展,官方目前强烈推荐在所有场景下都使用 StateGraph,而较少提及 MessageGraph。
为了让 StateGraph 在处理消息时像 MessageGraph 一样简单,官方提供了一个内置的状态模板 MessagesState。
现在的标准写法通常是:
python
from langgraph.graph import StateGraph, MessagesState
# MessagesState 内部已经帮你定义好了 messages 列表和追加逻辑
builder = StateGraph(MessagesState)
# 如果你需要扩展,可以直接继承它
class CustomState(MessagesState):
user_id: str
is_authenticated: bool
总结: 了解 MessageGraph 有助于看懂早期的教程代码,但在你编写新的 LangGraph 应用时,请直接使用 StateGraph(配合 MessagesState),这样可以在保持简单的同时,为未来业务复杂度的提升留足空间。