以下是关于开源多代理框架 Swarm 的详细介绍,包含核心设计、工作机制、代码案例及扩展应用。
一、Swarm 框架概述
Swarm 是由 OpenAI 开源的多代理协作框架,专注于轻量级、可控的代理(Agent)协调与任务切换。其设计目标是探索多代理系统的人体工学接口,适用于教育、实验及复杂工作流的快速原型开发,而非生产环境。
核心特性
- 轻量级:代码仅约 500 行,依赖 OpenAI 的 Chat Completions API,调用间无状态存储。
- Handoffs 机制:允许代理通过函数调用动态移交对话任务,实现多代理协作。
- 完全透明性:支持调试日志打印上下文变量、工具调用步骤,便于开发者跟踪执行流程。
二、核心组件与工作机制
1. 核心类
Swarm
客户端:管理代理调度、工具调用及上下文更新。Agent
:封装指令(instructions
)和工具函数(functions
),可动态切换代理。Response
:存储对话历史、当前活跃代理及上下文变量。Result
:代理函数调用的返回结果,可携带新代理实例或更新上下文变量。
2. 执行流程
Swarm 的运行循环如下:
- 模型响应生成:基于当前代理的指令和对话历史调用 LLM 生成回复。
- 工具调用处理:执行代理注册的函数(如切换代理、调用 API)。
- 上下文更新与代理切换:根据函数返回结果更新上下文或切换活跃代理。
三、案例代码与详细解释
案例 1:基础代理切换
以下代码实现用户请求由 Agent A 转交至 Agent B,后者以特定格式(如诗歌)回复:
from swarm import Swarm, Agent
# 初始化 Swarm 客户端
client = Swarm()
# 定义 Agent B 的指令(以 Haiku 诗歌格式回复)
agent_b = Agent(
name="Agent B",
instructions="Only respond in Haiku format."
)
# 定义 Agent A 的切换函数
def transfer_to_agent_b():
return agent_b # 返回目标代理实例
agent_a = Agent(
name="Agent A",
instructions="You are a helpful assistant. Transfer to Agent B when requested.",
functions=[transfer_to_agent_b] # 注册切换函数
)
# 启动对话
response = client.run(
agent=agent_a,
messages=[{"role": "user", "content": "I want to speak with Agent B."}]
)
# 输出最终回复
print("Agent Response:", response.messages[-1]["content"])
代码解析:
- 代理定义:
-Agent A
的transfer_to_agent_b
函数返回Agent B
实例,触发切换。
-Agent B
的指令要求以 Haiku 诗歌格式回复(如:“Silent moonlit night / Whispers of the wind speak true / How may I assist?”)。 - 执行流程:
- 用户请求触发Agent A
调用transfer_to_agent_b
,Swarm 将活跃代理切换为Agent B
。
- 后续对话由Agent B
处理,生成符合指令的回复。
案例 2:上下文变量与工具调用
以下示例展示如何通过上下文变量动态调整代理行为:
def get_user_preference(context_variables: dict) -> str:
return context_variables.get("preference", "default")
# 定义 Agent C,动态生成指令
agent_c = Agent(
name="Agent C",
instructions=lambda ctx: f"Recommend products based on user preference: {get_user_preference(ctx)}",
functions=[]
)
# 传递上下文变量
response = client.run(
agent=agent_c,
messages=[{"role": "user", "content": "Suggest a product."}],
context_variables={"preference": "eco-friendly"}
)
print("Recommendation:", response.messages[-1]["content"])
代码解析:
Agent C
的指令通过lambda
函数动态生成,结合上下文变量preference
。- 用户偏好从
context_variables
中提取,实现个性化推荐(如:“Based on your eco-friendly preference, I recommend bamboo toothbrushes.”)。
四、应用场景与优势对比
1. 典型应用场景
- 客服自动化:多代理协作处理用户请求(如订单修改、退款),通过意图识别代理分流转接。
- 复杂工作流:将独立功能拆分为多个代理,如天气查询、航班改签等。
2. 对比其他框架
框架 | Swarm 优势 |
---|---|
LangGraph | 更轻量,适合精细控制代理切换和上下文管理。 |
CrewAI | 提供透明化调试日志,便于追踪执行步骤。 |
五、扩展功能与源码解析
1. 流式处理与调试
启用流式响应和调试日志:
response = client.run(
agent=agent_a,
messages=[{"role": "user", "content": "Hello"}],
stream=True,
debug=True # 打印执行步骤日志
)
for chunk in response:
print(chunk.content)
2. 源码关键逻辑
handle_tool_calls
:解析工具调用,执行函数并更新代理状态。get_chat_completion
:合并指令与对话历史,调用 OpenAI API 生成响应。
六、总结
Swarm 通过轻量级设计和灵活的代理切换机制,为多代理协作提供了高效的实验平台。其透明性和可控性使其在教育、复杂工作流场景中具有独特优势。开发者可通过简洁的接口快速构建多代理系统,并结合实际需求扩展功能。
项目地址:GitHub - OpenAI Swarm
进一步学习:参考官方示例库(如 triage_agent
、weather_agent
)深入探索复杂应用场景。