多智能体框架中两种图StateGraph和MessageGraph的对比分析

LangGraph框架中的StateGraphMessageGraph是两种核心的图模型类,它们在状态管理、适用场景和实现原理上存在显著差异。以下从区别原理实例三方面进行详细对比:


一、核心区别

  1. 状态结构的灵活性
    • StateGraph
      由用户定义的 状态对象(State) 参数化,支持自定义状态结构。例如,状态可以包含多个字段(如messagescontext等),每个字段的更新通过reducer函数控制。
  • 示例:

    from typing import TypedDict
    class State(TypedDict):
        messages: Annotated[list[AnyMessage], add_messages]
        context: dict
    

这里messages字段通过add_messages函数追加新消息,而context字段可自定义更新逻辑。

  • MessageGraph
    状态默认为消息列表List[BaseMessage]),仅适用于对话场景。其状态更新完全依赖于add_messages函数,无法扩展其他字段。
  1. 适用场景
    • StateGraph
      适合需要复杂状态管理的场景,例如多步骤任务流程、多智能体协作、需要持久化上下文的系统(如游戏、机器人控制)。
  • 示例:

    from langgraph.graph import StateGraph
    graph = StateGraph(AgentState)  # 自定义状态类
    
    • MessageGraph
      专为对话系统设计,简化消息传递逻辑。例如聊天机器人、客服系统等,通过消息列表维护对话历史。
  1. 代码复杂度
    • StateGraph
      需要显式定义状态结构和reducer函数,灵活性高但配置复杂。
    • MessageGraph
      自动管理消息列表,代码简洁但功能受限。

二、原理对比

  1. StateGraph的原理

    • 状态定义
      通过TypedDictPydantic模型定义状态结构,例如:

      class AgentState(TypedDict):
          input: str
          response: str
      
    • 状态更新
      每个节点接收状态并返回更新后的状态,通过reducer函数控制字段更新。例如:

      def generate_response(state):
          return {"response": llm.invoke([HumanMessage(content=state["input"])])}
      
    • 边的逻辑
      边决定节点之间的跳转逻辑,支持条件边(add_conditional_edges)。

  2. MessageGraph的原理

    • 状态定义
      状态默认为MessagesState,仅包含messages字段(List[BaseMessage]):

      class MessagesState(TypedDict):
          messages: Annotated[list[AnyMessage], add_messages]
      
    • 状态更新
      所有节点操作直接作用于messages列表,使用add_messages函数追加消息。例如:

      def chatbot_node(state):
          return [("assistant", "Hello!")]
      
    • 边的逻辑
      边基于消息内容决定跳转,例如根据用户输入选择下一个节点。


三、实例对比

1. 对话系统(MessageGraph)
  • 场景:构建一个简单的聊天机器人,用户输入“Hi”,返回“Hello”。

  • 代码

    from langgraph.graph.message import MessageGraph
    from langchain_core.messages import HumanMessage
    
    builder = MessageGraph()
    builder.add_node("chatbot", lambda state: [("assistant", "Hello!")])
    builder.set_entry_point("chatbot")
    builder.compile().invoke([HumanMessage(content="Hi")])
    
  • 特点
    直接操作messages列表,无需自定义状态结构。

2. 多步骤任务流程(StateGraph)
  • 场景:用户请求“查找最新AI论文”,需调用搜索工具和模型生成摘要。

  • 代码

    from langgraph.graph import StateGraph
    from langchain_openai import ChatOpenAI
    from langchain_tools import DuckDuckGoSearchResults
    
    class AgentState(TypedDict):
        input: str
        response: str
    
    workflow = StateGraph(AgentState)
    workflow.add_node("agent", lambda state: {"response": llm.invoke([HumanMessage(content=state["input"])])})
    workflow.add_node("search", lambda state: {"response": search.invoke([HumanMessage(content=state["input"])])})
    workflow.add_edge("agent", "search")
    workflow.add_edge("search", END)
    workflow.compile().invoke({"input": "Find latest AI paper"})
    
  • 特点
    使用自定义状态AgentState,通过llmsearch节点分步处理任务。


四、总结

  • StateGraph更通用,适合复杂状态管理,但配置复杂;MessageGraph更简洁,专为对话系统设计。
  • 选择依据
    • 若需多字段状态或复杂逻辑,优先使用StateGraph
    • 若仅需对话消息传递,MessageGraph更高效。

通过上述对比可见,两者的核心差异在于状态结构的灵活性适用场景的针对性,开发者需根据具体需求选择合适的图模型类。

### StateGraph 的概念 在计算机科学编程领域,`StateGraph` 是一种用于表示状态机的数据结构。这种数据结构允许开发者以形化的方式建模复杂的工作流或过程中的不同状态及其转换关系[^1]。 具体来说,在 `langgraph` 库中实现的 `StateGraph` 类提供了创建、操作以及查询由多个相互连接的状态组成的有向的能力。每个节点代表一个特定的应用程序逻辑片段或者是处理阶段;边则描述了从一个状态到另一个状态的变化条件或者触发器[^2]。 ### 使用示例 下面是一个简单的 Python 代码例子来展示如何实例化并使用 `StateGraph`: ```python from langgraph.graph import StateGraph class ResearchState: pass # 定义研究工作流程的具体状态类 workflow = StateGraph(ResearchState) # 这里可以继续添加更多的状态转移规则... ``` 这段代码展示了如何导入必要的模块,并基于自定义的研究状态对象 (`ResearchState`) 来初始化一个新的 `StateGraph` 实例 `workflow`。这使得能够进一步配置该,比如增加新的状态节点或是设置它们之间的过渡路径。 对于多代理系统而言,当把各个 Agent 设计成上的节点时,就可以利用这样的机制让 Agents 在共享同一张的情况下协同作业。每当轮到某个 Agent 执行其任务的时候,它会接收到最新的全局状态副本,完成自己的计算之后再返回修改后的版本供后续节点使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值