Swarm框架实战教学笔记:从入门到企业级应用
本文面向智能体开发初学者,以"理论+可运行代码"形式循序渐进讲解OpenAI Swarm框架。内容涵盖核心概念、环境搭建、基础使用、智能体开发及企业级部署,所有代码基于GPT系列模型编写,可直接复现。
一、Swarm框架核心认知
1.1 什么是Swarm?
Swarm是OpenAI推出的轻量级多智能体协调框架,基于Chat Completions API构建,通过"智能体(Agent)"和"交接(Handoff)"两个核心原语,实现复杂任务的拆分与协同。
1.2 核心特点与优势
-
轻量级:无复杂依赖,客户端直接运行,学习成本低
-
高度可控:支持细粒度控制上下文、工具调用和智能体流转
-
无状态设计:调用间不存储状态,与Chat Completions API逻辑一致
-
灵活扩展:轻松集成外部工具,支持多智能体动态协作
1.3 与OpenAI Assistants API的区别
| 维度 | Swarm框架 | Assistants API |
|--------------|--------------------------|---------------------------|
| 服务类型 | 客户端框架 | 托管式服务 |
| 核心优势 | 完全透明化控制 | 内置内存/检索,快速开发 |
| 适用场景 | 多智能体协作、定制化需求 | 单智能体简单任务 |
二、Swarm环境搭建
2.1 前置条件
-
Python版本:3.10及以上(推荐3.11,兼容性更好)
-
OpenAI API密钥:需具备GPT系列模型调用权限(获取地址:OpenAI API密钥页面)
2.2 安装Swarm框架
支持两种安装方式,根据网络环境选择:
方式1:HTTPS方式(推荐,公网通用)
bash
# 直接通过GitHub仓库安装
pip install git+https://github.com/openai/swarm.git
方式2:SSH方式(私有仓库/网络限制场景)
bash
# 1. 先配置GitHub SSH密钥(本地执行)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 2. 再安装Swarm
pip install git+ssh://git@github.com/openai/swarm.git
2.3 配置API密钥
推荐通过环境变量配置,避免代码硬编码密钥:
Windows系统(命令行)
cmd
set OPENAI_API_KEY="sk-your-openai-api-key"
macOS/Linux系统(终端)
bash
export OPENAI_API_KEY="sk-your-openai-api-key"
# 永久生效:将上述命令添加到~/.bashrc或~/.zshrc
三、Swarm基础使用:快速入门
从"客户端初始化→消息构造→智能体调用"的完整流程,实现单轮对话:
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from swarm import Swarm
import os
def main():
# 1. 初始化Swarm客户端(优先读取环境变量)
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
raise ValueError("请先配置OPENAI_API_KEY环境变量")
client = Swarm(api_key=api_key)
# 2. 构造用户消息(遵循OpenAI消息格式)
messages = [
{
"role": "user",
"content": "用一句话介绍Swarm框架的核心价值"
}
]
# 3. 调用默认智能体执行(gpt-4o-mini平衡成本与性能)
response = client.run(
agent=None, # 使用Swarm内置基础智能体
messages=messages,
model="gpt-4o-mini"
)
# 4. 解析并打印结果
print("智能体响应:", response.messages[-1]["content"])
if __name__ == "__main__":
main()
3.1 代码说明与运行结果
-
核心流程:初始化客户端 → 构造消息 → 执行对话 → 解析结果
-
运行方式 :保存为basic_usage.py,终端执行
python basic_usage.py -
预期结果:如"Swarm框架的核心价值是轻量且灵活地实现多智能体协作,让复杂任务的拆分与执行更可控"
四、Swarm核心开发:单个智能体创建
智能体(Agent)是Swarm的基本单位,核心属性为:指令(instructions) (定义角色与行为)和工具(functions)(关联外部能力)。
4.1 无外部工具的智能体
适用于特定领域问答、内容生成等场景,以"Python基础讲师"为例:
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from swarm import Swarm, Agent
import os
def create_simple_agent():
# 1. 定义智能体:明确角色与行为规范
python_teacher_agent = Agent(
name="Python基础讲师",
instructions="""你是耐心的Python基础讲师,需满足:
1. 用中学生能听懂的语言解释概念;
2. 每个知识点配1个极简代码示例;
3. 专业术语需即时解释。""",
functions=None # 不使用外部工具
)
# 2. 初始化客户端
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
# 3. 多轮对话交互
messages = []
while True:
user_input = input("请输入Python学习问题(输入exit退出):")
if user_input.lower() == "exit":
print("教学结束,再见!")
break
messages.append({"role": "user", "content": user_input})
# 4. 调用智能体并获取响应
response = client.run(
agent=python_teacher_agent,
messages=messages,
model="gpt-4o-mini"
)
# 5. 更新对话历史并输出结果
assistant_msg = response.messages[-1]
messages.append(assistant_msg)
print(f"\nPython基础讲师:{assistant_msg['content']}\n")
if __name__ == "__main__":
create_simple_agent()
4.2 调用外部工具的智能体
当智能体需要获取实时数据或操作外部系统时,通过@tool装饰器集成工具函数,以"天气查询"为例:
步骤1:完整代码实现
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from swarm import Swarm, Agent
from swarm.tools import tool # 工具注册装饰器
import os
import json # 安全解析参数,替代eval
# 1. 定义外部工具函数(模拟天气API)
@tool # 必须添加:标记为Swarm可调用工具
def get_weather(city: str, date: str) -> str:
"""
查询指定城市指定日期的天气信息
参数:
city: 城市名称(如"北京"、"上海")
date: 日期(格式"YYYY-MM-DD",如"2025-12-05")
返回:
温度、天气状况等信息字符串
"""
# 模拟API返回(实际项目替换为requests.get真实请求)
weather_data = {
"北京_2025-12-05": "晴,-5℃~3℃,东北风2级,空气良",
"上海_2025-12-05": "多云,3℃~8℃,东南风1级,空气优",
"广州_2025-12-05": "晴,15℃~22℃,南风2级,空气优"
}
key = f"{city}_{date}"
return weather_data.get(key, f"暂未查询到{city}{date}的天气数据")
# 2. 创建支持工具调用的智能体
def create_weather_agent():
return Agent(
name="天气查询助手",
instructions="""工作流程:
1. 检查用户查询是否包含"城市"和"日期";
2. 信息缺失则追问补充(如"请告诉我城市和日期");
3. 信息完整则调用get_weather函数,用自然语言整理结果;
4. 禁止编造数据,查询失败如实告知;
5. 记住用户历史查询信息,同城市追问无需重复问城市""",
functions=[get_weather] # 关联工具函数
)
# 3. 智能体调用与工具执行逻辑(含对话记忆)
def run_weather_agent():
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
weather_agent = create_weather_agent()
messages = [] # 维护对话历史,实现记忆能力
print("天气查询助手:您好!请告诉我您想查询的城市和日期?")
while True:
user_input = input("您:")
if user_input.lower() in ["exit", "退出"]:
print("天气查询助手:感谢使用,祝您生活愉快!")
break
messages.append({"role": "user", "content": user_input})
response = client.run(agent=weather_agent, messages=messages, model="gpt-4o-mini")
latest_msg = response.messages[-1]
messages.append(latest_msg)
# 处理工具调用请求
if "tool_calls" in latest_msg:
for tool_call in latest_msg["tool_calls"]:
func_name = tool_call["function"]["name"]
# 安全解析参数(避免注入风险)
try:
args = json.loads(tool_call["function"]["arguments"])
except json.JSONDecodeError:
print("天气查询助手:参数解析失败,请重试")
messages.pop()
continue
# 执行工具函数并回传结果
if func_name == "get_weather":
weather_result = get_weather(** args)
messages.append({
"role": "tool",
"name": func_name,
"content": weather_result,
"tool_call_id": tool_call["id"] # 关联调用ID
})
# 智能体整理结果为自然语言
final_response = client.run(agent=weather_agent, messages=messages, model="gpt-4o-mini")
final_msg = final_response.messages[-1]
messages.append(final_msg)
print(f"天气查询助手:{final_msg['content']}")
else:
print(f"天气查询助手:{latest_msg['content']}")
if __name__ == "__main__":
run_weather_agent()
4.3 关键知识点
-
@tool装饰器:Swarm识别工具的唯一标记,不可省略 -
函数文档字符串:智能体依赖其理解功能与参数,格式必须规范
-
参数解析 :用
json.loads替代eval,避免安全风险 -
工具调用流程:智能体发起调用 → 执行函数 → 结果回传 → 生成最终响应
五、Swarm进阶开发:多智能体协作
多智能体核心是交接(Handoff)------当一个智能体无法完成任务时,转交给更专业的智能体。通过"需求分析→代码实现"场景演示协作逻辑。
5.1 多智能体协作完整示例
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from swarm import Swarm, Agent
import os
# 1. 核心优化:用映射表解决循环引用
agent_map = {} # 存储智能体,避免函数调用未定义的智能体
def transfer_to_developer():
"""转交给Python开发工程师"""
return agent_map["developer"]
def transfer_to_analyst():
"""转回给需求分析师"""
return agent_map["analyst"]
# 2. 定义各职能智能体(含记忆相关指令)
# 智能体1:需求分析师(对话入口)
analyst_agent = Agent(
name="需求分析师",
instructions="""职责:
1. 模糊需求需追问细节(如"写脚本"需问功能/输入输出);
2. 明确需求整理为"功能+输入+输出+约束"格式;
3. 完成后调用transfer_to_developer转交开发;
4. 记住已确认的需求细节,避免重复询问""",
functions=[transfer_to_developer]
)
# 智能体2:Python开发工程师
developer_agent = Agent(
name="Python开发工程师",
instructions="""职责:
1. 代码必须可运行,含详细注释;
2. 附带依赖、运行方式、输入输出示例;
3. 需求疑问调用transfer_to_analyst转回;
4. 遵循PEP8规范,优先用内置库;
5. 记住历史需求信息和用户交互内容""",
functions=[transfer_to_analyst]
)
# 注册智能体到映射表
agent_map["analyst"] = analyst_agent
agent_map["developer"] = developer_agent
# 3. 多智能体协作流程(全局维护对话历史,实现记忆共享)
def run_multi_agent_collab():
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
current_agent = analyst_agent # 初始智能体
messages = [] # 核心:统一对话历史存储
# 测试需求
user_requirement = "写Python脚本:统计文本文件中每个单词出现次数,忽略大小写,排除标点"
print(f"用户:{user_requirement}\n")
messages.append({"role": "user", "content": user_requirement})
while True:
# 调用当前智能体(传入完整历史,确保记忆连续性)
response = client.run(
agent=current_agent,
messages=messages,
model="gpt-4o-mini"
)
latest_msg = response.messages[-1]
messages.append(latest_msg)
print(f"{current_agent.name}:{latest_msg['content']}\n")
# 处理智能体交接
if "tool_calls" in latest_msg:
for tool_call in latest_msg["tool_calls"]:
func_name = tool_call["function"]["name"]
if func_name == "transfer_to_developer":
current_agent = developer_agent
print("=== 交接:需求分析师 → Python开发工程师 ===\n")
messages.append({
"role": "system",
"content": f"已转交至{current_agent.name},基于历史需求开发"
})
elif func_name == "transfer_to_analyst":
current_agent = analyst_agent
print("=== 交接:Python开发工程师 → 需求分析师 ===\n")
# 记录交接结果
messages.append({
"role": "tool",
"name": func_name,
"content": f"已转交至{current_agent.name}"
})
else:
# 无工具调用表示任务完成,测试记忆能力
user_follow = "若统计中文词语,脚本需怎么修改?"
print(f"用户:{user_follow}")
messages.append({"role": "user", "content": user_follow})
follow_response = client.run(agent=current_agent, messages=messages, model="gpt-4o-mini")
print(f"{current_agent.name}:{follow_response.messages[-1]['content']}")
break
if __name__ == "__main__":
run_multi_agent_collab()
5.2 协作核心逻辑
-
交接函数:通过映射表获取目标智能体,解决循环引用问题
-
状态管理:跟踪当前智能体和完整对话历史,确保上下文连贯
-
分工原则:单一智能体专注单一领域,通过交接实现"专业分工"
六、企业项目实战:智能客服工单系统
实现"命令行调试+Web生产交互"双形态智能客服,核心功能:问题分类、FAQ解答、复杂问题工单创建。
6.1 项目架构设计
6.1.1 架构总览(分层设计)
-
智能体层:Swarm多智能体(前端交互、知识库、工单处理)
-
业务层:工具函数(工单创建)、FAQ知识库
-
接入层:命令行(调试)/ FastAPI(Web服务)
-
前端层:HTML+JS+Bootstrap(交互界面)
6.1.2 技术栈
-
后端:Python 3.11 + Swarm + FastAPI
-
前端:原生JS + Bootstrap 5
-
模型:gpt-4o-mini(开发)/ gpt-4o(生产)
6.2 命令行版:快速验证(完整代码)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from swarm import Swarm, Agent
from swarm.tools import tool
import os
import json
from datetime import datetime
# 1. 工具函数与知识库
@tool
def create_work_order(user_name: str, user_phone: str, problem_type: str, problem_desc: str, assign_dept: str) -> str:
"""创建企业客服工单"""
work_order_id = f"WO_{datetime.now().strftime('%Y%m%d%H%M%S')}_{os.urandom(4).hex()[:4]}"
work_order = {
"工单编号": work_order_id,
"用户信息": {"姓名": user_name, "电话": user_phone},
"问题信息": {"类型": problem_type, "描述": problem_desc},
"创建时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
print("\n=== 生成工单 ===")
print(json.dumps(work_order, ensure_ascii=False, indent=2))
return f"工单创建成功!编号:{work_order_id},24小时内联系您。"
# FAQ知识库
FAQ_DATABASE = {
"账号注册": "1. 官网点击'注册';2. 手机号收验证码;3. 设置密码。",
"会员费用": "月卡39元、季卡99元、年卡299元,支持微信/支付宝。",
"密码找回": "登录页点'忘记密码',输入注册手机号重置。"
}
# 2. 智能体定义(映射表解决循环引用)
agent_map = {}
def transfer_to_knowledge(): return agent_map["knowledge"]
def transfer_to_workorder(): return agent_map["workorder"]
# 智能体1:前端交互客服
frontend_agent = Agent(
name="前端交互客服",
instructions="""1. 首次问候并收集用户姓名+电话;
2. 关键词判断:含"注册/登录/密码/费用"转知识库,含"故障/异常"转工单;
3. 确认信息后才能转交,缺失则追问""",
functions=[transfer_to_knowledge, transfer_to_workorder]
)
# 智能体2:知识库客服
knowledge_agent = Agent(
name="知识库客服",
instructions=f"""1. 优先用FAQ回答:{json.dumps(FAQ_DATABASE, ensure_ascii=False)};
2. 回答前称呼用户姓名,回答后问"还有其他问题吗?";
3. 非知识库问题转工单,携带用户信息""",
functions=[transfer_to_workorder]
)
# 智能体3:工单处理客服
workorder_agent = Agent(
name="工单处理客服",
instructions="""1. 从历史提取用户信息,无需重复询问;
2. 追问问题细节,收集完整信息后调用create_work_order;
3. 告知工单编号及服务承诺""",
functions=[create_work_order]
)
# 注册智能体
agent_map["frontend"] = frontend_agent
agent_map["knowledge"] = knowledge_agent
agent_map["workorder"] = workorder_agent
# 3. 系统运行入口
def run_customer_service():
print("=== 企业智能客服系统 ===")
print("前端交互客服:您好,请告诉我您的姓名和联系电话?\n")
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
current_agent = frontend_agent
messages = [] # 全局对话历史,实现记忆共享
while True:
user_input = input("您:")
if user_input.lower() in ["exit", "退出"]:
# 记忆应用:提取用户姓名礼貌道别
user_name = next((msg["content"].split("叫")[1] for msg in messages if "叫" in msg["content"]), "")
print(f"\n{current_agent.name}:{user_name}先生/女士,感谢咨询!")
break
messages.append({"role": "user", "content": user_input})
response = client.run(agent=current_agent, messages=messages, model="gpt-4o-mini")
latest_msg = response.messages[-1]
messages.append(latest_msg)
# 处理交接/工单
if "tool_calls" in latest_msg:
for tool_call in latest_msg["tool_calls"]:
func_name = tool_call["function"]["name"]
if func_name in ["transfer_to_knowledge", "transfer_to_workorder"]:
current_agent = eval(func_name)()
print(f"\n=== 转接至{current_agent.name} ===")
# 传递用户信息
user_info = ";".join([msg["content"] for msg in messages if "姓名" in msg["content"] or "电话" in msg["content"]])
messages.append({"role": "system", "content": f"用户信息:{user_info}"})
transfer_resp = client.run(agent=current_agent, messages=messages, model="gpt-4o-mini")
latest_msg = transfer_resp.messages[-1]
messages.append(latest_msg)
elif func_name == "create_work_order":
args = json.loads(tool_call["function"]["arguments"])
work_result = create_work_order(** args)
messages.append({"role": "tool", "name": func_name, "content": work_result})
final_resp = client.run(agent=current_agent, messages=messages, model="gpt-4o-mini")
latest_msg = final_resp.messages[-1]
messages.append(latest_msg)
print(f"\n{current_agent.name}:{latest_msg['content']}\n")
if __name__ == "__main__":
run_customer_service()
6.3 Web版:生产级交互(完整实现)
6.3.1 项目目录结构
text
swarm-cs-web/ # 项目根目录
├── app/ # 后端核心
│ ├── __init__.py
│ ├── agent.py # 智能体定义
│ ├── tools.py # 工具函数
│ ├── main.py # FastAPI入口
│ └── config.py # 配置(日志/环境变量)
├── static/ # 前端静态文件
│ ├── index.html # 交互页面
│ ├── css/style.css # 样式
│ └── js/chat.js # 交互逻辑
├── .env # 敏感配置(不提交代码)
└── requirements.txt # 依赖清单
6.3.2 核心后端代码(app/main.py)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from fastapi import FastAPI, HTTPException, Depends
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
from pydantic import BaseModel
from swarm import Swarm
from app.agent import agent_map
from app.config import OPENAI_API_KEY, MODEL_NAME, logger
import json
from datetime import datetime
# 初始化FastAPI
app = FastAPI(title="Swarm Web智能客服", version="1.0")
app.mount("/static", StaticFiles(directory="static"), name="static")
# 初始化Swarm客户端
if not OPENAI_API_KEY:
raise ValueError("请配置OPENAI_API_KEY环境变量")
client = Swarm(api_key=OPENAI_API_KEY)
# 请求/响应模型
class ChatRequest(BaseModel):
user_id: str # 区分用户
user_input: str # 用户输入
conversation_id: str # 对话ID(关联上下文)
class ChatResponse(BaseModel):
agent_name: str # 回复智能体名称
reply: str # 回复内容
conversation_id: str # 回传对话ID
# 对话历史存储(生产用Redis替代)
conversation_store = {} # 结构:{conv_id: {"messages": [], "current_agent": Agent}}
# 辅助函数:提取用户信息(实现记忆)
def extract_user_info(messages: list) -> dict:
user_info = {"name": "", "phone": ""}
for msg in messages:
content = msg.get("content", "")
# 提取姓名(2-4字中文)
if not user_info["name"]:
import re
name_match = re.search(r"[我叫我是]([\u4e00-\u9fa5]{2,4})", content)
if name_match:
user_info["name"] = name_match.group(1)
# 提取手机号(11位)
if not user_info["phone"]:
phone_match = re.search(r"1[3-9]\d{9}", content)
if phone_match:
user_info["phone"] = phone_match.group()
return user_info
# 路由:前端页面入口
@app.get("/", response_class=FileResponse)
async def read_root():
return "static/index.html"
# 核心路由:对话API
@app.post("/api/chat", response_model=ChatResponse)
async def chat(req: ChatRequest):
try:
# 初始化对话历史
if req.conversation_id not in conversation_store:
conversation_store[req.conversation_id] = {
"messages": [],
"current_agent": agent_map["frontend"],
"user_info": {}
}
conv_data = conversation_store[req.conversation_id]
messages = conv_data["messages"]
current_agent = conv_data["current_agent"]
# 添加用户输入
messages.append({"role": "user", "content": req.user_input, "timestamp": datetime.now().isoformat()})
# 提取并传递用户信息
conv_data["user_info"] = extract_user_info(messages)
user_info_prompt = ""
if conv_data["user_info"]["name"]:
user_info_prompt = f"用户姓名:{conv_data['user_info']['name']};"
if conv_data["user_info"]["phone"]:
user_info_prompt += f"用户电话:{conv_data['user_info']['phone']};"
if user_info_prompt:
messages.insert(-1, {"role": "system", "content": f"已知用户信息:{user_info_prompt}"})
# 调用智能体
response = client.run(agent=current_agent, messages=messages, model=MODEL_NAME)
latest_msg = response.messages[-1]
messages.append(latest_msg)
if user_info_prompt:
messages.pop(-2) # 移除临时提示
# 处理交接/工单
if "tool_calls" in latest_msg:
for tool_call in latest_msg["tool_calls"]:
func_name = tool_call["function"]["name"]
# 处理智能体交接
if func_name in ["transfer_to_knowledge", "transfer_to_workorder"]:
new_agent = eval(func_name)()
conv_data["current_agent"] = new_agent
# 传递用户信息
messages.append({"role": "system", "content": f"已转交至{new_agent.name},{user_info_prompt}"})
messages.append({"role": "tool", "name": func_name, "content": f"已转接至{new_agent.name}"})
# 获取新智能体回复
transfer_resp = client.run(agent=new_agent, messages=messages, model=MODEL_NAME)
latest_msg = transfer_resp.messages[-1]
messages.append(latest_msg)
messages.pop(-3) # 移除交接提示
# 处理工单创建
elif func_name == "create_work_order":
from app.tools import create_work_order
args = json.loads(tool_call["function"]["arguments"])
# 自动填充用户信息
if conv_data["user_info"]["name"] and not func_args.get("user_name"):
func_args["user_name"] = conv_data["user_info"]["name"]
if conv_data["user_info"]["phone"] and not func_args.get("user_phone"):
func_args["user_phone"] = conv_data["user_info"]["phone"]
work_result = create_work_order(** args)
messages.append({"role": "tool", "name": func_name, "content": work_result})
final_resp = client.run(agent=current_agent, messages=messages, model=MODEL_NAME)
latest_msg = final_resp.messages[-1]
messages.append(latest_msg)
# 更新对话存储并返回结果
conversation_store[req.conversation_id] = conv_data
return ChatResponse(
agent_name=conv_data["current_agent"].name,
reply=latest_msg["content"],
conversation_id=req.conversation_id
)
except Exception as e:
logger.error(f"对话异常: {str(e)}")
raise HTTPException(status_code=500, detail="服务异常,请稍后再试")
# 启动命令:uvicorn app.main:app --host 0.0.0.0 --port 8000
6.3.3 前端核心代码(static/js/chat.js)
javascript
// 生成唯一对话ID(本地存储,刷新不丢失)
let conversationId = localStorage.getItem('conversationId') || generateConversationId();
localStorage.setItem('conversationId', conversationId);
// 生成对话ID
function generateConversationId() {
return 'conv_' + Date.now() + '_' + Math.floor(Math.random() * 1000);
}
// 发送消息到后端
async function sendMessage() {
const userId = document.getElementById('userId').value.trim();
const userInput = document.getElementById('userInput').value.trim();
// 输入验证
if (!userId) return alert('请输入用户名');
if (!userInput) return alert('请输入您的问题');
// 显示用户消息并清空输入框
document.getElementById('userInput').value = '';
addMessageToUI('user', userId, userInput);
try {
// 调用后端API
const response = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
user_id: userId,
user_input: userInput,
conversation_id: conversationId
})
});
if (!response.ok) throw new Error('服务请求失败');
const data = await response.json();
// 显示智能体回复
addMessageToUI('agent', data.agent_name, data.reply);
} catch (error) {
addMessageToUI('agent', '系统提示', '服务暂时不可用,请稍后再试');
}
}
// 渲染消息到页面
function addMessageToUI(role, name, content) {
const chatContainer = document.getElementById('chatContainer');
const msgDiv = document.createElement('div');
const sourceSpan = document.createElement('span');
sourceSpan.className = 'msg-source';
sourceSpan.textContent = name;
msgDiv.appendChild(sourceSpan);
// 处理换行(将\n转为)
const contentDiv = document.createElement('div');
contentDiv.innerHTML = content.replace(/\n/g, '');
msgDiv.appendChild(contentDiv);
// 设置消息样式
msgDiv.className = role === 'user' ? 'user-message' : 'agent-message';
chatContainer.appendChild(msgDiv);
// 滚动到底部
chatContainer.scrollTop = chatContainer.scrollHeight;
}
// 绑定事件
document.getElementById('sendBtn').addEventListener('click', sendMessage);
document.getElementById('userInput').addEventListener('keypress', (e) => {
if (e.key === 'Enter') sendMessage();
});
// 页面加载时发送欢迎消息
window.onload = () => {
addMessageToUI('agent', '前端交互客服', '您好,我是智能客服,请告诉我您的需求及姓名、联系电话!');
};
6.3.4 依赖文件(requirements.txt)
text
# 智能体框架
git+https://github.com/openai/swarm.git
# Web框架
fastapi==0.110.0
uvicorn==0.29.0
# 环境变量管理
python-dotenv==1.0.1
# 其他依赖
requests==2.31.0
6.4 项目运行与测试
6.4.1 本地运行步骤
bash
# 1. 进入项目根目录
cd swarm-cs-web
# 2. 创建并激活虚拟环境
python -m venv venv
# Windows: venv\Scripts\activate
# macOS/Linux: source venv/bin/activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 配置环境变量(创建.env文件)
echo "OPENAI_API_KEY=sk-your-key" > .env
echo "MODEL_NAME=gpt-4o-mini" >> .env
# 5. 启动服务
uvicorn app.main:app --host 0.0.0.0 --port 8000
# 6. 访问页面:浏览器打开 http://localhost:8000
6.4.2 测试场景演示
-
用户输入:
我想了解会员费用→ 客服追问姓名电话 -
用户输入:
张三,13800138000→ 转接知识库客服并回复费用 -
用户输入:
登录后看不到历史订单→ 转接工单客服 -
用户输入:
所有订单都看不到,昨天正常→ 创建工单并返回编号
七、Swarm智能体应用部署实战
覆盖本地调试和云服务器生产部署,核心解决"后台运行""进程守护""安全访问"问题。
7.1 部署前置准备
-
环境一致性 :确保Python版本≥3.10,Linux需安装
libssl-dev、gcc -
依赖固化 :执行
pip freeze > requirements.txt,Swarm指定commit号 -
配置规范 :敏感信息用
python-dotenv加载,区分开发/生产配置 -
网络规划:确认端口未占用,提前申请SSL证书(HTTPS)
7.2 本地调试部署(开发者场景)
7.2.1 后台运行与日志管理
1. Linux/macOS(使用nohup)
bash
# 后台启动服务,日志输出至swarm_service.log
nohup uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4 > swarm_service.log 2>&1 &
# 查看实时日志
tail -f swarm_service.log
# 停止服务(通过端口查询进程ID)
lsof -i:8000 | grep -v PID | awk '{print $2}' | xargs kill -9
2. Windows(使用任务计划程序)
cmd
:: 1. 创建启动脚本start_service.bat
@echo off
cd /d D:\swarm-cs-web
call venv\Scripts\activate.bat
uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 2 > service.log 2>&1
- 控制面板→任务计划程序→创建基本任务:登录时启动,选择start_service.bat
7.3 云服务器生产部署(企业级场景)
推荐Ubuntu 22.04 LTS,核心目标:稳定性、安全性、可扩展性。
7.3.1 服务器初始化
bash
# 1. 更新系统依赖
sudo apt update && sudo apt upgrade -y
# 2. 安装Python及工具
sudo apt install python3 python3-venv python3-pip -y
# 3. 禁用密码登录,启用SSH密钥(安全加固)
sudo vi /etc/ssh/sshd_config
# 修改:PasswordAuthentication no;PubkeyAuthentication yes
sudo systemctl restart sshd
# 4. 配置防火墙(仅开放22、80、443端口)
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
7.3.2 项目部署与进程守护(Supervisor)
bash
# 1. 上传项目文件(本地执行)
scp -r /本地项目路径 root@服务器IP:/opt/
# 2. 服务器端配置环境
cd /opt/swarm-cs-web
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
# 3. 配置环境变量
sudo vi .env # 写入OPENAI_API_KEY等配置
# 4. 安装Supervisor
sudo apt install supervisor -y
# 5. 配置Supervisor
sudo vi /etc/supervisor/conf.d/swarm-cs.conf
Supervisor配置内容:
ini
[program:swarm-cs]
command=/opt/swarm-cs-web/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4
directory=/opt/swarm-cs-web
user=root
autostart=true # 开机自动启动
autorestart=true # 进程异常自动重启
redirect_stderr=true # 错误日志重定向
stdout_logfile=/var/log/swarm-cs.log # 日志路径
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
bash
# 6. 启动Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start swarm-cs
# 查看状态
sudo supervisorctl status swarm-cs
7.3.3 安全加固:Nginx反向代理与HTTPS
bash
# 1. 安装Nginx
sudo apt install nginx -y
# 2. 创建Nginx配置
sudo vi /etc/nginx/sites-available/swarm-cs
Nginx配置内容:
nginx
server {
listen 80;
server_name your-domain.com; # 替换为你的域名
return 301 https://$host$request_uri; # HTTP转HTTPS
}
server {
listen 443 ssl;
server_name your-domain.com;
# SSL证书配置(替换为你的证书路径)
ssl_certificate /etc/nginx/ssl/your-domain.crt;
ssl_certificate_key /etc/nginx/ssl/your-domain.key;
# 反向代理配置
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态文件缓存优化
location /static {
alias /opt/swarm-cs-web/static;
expires 1d;
}
}
bash
# 3. 启用配置并重启Nginx
sudo ln -s /etc/nginx/sites-available/swarm-cs /etc/nginx/sites-enabled/
sudo nginx -t # 检查配置
sudo systemctl restart nginx
# 4. 申请免费SSL证书(Let's Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com
7.4 部署后监控与维护
7.4.1 日志分析
部署后需建立"分层日志"分析机制,覆盖应用、进程、反向代理全链路,快速定位问题根源。
1. 核心日志位置与用途
| 日志类型 | 路径 | 核心监控内容 |
|---|---|---|
| 应用日志 | /var/log/swarm-cs.log(Supervisor配置) | Swarm调用错误、API密钥失效、代码异常 |
| Supervisor日志 | /var/log/supervisor/ | 进程启动失败、自动重启记录 |
| Nginx日志 | /var/log/nginx/access.log/error.log | HTTP请求异常、SSL握手失败、反向代理错误 |
| 系统日志 | /var/log/syslog | 端口占用、权限不足、内存溢出(OOM) |
2. 常用日志分析命令
bash
# 1. 实时跟踪应用错误(过滤ERROR级别)
tail -f /var/log/swarm-cs.log | grep -i "ERROR"
# 2. 统计近1小时API调用失败次数
grep "HTTP 500" /var/log/nginx/access.log | grep "$(date -d '1 hour ago' +'%d/%b/%Y:%H')" | wc -l
# 3. 查找Swarm密钥相关错误
grep -n "API key" /var/log/swarm-cs.log
# 4. 导出近24小时日志到文件(用于离线分析)
cp /var/log/swarm-cs.log /tmp/swarm-$(date +%Y%m%d).log
# 5. 清理超过30天的日志(避免磁盘占满)
find /var/log -name "swarm-*.log" -mtime +30 -delete
3. 日志告警配置(企业级扩展)
通过logrotate实现日志轮转,结合fail2ban或云监控工具触发告警:
bash
# 1. 配置logrotate(sudo vi /etc/logrotate.d/swarm-cs)
/var/log/swarm-cs.log {
daily # 每日轮转
rotate 14 # 保留14天日志
compress # 压缩旧日志
delaycompress # 延迟压缩(保留最新日志未压缩)
missingok # 日志不存在不报错
notifempty # 空日志不轮转
create 0644 root root # 新建日志权限
}
# 2. 配置fail2ban防御异常请求(针对Nginx 403/404风暴)
sudo vi /etc/fail2ban/filter.d/nginx-swarm.conf
# 新增过滤规则:
[Definition]
failregex = ^<HOST> -.*"(GET|POST) /api/chat.*" 403
ignoreregex =
# 启用规则并设置告警
sudo fail2ban-client add nginx-swarm auto
sudo fail2ban-client set nginx-swarm filter nginx-swarm
sudo fail2ban-client set nginx-swarm action iptables-multiport
sudo fail2ban-client set nginx-swarm logpath /var/log/nginx/access.log
sudo fail2ban-client start nginx-swarm
7.4.2 性能监控
聚焦"系统资源+接口性能"双维度,确保服务稳定运行:
1. 系统资源监控
bash
# 1. 实时监控CPU/内存/磁盘(基础工具)
htop # 替代top,更直观的交互界面
df -h # 查看磁盘占用(重点关注/var分区)
free -h # 查看内存使用(避免Swap频繁使用)
# 2. 定时记录资源使用(添加到crontab)
echo "*/5 * * * * root top -b -n 1 >> /var/log/system-resource.log" | sudo tee -a /etc/crontab
# 3. 可视化监控(企业级推荐)
# 安装nmon(轻量级系统监控工具)
sudo apt install nmon -y
# 运行:输入c看CPU,m看内存,d看磁盘,q退出
2. 接口性能监控
基于FastAPI自带的/metrics端点集成Prometheus+Grafana:
bash
# 1. 安装依赖(项目虚拟环境中)
pip install prometheus-fastapi-instrumentator
# 2. 修改app/main.py添加监控配置
from prometheus_fastapi_instrumentator import Instrumentator
# 初始化监控器
Instrumentator().instrument(app).expose(app)
# 3. 重启服务
sudo supervisorctl restart swarm-cs
# 4. 访问监控端点验证:http://localhost:8000/metrics
# 5. 集成Grafana(参考官方文档配置数据源,监控指标如:request_duration_seconds)
7.4.3 故障排查与恢复
建立"症状→排查→恢复"标准化流程,减少故障耗时:
1. 常见故障场景与解决方案
| 故障症状 | 排查步骤 | 解决方案 |
|---|---|---|
| 服务无法访问 | 1. 检查Nginx状态;2. 检查Swarm进程;3. 检查端口占用 | 1. sudo systemctl restart nginx;2. sudo supervisorctl restart swarm-cs;3. 杀死占用端口进程(lsof -i:8000 |
| API调用超时 | 1. 查看应用日志;2. 测试OpenAI API连通性;3. 检查网络带宽 | 1. 更换API密钥;2. 配置代理(如export HTTP_PROXY=xxx);3. 升级服务器带宽 |
| 工具调用失败 | 1. 查看工具函数日志;2. 验证函数参数;3. 检查依赖包 | 1. 修复函数代码;2. 补充参数校验逻辑;3. 重新安装依赖(pip install --force-reinstall -r requirements.txt) |
| 内存持续升高 | 1. 查看进程内存占用;2. 分析代码内存泄漏;3. 检查对话历史存储 | 1. 增加服务器内存;2. 限制单对话历史长度;3. 定期重启服务(添加crontab:0 3 * * * sudo supervisorctl restart swarm-cs) |
2. 数据备份与恢复
针对对话历史和配置文件建立备份机制:
bash
# 1. 配置文件备份(每日凌晨2点执行)
echo "0 2 * * * root tar -zcvf /backup/swarm-config-$(date +%Y%m%d).tar.gz /opt/swarm-cs-web/.env /etc/supervisor/conf.d/swarm-cs.conf /etc/nginx/sites-available/swarm-cs" | sudo tee -a /etc/crontab
# 2. 对话历史备份(若使用Redis存储,需配置RDB/AOF持久化)
# 修改Redis配置(/etc/redis/redis.conf)
save 900 1 # 900秒内1次修改则持久化
save 300 10 # 300秒内10次修改则持久化
appendonly yes # 开启AOF持久化
# 3. 恢复命令(配置文件)
tar -zxvf /backup/swarm-config-20251205.tar.gz -C /
7.4.4 日常维护清单
制定周期性维护计划,降低突发故障风险:
-
每日:检查核心日志错误、系统资源使用率(CPU<80%,内存<85%,磁盘<90%)
-
每周:更新依赖包(pip install --upgrade -r requirements.txt)、清理过期日志
-
每月:备份配置文件与数据、检查服务器安全补丁(sudo apt update && sudo apt upgrade -y)
-
每季度:压测接口性能(使用locust工具)、评估服务器扩容需求
八、Swarm框架进阶与生态扩展
8.1 智能体能力增强
8.1.1 多模态支持(图片/语音)
结合OpenAI多模态模型(如gpt-4o),实现图片识别与语音交互:
python
from swarm import Swarm, Agent
import base64
import requests
# 工具函数:图片转Base64(用于模型输入)
def image_to_base64(image_path):
with open(image_path, "rb") as f:
return base64.b64encode(f.read()).decode()
# 多模态智能体
vision_agent = Agent(
name="多模态助手",
instructions="""1. 接收图片Base64编码或语音转文字内容;
2. 图片需描述内容并提取关键信息;
3. 语音转文字后按用户需求响应""",
functions=None
)
# 调用示例(图片分析)
def analyze_image(image_path):
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "分析这张图片的内容"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_to_base64(image_path)}"}}
]
}
]
response = client.run(agent=vision_agent, messages=messages, model="gpt-4o")
print(response.messages[-1]["content"])
8.1.2 长对话记忆优化
通过"历史摘要+关键信息提取"解决上下文长度限制:
python
def summarize_conversation(messages, max_tokens=300):
"""总结对话历史,保留关键信息"""
summary_agent = Agent(
name="对话总结助手",
instructions=f"将对话历史总结为{max_tokens}字以内,保留用户需求、智能体响应核心内容"
)
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
response = client.run(agent=summary_agent, messages=messages, model="gpt-4o-mini")
return response.messages[-1]["content"]
# 长对话处理逻辑
def handle_long_conversation(messages):
# 当对话历史超过10轮时进行总结
if len(messages) > 20: # 每轮含user和assistant,共20条
summary = summarize_conversation(messages)
# 保留总结+最新3轮对话
new_messages = [{"role": "system", "content": f"对话总结:{summary}"}] + messages[-6:]
return new_messages
return messages
8.2 生态工具集成
8.2.1 向量数据库集成(知识库增强)
结合Pinecone向量数据库,实现智能体知识库的高效检索:
python
from pinecone import Pinecone
from openai import OpenAI
import os
# 初始化向量数据库
pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY"))
index = pc.Index("swarm-knowledge")
# 初始化OpenAI客户端(用于生成嵌入向量)
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 工具函数:知识库检索
@tool
def search_knowledge(query: str) -> str:
"""检索企业知识库,获取相关信息"""
# 生成查询向量
embedding = openai_client.embeddings.create(
input=query, model="text-embedding-3-small"
).data[0].embedding
# 向量检索(返回Top3相关结果)
results = index.query(vector=embedding, top_k=3, include_metadata=True)
# 整理结果
return "\n".join([f"内容:{match['metadata']['content']}" for match in results["matches"]])
# 带知识库的智能体
knowledge_agent = Agent(
name="知识库增强客服",
instructions="""1. 先调用search_knowledge检索知识库;
2. 结合检索结果和自身知识回答用户问题;
3. 未找到相关信息时如实告知""",
functions=[search_knowledge]
)
8.2.2 任务调度集成(定时任务)
结合APScheduler实现智能体定时任务能力:
python
from apscheduler.schedulers.background import BackgroundScheduler
from swarm import Swarm, Agent
# 定时任务:每日天气推送
def daily_weather_push(phone, city):
weather_agent = Agent(
name="天气推送助手",
instructions="生成简洁的天气推送文案,包含温度、天气状况和出行建议"
)
client = Swarm(api_key=os.getenv("OPENAI_API_KEY"))
messages = [{"role": "user", "content": f"生成{city}今日天气推送文案,适合短信发送"}]
response = client.run(agent=weather_agent, messages=messages, model="gpt-4o-mini")
# 模拟短信发送(实际替换为短信API)
print(f"向{phone}推送:{response.messages[-1]['content']}")
# 初始化调度器
scheduler = BackgroundScheduler()
# 添加定时任务(每日早8点执行)
scheduler.add_job(
daily_weather_push,
"cron",
hour=8,
args=["13800138000", "北京"] # 实际项目从数据库读取用户信息
)
# 启动调度器
scheduler.start()
8.3 生产环境最佳实践
8.3.1 安全加固措施
-
API密钥安全:使用云服务商密钥管理服务(如AWS Secrets Manager),替代本地.env文件
-
接口权限控制:通过FastAPI的OAuth2实现接口认证,示例:
python
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# 接口认证依赖
def get_current_user(token: str = Depends(oauth2_scheme)):
# 实际项目从数据库验证token
if token != os.getenv("API_TOKEN"):
raise HTTPException(status_code=401, detail="无效令牌")
return {"username": "valid_user"}
# 受保护的接口
@app.post("/api/chat", dependencies=[Depends(get_current_user)])
async def chat(req: ChatRequest):
# 原有逻辑...
数据加密:对话历史中敏感信息(如手机号)使用AES加密存储
8.3.2 高可用部署(集群扩展)
当单节点无法满足并发需求时,通过"Nginx负载均衡+多Swarm节点"实现高可用:
nginx
# Nginx负载均衡配置(修改/etc/nginx/sites-available/swarm-cs)
upstream swarm_servers {
server 192.168.1.10:8000; # 节点1
server 192.168.1.11:8000; # 节点2
server 192.168.1.12:8000; # 节点3
ip_hash; # 保持会话一致性
}
server {
listen 443 ssl;
server_name your-domain.com;
# SSL配置...
location / {
proxy_pass http://swarm_servers; # 转发到集群节点
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
九、总结与展望
OpenAI Swarm框架以"轻量、可控、灵活"为核心优势,通过智能体与交接原语,降低了多智能体系统的开发门槛。本文从环境搭建、基础使用到企业级部署,完整覆盖了Swarm开发全流程,核心要点包括:
-
智能体开发:明确指令定义角色,通过
@tool装饰器集成外部能力 -
多智能体协作:利用映射表解决循环引用,通过全局对话历史实现记忆共享
-
生产部署:通过Supervisor保障进程稳定,Nginx实现反向代理与HTTPS
-
运维保障:建立日志分析、性能监控、故障恢复的完整体系
未来,Swarm框架有望在多模态协作、智能体市场、低代码开发等方向持续进化。开发者可结合自身业务场景,进一步探索智能体的分工与协作模式,构建更强大的AI应用系统。
附录:常用资源链接
-
Swarm官方仓库:https://github.com/openai/swarm
-
OpenAI API文档:https://platform.openai.com/docs
-
FastAPI官方文档:https://fastapi.tiangolo.com/
-
Pinecone向量数据库:https://www.pinecone.io/