Swarm框架智能体应用开发与部署

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 架构总览(分层设计)

  1. 智能体层:Swarm多智能体(前端交互、知识库、工单处理)

  2. 业务层:工具函数(工单创建)、FAQ知识库

  3. 接入层:命令行(调试)/ FastAPI(Web服务)

  4. 前端层: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 测试场景演示

  1. 用户输入:我想了解会员费用 → 客服追问姓名电话

  2. 用户输入:张三,13800138000 → 转接知识库客服并回复费用

  3. 用户输入:登录后看不到历史订单 → 转接工单客服

  4. 用户输入:所有订单都看不到,昨天正常 → 创建工单并返回编号

七、Swarm智能体应用部署实战

覆盖本地调试和云服务器生产部署,核心解决"后台运行""进程守护""安全访问"问题。

7.1 部署前置准备

  • 环境一致性 :确保Python版本≥3.10,Linux需安装libssl-devgcc

  • 依赖固化 :执行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
  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开发全流程,核心要点包括:

  1. 智能体开发:明确指令定义角色,通过@tool装饰器集成外部能力

  2. 多智能体协作:利用映射表解决循环引用,通过全局对话历史实现记忆共享

  3. 生产部署:通过Supervisor保障进程稳定,Nginx实现反向代理与HTTPS

  4. 运维保障:建立日志分析、性能监控、故障恢复的完整体系

未来,Swarm框架有望在多模态协作、智能体市场、低代码开发等方向持续进化。开发者可结合自身业务场景,进一步探索智能体的分工与协作模式,构建更强大的AI应用系统。

附录:常用资源链接

相关推荐
CoderJia程序员甲2 小时前
GitHub 热榜项目 - 日榜(2025-12-5)
ai·开源·大模型·github·ai教程
小龙4 小时前
多模态融合实战步骤
多模态·模态融合·理论知识
通义灵码4 小时前
如何调教一名合格的“编程搭子”
人工智能·智能体·qoder
我很哇塞耶4 小时前
AAAI 2026 | 跨视频推理基准 CrossVid:给多模态大模型出一道“综合题”
人工智能·ai·大模型·多模态大模型
程序员柒叔4 小时前
Dify知识库-在线文档导入流程分析
大模型·知识库·工作流·dify
吉吉安5 小时前
vercel ai sdk使用指南(Nextjs版本)
人工智能·大模型·llm·nodejs·vercel
gallonyin5 小时前
【AI智能体】Claude Code 工具架构核心解析:大道至简
人工智能·架构·智能体
带刺的坐椅5 小时前
Solon AI 开发学习16 - generate - 生成模型(图、音、视)
java·ai·llm·openai·solon
腾飞开源6 小时前
17_Spring AI 干货笔记之谷歌生成式AI聊天
人工智能·多模态·工具调用·gemini·spring ai·google genai·思维配置