基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

MessageGraph 和 StateGraph 的区别

知识点图片

在 LangGraph 中,StateGraphMessageGraph 的核心区别在于它们如何定义和处理图的“状态(State)”

简而言之:

  • StateGraph 是最基础、最强大的图,允许你定义任意结构的状态(通常是一个包含多个变量的字典)。
  • MessageGraphStateGraph 的一个特定的、简化的子类,它的状态被硬编码为“一个消息列表”(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,这样可以在保持简单的同时,为未来业务复杂度的提升留足空间。

00:00
00:00