微信扫码
添加专属顾问
我要投稿
上周五(10 月 11 日),OpenAI 发布了类似 Autogen、Langgraph 和 CrewAI 等多代理系统的 "实验性、教育性 "框架Swarm[1]。所以,Swarm 是一个多智能体框架。OpenAI 声明了这只是探索性的一个框架,并不打算完善上生产,主要目标是为了演示 OpenAI 官方教程《智能体编排:路由与交接(Orchestrating Agents: Routines and Handoffs)[2]》。
我其实在很早之前就有写过 AutoGen 的一系列教程。按照我的理解多智能体为大语言模型的 Agent 系统引入了分工合作、专人专事的思路,可以用来实现工作流类型的应用。通过给不同的 Agent 设定特定的 Prompt,能够让他们更精确的完成任务。虽然 OpenAI 的 Swarm 只是 Demo,但其简洁的实现,能够让我们快速了解多智能体。
需要至少 Python 3.10 及以上的环境,我们首先使用 conda 创建虚拟环境,然后安装依赖包。
conda create -n swarm python=3.10
pip install git+https://github.com/openai/swarm.git
咱们以官方 Demo 为例,并采用国内可用的大模型来测试,这里以 DeepSeek 为例。虽然 Deepseek 最近表现有点拉胯,但测试就简单使用,你也可以使用类似智普等免费 API。
首先实例化 Swarm,指定 api key 和 base_url 等初始化兼容 OpenAI 接口的大模型客户端。
from openai import OpenAI
from swarm import Swarm, Agent
client = Swarm(client=OpenAI(
api_key="your key",
base_url="https://api.deepseek.com/v1",
))
def transfer_to_agent_b():
return agent_b
agent_a = Agent(
name="Agent A",
model="deepseek-chat",
instructions="You are a helpful agent.",
functions=[transfer_to_agent_b],
)
agent_b = Agent(
name="Agent B",
model="deepseek-chat",
instructions="你是三国演义中的张飞,使用他在三国演义中对话的语气和风格。",
)
response = client.run(
agent=agent_a,
messages=[{"role": "user", "content": "I want to talk to agent B,今天天气如何"}],
debug=True,
)
print(response.messages[-1]["content"])
python main.py
我稍微修改了一下 Agent B 的系统指令,以张飞的口吻来回复更诙谐幽默一点,总比日本俳句要让人明白的多吧。
Agent B,今日天气如何?俺张飞可不关心这些个琐事,但若是你有啥要紧事,尽管说来,俺替你打听打听!
初看起来,好像没啥东西?是因为这个 Demo 过于简单了,我们先简单看一下。
初始化 Swarm 时候,只能定义一个 OpenAI,表明整个系统中只能有一家 LLM 提供商。但每个 Agent 初始化的时候可以设置 model,意味着不同的 Agent 可以设定不同模型。
Agent A 的 function 定义,他是返回了一个 Agent。调用这个工具的时候,遇到类型为 Agent 会自动切换到该 Agent 来回复。但你可以看到 functions,它是可以接受一组 function。除了路由到其他 Agent,还可以包含常规的工具函数。
client.run()设定流程起始的 Agent A,以及它的第一条消息。
我们看一下运行日志,来确定一下整个流程。
[2024-10-14 09:23:53] Getting chat completion for...: [{'role': 'system', 'content': 'You are a helpful agent.'}, {'role': 'user', 'content': 'I want to talk to agent B,今天天气如何'}]
[2024-10-14 09:23:55] Received completion: ChatCompletionMessage(content='', role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_0_ebc5443d-0434-43af-b90a-c277b5729db3', function=Function(arguments='{}', name='transfer_to_agent_b'), type='function', index=0)])
[2024-10-14 09:23:55] Processing tool call: transfer_to_agent_b with arguments {}
[2024-10-14 09:23:55] Getting chat completion for...: [{'role': 'system', 'content': '你是三国演义中的张飞,使用他在三国演义中对话的语气和风格。'}, {'role': 'user', 'content': 'I want to talk to agent B,今天天气如何'}, {'content': '', 'role': 'assistant', 'function_call': None, 'tool_calls': [{'id': 'call_0_ebc5443d-0434-43af-b90a-c277b5729db3', 'function': {'arguments': '{}', 'name': 'transfer_to_agent_b'}, 'type': 'function', 'index': 0}], 'sender': 'Agent A'}, {'role': 'tool', 'tool_call_id': 'call_0_ebc5443d-0434-43af-b90a-c277b5729db3', 'tool_name': 'transfer_to_agent_b', 'content': '{"assistant": "Agent B"}'}]
[2024-10-14 09:23:57] Received completion: ChatCompletionMessage(content='Agent B,今日天气如何?俺张飞可不关心这些个琐事,但若是你有啥要紧事,尽管说来,俺替你打听打听!', role='assistant', function_call=None, tool_calls=None)
[2024-10-14 09:23:57] Ending turn.
流程:
除此之外,还有 Context 用于传递到系统指令或者 function 中,本文没有赘述,感兴趣的同学可以继续深入了解一下。
本文只是简单的 Demo 示例,可以看到通过设定 Agent 的 function 来指定它的路由,并且路由后除了系统指令变更,整个对话历史记录是整个交接到新的 Agent,从而能够利用新的 Agent 的指令完成更专业化的回复。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-03-09
LLM运行框架对比:ollama与vllm浅析
2025-03-09
真·企业级方案!MindSQL开源:四种训练方式+私有数据+RAG+生产高并发
2025-03-09
智能体的互联网时代来临,相当于http协议的MCP协议让智能体与数据源无缝连接
2025-03-09
Manus背后的核心技术:如何通过MCP简化AI集成
2025-03-08
5 个人、3 小时,开源复刻 Manus?
2025-03-08
AI 技术应用落地与投资机遇|线性观点
2025-03-08
解锁Dify:开源智能体的魔法棒,开启AI应用新旅程
2025-03-07
数字人的 DeepSeek 时代来了
2025-01-01
2024-07-25
2024-05-06
2025-01-21
2024-09-20
2024-07-20
2024-06-12
2024-08-13
2024-07-11
2024-12-26
2025-03-08
2025-03-03
2025-03-02
2025-03-01
2025-02-26
2025-02-23
2025-02-18
2025-02-15