langchain 实现多agent,代码示例

TwoAdmin 2025-10-20 7 10/20

要实现多Agent系统,目前最推荐的方式是使用LangGraph,它比LangChain的旧版AgentExecutor更加灵活可控。

以下是两种主流的架构模式及其实战示例:

方案一:Supervisor 架构

适用场景:有明显的任务分工,需要一个“主管”Agent 负责任务分发,多个“员工”Agent 各司其职。

1. 环境准备

首先需要安装核心库:

bash
pip install langgraph langchain-openai langgraph-supervisor

注:langgraph-supervisor 简化了创建主管的流程。

2. 完整代码示例

假设要构建一个系统,让“主管”来决定用户的问题是应该由数学专家还是搜索专家来回答。

python
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langgraph_supervisor import create_supervisor
from app.llm import chat_llm
from app.config import ai_config
# 1. 初始化模型
model = ChatOpenAI(
        base_url=ai_config['api_uri'],
        model=ai_config['api_model'],
        temperature=0.7,
        streaming=False,  # 这里不使用流式,因为我们要一次返回完整结果
        api_key=ai_config['api_key'],
        extra_body={"chat_template_kwargs": {
            "enable_thinking": False
        }}
    )

# 2. 定义工具函数
def add(a: float, b: float) -> float:
    """加法工具"""
    return a + b

def multiply(a: float, b: float) -> float:
    """乘法工具"""
    return a * b

def web_search(query: str) -> str:
    """模拟网络搜索"""
    return f"关于 '{query}' 的搜索结果:这里是一些模拟数据。"

# 3. 创建子 Agent
# 数学专家:拥有加法和乘法工具
math_agent = create_agent(
    model=model,
    tools=[add, multiply],
    name="math_expert",
    system_prompt="你是数学专家,负责计算。"
)

# 搜索专家:拥有搜索工具
research_agent = create_agent(
    model=model,
    tools=[web_search],
    name="research_expert",
    system_prompt="你是研究员,负责查询信息,不擅长数学。"
)

# 4. 创建主管 Agent
workflow = create_supervisor(
    agents=[research_agent, math_agent],
    model=model,
    prompt="你是主管。数学问题交给 math_expert,查询信息交给 research_expert。"
)

# 5. 编译并运行
app = workflow.compile()

# 测试数学问题
result_math = app.invoke({
    "messages": [{"role": "user", "content": "帮我算一下 123 乘以 456 等于多少?"}]
})
print(result_math["messages"][-1].content)

# 测试搜索问题
result_search = app.invoke({
    "messages": [{"role": "user", "content": "帮我查一下今天的新闻"}]
})
print(result_search["messages"][-1].content)

运行逻辑:用户提问后,Supervisor 会判断该调用哪个子Agent,然后将任务传递给它,子Agent执行完成后将结果返回给Supervisor,Supervisor再最终回复用户。

方案二:Swarm 架构

适用场景:没有明显的中央管控,Agent之间是平级关系,谁有能力处理后续问题,就将对话“移交”给谁,类似蜂群协作。

1. 环境准备

bash
pip install langgraph-swarm

2. 完整代码示例

假设有两位客服:Alice(擅长数学)和 Bob(擅长闲聊/特定风格)。

python
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents import create_agent
from langgraph_swarm import create_handoff_tool, create_swarm

# 1. 初始化模型
model = ChatOpenAI(model="gpt-4o")

def add(a: int, b: int) -> int:
    """加法"""
    return a + b

# 2. 定义 Agent 以及它们的“移交”工具
# Alice 不仅能做加法,还可以把问题移交给 Bob
alice = create_agent(
    model,
    tools=[
        add,
        create_handoff_tool(
            agent_name="Bob",  # 允许对话移交 Bob
            description="将任务移交给 Bob,Bob 风格独特"
        ),
    ],
    system_prompt="你是 Alice,数学专家。如果你无法处理或用户想找 Bob,请移交。",
    name="Alice",
)

# Bob 也可以把对话交回给 Alice
bob = create_agent(
    model,
    tools=[
        create_handoff_tool(
            agent_name="Alice",
            description="交给数学专家 Alice",
        ),
    ],
    system_prompt="你是 Bob,擅长开玩笑和海盗口吻。",
    name="Bob",
)

# 3. 创建 Swarm 系统
checkpointer = InMemorySaver()  # 必须保存状态,否则 Agent 会“失忆” [citation:4]
workflow = create_swarm(
    [alice, bob],
    default_active_agent="Alice"  # 起始 Agent
)
app = workflow.compile(checkpointer=checkpointer)

config = {"configurable": {"thread_id": "1"}}

# 用户要求先找 Bob
turn_1 = app.invoke(
    {"messages": [{"role": "user", "content": "我想和 Bob 聊几句"}]},
    config,
)
print("Turn 1:", turn_1["messages"][-1].content)

# 紧接着问 5+7,系统会记得当前激活的是 Bob,但 Bob 判断自己不会,于是触发移交工具,将任务转给 Alice
turn_2 = app.invoke(
    {"messages": [{"role": "user", "content": "那 5 + 7 等于几?"}]},
    config,
)
print("Turn 2:", turn_2["messages"][-1].content)

关键点:这种架构中,Agent通过工具调用(Handoff Tool)来决定谁接着处理,对话上下文会在Agent间传递。

⚖️ 两种架构对比

特性 Supervisor 架构 (中心化) Swarm 架构 (去中心化)
控制权 由一个主管 Agent 集中控制 由当前激活的 Agent 动态移交流转
路由逻辑 中心裁决 Agent自主协商(通过 Handoff Tool)
优点 流程清晰,易于管控长流程任务 灵活度极高,减轻中央节点的压力
缺点 主管容易成为性能或逻辑瓶颈 逻辑较分散,可能增加调试难度
推荐工具 langgraph-supervisor langgraph-swarm

💡 关键注意事项

  1. 短时记忆(Memory):在多轮对话中,如果不配置 checkpointer(如 InMemorySaver),Agent将会忘记之前是谁在处理问题。这在 Swarm 架构中尤其重要,因为它决定了“当前激活的Agent是谁”。

  2. 消息管理(Output Mode):在 Supervisor 架构中,可以通过 output_mode 参数控制子 Agent 的历史记录是否回流到主对话中,以此防止上下文过于冗长。

如果你是刚入门,建议先从Supervisor 架构开始尝试,它的逻辑更符合“主管分配任务给员工”的直觉,更易于理解和调试。

- THE END -

TwoAdmin

5月13日17:26

最后修改:2026年5月13日
0

非特殊说明,本博所有文章均为博主原创。