随着 AI 应用从简单的“单轮问答(Chat)”向“复杂任务执行(Agentic Workflow)”演进,单一的大语言模型(LLM)往往力不从心。无论是处理需要多步规划的软件工程任务,还是进行深度市场调研,让多个专注于特定领域的 Agent 协同工作,已经成为业界的共识。

在目前的多智能体(Multi-Agent)框架中,LangChain 的 LangGraphMicrosoft 的 AutoGen 是最受开发者关注的两大明星项目。但它们的设计哲学截然不同,选错框架可能会让你的代码陷入无尽的调试泥潭。

本文将从架构原理出发,通过一个实战案例深度对比 LangGraph 与 AutoGen。

1. 为什么需要多智能体(Multi-Agent)协作?

想象一下你要开发一个新功能。如果你把所有任务(需求分析、编写代码、运行测试、代码审查)都扔给一个全能型 Agent,它很容易在长长的上下文(Context)中迷失,导致输出质量严重下降。

而在 Multi-Agent 系统中:

  • 专职化: 程序员 Agent 只负责写代码,测试员 Agent 只负责写单测。
  • 并行与容错: 如果测试失败,测试员可以将错误日志(Error Log)反馈给程序员,形成一个自动修复的闭环(Loop)。

2. 架构原理解析:图论 vs 对话

2.1 LangGraph 架构解析:基于图论的状态机

LangGraph 的核心思想是将多 Agent 的工作流抽象为一张有向图(Directed Graph)

  • 节点(Nodes): 每个节点代表一个具体的执行步骤(可以是一个 Agent、一个工具调用,或者一段 Python 函数)。
  • 边(Edges): 定义了节点之间的流转逻辑(条件判断,例如“如果测试通过则结束,否则返回代码节点”)。
  • 状态(State): 在整个图的执行过程中,有一个全局的 State 对象在各个节点之间传递。每个节点都会读取当前状态,并返回一个更新后的状态。

设计哲学:高度可控、确定性强、状态管理透明。你就像在画一个精确的流程图,所有的流转都在你的掌控之中。

2.2 AutoGen 架构解析:基于对话的交互网络

AutoGen 的核心概念是 ConversableAgent(可对话智能体)

  • 所有的 Agent 都在一个“聊天室”里通过互相发送消息(Messages)来协作。
  • 任务的推进不依赖预定义的流程图,而是依赖 Agent 之间的自然语言沟通和内置的终止条件(如接收到 "TERMINATE" 字符串)。

设计哲学:高度灵活、探索性强、代码编写极其简洁。你只需要定义好每个 Agent 的人设(System Prompt)和可用的工具,然后把它们拉进一个群聊,让它们自己去讨论和解决问题。

3. 实战对比:共同完成一个代码编写与测试任务

假设我们需要构建一个包含两个 Agent 的系统:

  1. Coder: 负责根据需求编写 Python 代码。
  2. Tester: 负责运行代码,并将错误反馈给 Coder,直到代码成功运行。

3.1 使用 LangGraph 实现

在 LangGraph 中,我们需要精确定义 State,以及 Coder 和 Tester 两个节点。

python
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
import operator

# 1. 定义全局状态
class AgentState(TypedDict):
    messages: Annotated[list, operator.add]
    code: str
    test_result: str
    iterations: int

# 2. 定义节点函数
def coder_node(state: AgentState):
    # 调用 LLM 生成或修改代码
    code = llm.invoke("编写或修改代码: " + str(state["messages"]))
    return {"code": code, "iterations": state["iterations"] + 1}

def tester_node(state: AgentState):
    # 模拟运行代码并返回结果
    result = run_python_code(state["code"])
    return {"test_result": result}

# 3. 定义条件边
def should_continue(state: AgentState):
    if "SUCCESS" in state["test_result"]:
        return END
    if state["iterations"] > 3: # 防止死循环
        return END
    return "coder"

# 4. 构建工作流图
workflow = StateGraph(AgentState)
workflow.add_node("coder", coder_node)
workflow.add_node("tester", tester_node)

workflow.set_entry_point("coder")
workflow.add_edge("coder", "tester")
workflow.add_conditional_edges("tester", should_continue)

app = workflow.compile()

3.2 使用 AutoGen 实现

在 AutoGen 中,代码会显得更加声明式(Declarative)。我们只需要定义好两个 Agent 即可。

python
from autogen import AssistantAgent, UserProxyAgent

# 1. 定义 Coder Agent (负责写代码)
coder = AssistantAgent(
    name="Coder",
    llm_config={"config_list": config_list},
    system_message="你是一个高级 Python 工程师。请根据需求编写代码。如果测试员报告了错误,请修复代码并重新输出。"
)

# 2. 定义 Tester Agent (作为代理执行代码)
tester = UserProxyAgent(
    name="Tester",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=3,
    is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
    code_execution_config={"work_dir": "coding", "use_docker": False}
)

# 3. 启动对话任务
tester.initiate_chat(
    coder,
    message="请编写一个函数来计算斐波那契数列,并包含断言测试。"
)

如果你想对比这两种框架在复杂项目中的代码结构差异,可以使用 QubitTool 的 文本对比工具 来更直观地查看异同。

4. 选型建议

在实际的企业级项目落地中,到底该选谁?

选择 LangGraph 如果:

  • 你的业务流程(Workflow)非常明确且固定(如:客服接入 -> 意图识别 -> 知识库检索 -> 生成回复)。
  • 你需要对执行过程进行精细的日志记录和状态回溯(Time Travel)。
  • 你需要引入人工干预(Human-in-the-loop)来审批某个关键节点的输出。
  • 你已经深度绑定了 LangChain 生态。

选择 AutoGen 如果:

  • 你的任务具有高度的探索性和开放性(如:让多个 AI 共同探讨一个商业计划)。
  • 你需要快速搭建原型(Prototype),不想编写冗长的状态管理代码。
  • 你需要非常灵活的组网模式(如:多个子群聊嵌套、群聊动态选举发言人)。

5. 常见问题 (FAQ)

Q: 这两个框架处理死循环(Infinite Loops)的能力如何? A: AutoGen 依赖配置 max_consecutive_auto_reply 来硬性切断无意义的相互推诿。而 LangGraph 则可以通过在全局 State 中记录迭代次数(Iterations),并在条件边(Conditional Edges)中编写更复杂的退出逻辑。

Q: 哪里可以找到更多 Multi-Agent 框架? A: 多智能体领域发展迅速,除了这两个巨头,还有 CrewAI、MetaGPT 等优秀框架。你可以访问 QubitTool 的 AI Agent 导航库 获取最新的框架评测和实战案例。

总结

LangGraph 就像是一条精密的流水线,强调控制和确定性;而 AutoGen 则像是一个高效的研讨会,强调涌现和灵活性。没有绝对的优劣,只有最适合业务场景的选型。在构建你自己的 Agentic Workflow 时,不妨先梳理清楚:你的任务到底需要多大程度的“失控”?