当前位置: 首页 > news >正文

Swarm - Agent 编排工具

文章目录

    • 一、关于 Swarm(实验性、教育性)
      • 为什么选择蜂群
      • 文档
    • 二、安装使用
      • 安装
      • 基本用法
      • 其它示例
    • 三、Running Swarm
      • `client.run()`
        • Arguments
        • `Response`字段
    • 四、Agent
      • Fields `Agent`
      • 指令
      • 函数
        • 切换和更新上下文变量
        • 函数模式
      • 流媒体
      • 评估
      • 工具


一、关于 Swarm(实验性、教育性)

  • github : https://github.com/openai/swarm

Swarm 是探索人体工程学、轻量级 多代理编排的 教育框架。(An educational framework exploring ergonomic, lightweight multi-agent orchestration.)

Swarm 专注于使代理协调和 执行轻量级、高度可控且易于测试。

它通过两个基本抽象来实现这一点:Agent切换Agent包含instructionstools,并且可以 随时选择将对话 交给另一个Agent

这些原语功能强大,足以表达工具和代理网络之间的丰富动态,允许您构建可扩展的真实解决方案,同时避免陡峭的学习曲线。

注:群代理与助理应用编程接口中的助理无关。为了方便起见,它们的命名类似,但在其他方面完全不相关。群完全由聊天完成应用编程接口提供支持,因此在调用之间是无状态的。


警告:

Swarm目前是一个实验性的示例框架,旨在探索多智能体系统的人体工程学界面。它不打算在生产中使用,因此没有官方支持。(这也意味着我们不会审查PR或问题!)

Swarm的主要目标是展示编排代理:切换和例程食谱中探索的切换和例程模式。它不意味着是一个独立的库,主要用于教育目的。


为什么选择蜂群

Swarm 通过设计探索轻量级、可扩展和高度可定制的模式。类似于Swarm的方法 最适合处理难以编码为单个提示的大量独立功能和指令的情况。

对于寻找完全托管线程和内置内存管理和检索的开发人员来说,助理应用编程接口是一个很好的选择。然而,对于想了解多代理编排的开发人员来说,Swarm是一个教育资源。Swarm(几乎)完全在客户端上运行,并且很像聊天完成应用编程接口,不存储调用之间的状态。


文档

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


二、安装使用

安装

需要Python 3.10+

pip install git+ssh://git@github.com/openai/swarm.git

或者

pip install git+https://github.com/openai/swarm.git

基本用法

如果你想使用 Qwen 等 API 替代默认的 OpenAI,可参考文章:https://ezcode.blog.csdn.net/article/details/143300605

from swarm import Swarm, Agentclient = Swarm()def transfer_to_agent_b():return agent_bagent_a = Agent(name="Agent A",instructions="You are a helpful agent.",functions=[transfer_to_agent_b],
)  agent_b = Agent(name="Agent B",instructions="Only speak in Haikus.",
)response = client.run(agent=agent_a,messages=[{"role": "user", "content": "I want to talk to agent B."}],
)print(response.messages[-1]["content"])

Hope glimmers brightly,
New paths converge gracefully,
What can I assist?

其它示例

看看/examples的灵感!在自述文件中了解更多关于每一个的信息。

  • basic:简单的基础示例,如设置、函数调用、切换和上下文变量
  • triage_agent:设置基本分类步骤以交给正确代理的简单示例
  • weather_agent:函数调用的简单示例
  • airline:用于在航空公司上下文中处理不同客户服务请求的多代理设置。
  • support_bot:一个客户服务机器人,包括一个用户交互界面代理和一个带有多个工具的帮助中心代理
  • personal_shopper:可以帮助进行销售和退款订单的个人购物代理

三、Running Swarm

首先实例化一个Swarm客户端(它在内部只实例化一个OpenAI客户端)。

from swarm import Swarmclient = Swarm()

client.run()

Swarm的run()函数类似于Chat Completions API中的chat.completions.create()函数 —— 它接受messages并返回messages,并且在调用之间不保存任何状态。

然而,重要的是,它还处理代理 函数的执行、移交、上下文变量引用,并且可以在返回给用户之前 进行多次轮换。

Swarm的client.run()的核心实现了以下循环:

  1. 从当前代理处获得完成
  2. 执行工具调用并附加结果
  3. 必要时切换代理
  4. 如有必要,更新上下文变量
  5. 如果没有新的函数调用,返回

Arguments
参数类型描述默认
agentAgent要调用的(初始)代理。(必需)
messagesList消息对象列表,与 Chat Completions messages(必需)
context_variablesdict附加上下文变量的字典,可用于函数和代理指令{}
max_turnsint允许的最大会话轮流次数float("inf")
model_overridestr一个可选字符串,用于覆盖代理正在使用的模型None
execute_toolsbool如果False,中断执行并立即返回tool_calls消息,当代理尝试调用函数时True
streambool如果True,启用流响应False
debugbool如果True,启用调试日志False

一旦client.run() 完成(在可能多次调用代理和工具之后),它将返回一个Response,其中包含所有相关的更新状态。

具体来说,新messages、最后一个要调用的Agent和最新的context_variables

您可以将这些值(加上新用户消息)传递到client.run()的下一次执行中,以继续它中断的交互——很像chat.completions.create()

run_demo_loop函数在/swarm/repl/repl.py.)中实现完整执行循环的示例


Response字段
字段类型描述
messagesList对话期间生成的消息对象列表。非常类似于聊天完成messages,但有一个sender字段,指示消息来自哪个Agent
agentAgent处理消息的最后一个代理。
context_variablesdict与输入变量相同,加上任何更改。

四、Agent

一个Agent只是用一组functions封装了一组instructions(加上下面的一些附加设置),并且能够将执行交给另一个Agent

虽然很容易将Agent拟人化为“做X的人”,但它也可以用来表示由一组instructionsfunctions定义的非常具体的工作流或步骤(例如一组步骤、复杂的检索、单步数据转换等)。

这允许Agent被组成一个由“代理”、“工作流”和“任务”组成的网络,所有这些都由同一个原语表示。


Fields Agent

字段类型描述默认
namestr代理的名称。"Agent"
modelstr代理要使用的模型。"gpt-4o"
instructionsstrfunc() -> str代理的说明,可以是字符串或返回字符串的可调用对象。"You are a helpful agent."
functionsList代理可以调用的函数列表。[]
tool_choicestr代理的工具选择(如果有)。None

指令

Agent instructions直接转换为对话的system提示(作为第一条消息),任何给定时间只有活动Agentinstructions会出现(例如,如果有Agent切换,system提示会改变,但聊天记录不会。)

agent = Agent(instructions="You are a helpful agent."
)

这些instructions可以是常规str,也可以是返回str的函数。

该函数可以选择接收一个context_variables参数,该参数将由传递给client.run()context_variables填充。

def instructions(context_variables):user_name = context_variables["user_name"]return f"Help the user, {user_name}, do whatever they want."agent = Agent(instructions=instructions
)
response = client.run(agent=agent,messages=[{"role":"user", "content": "Hi!"}],context_variables={"user_name":"John"}
)
print(response.messages[-1]["content"])

Hi John, how can I assist you today?

函数

  • SwarmAgent可以直接调用python函数。
  • 函数通常应该返回一个str(值将被尝试转换为str)。
  • 如果函数返回一个Agent,执行将转移到该Agent
  • 如果一个函数定义了一个context_variables参数,它将由传递给client.run()context_variables填充。

def greet(context_variables, language):user_name = context_variables["user_name"]greeting = "Hola" if language.lower() == "spanish" else "Hello"print(f"{greeting}, {user_name}!")return "Done"agent = Agent(functions=[greet]
)client.run(agent=agent,messages=[{"role": "user", "content": "Usa greet() por favor."}],context_variables={"user_name": "John"}
)

Hola, John!

  • 如果Agent函数调用出现错误(缺少函数、错误参数、错误),则会将错误响应附加到聊天中,以便Agent可以正常恢复。
  • 如果Agent调用多个函数,它们将按该顺序执行。

切换和更新上下文变量

一个Agent可以通过在Agent中返回另一个function来传递。

sales_agent = Agent(name="Sales Agent")def transfer_to_sales():return sales_agentagent = Agent(functions=[transfer_to_sales])response = client.run(agent, [{"role":"user", "content":"Transfer me to sales."}])
print(response.agent.name)

Sales Agent

它还可以通过返回更完整的context_variables对象来更新Result。这也可以包含一个value和一个agent,以防您希望单个函数返回一个值、更新代理和更新上下文变量(或三个变量的任何子集)。

sales_agent = Agent(name="Sales Agent")def talk_to_sales():print("Hello, World!")return Result(value="Done",agent=sales_agent,context_variables={"department": "sales"})agent = Agent(functions=[talk_to_sales])response = client.run(agent=agent,messages=[{"role": "user", "content": "Transfer me to sales"}],context_variables={"user_name": "John"}
)
print(response.agent.name)
print(response.context_variables)

Sales Agent
{'department': 'sales', 'user_name': 'John'}

注:如果Agent调用多个函数来移交给Agent,则仅使用最后一个移交函数。


函数模式

Swarm自动将函数转换为JSON模式,并将其传递给聊天完成tools

  • 文档字符串被转换成函数description
  • 没有默认值的参数设置为required
  • 类型提示映射到参数的type(默认为string)。
  • 不明确支持每个参数的描述,但如果只是在文档字符串中添加,则应该类似地工作。(将来可能会添加文档字符串参数解析。)

def greet(name, age: int, location: str = "New York"):"""Greets the user. Make sure to get their name and age before calling.Args:name: Name of the user.age: Age of the user.location: Best place on earth."""print(f"Hello {name}, glad you are {age} in {location}!")

{"type": "function","function": {"name": "greet","description": "Greets the user. Make sure to get their name and age before calling.\n\nArgs:\n   name: Name of the user.\n   age: Age of the user.\n   location: Best place on earth.","parameters": {"type": "object","properties": {"name": {"type": "string"},"age": {"type": "integer"},"location": {"type": "string"}},"required": ["name", "age"]}}
}

流媒体

stream = client.run(agent, messages, stream=True)
for chunk in stream:print(chunk)

使用与聊天完成API流相同的事件。请参见/swarm/repl/repl.py中的process_and_print_streaming_response作为示例。

添加了两种新的事件类型:

  • {"delim":"start"}{"delim":"end"},用于每次Agent处理单个消息(响应或函数调用)时发出信号。这有助于识别Agent之间的切换。
  • {"response": Response}将在流的末尾返回一个Response对象,其中包含聚合的(完整的)响应,以方便起见。

评估

评估对任何项目都是至关重要的,我们鼓励开发人员带上他们自己的eval套件来测试他们的集群的性能。作为参考,我们有一些关于如何在airlineweather_agenttriage_agent快速入门示例中使用eval swarm的示例。有关更多详细信息,请参阅READMEs。


工具

使用该run_demo_loop测试您的集群!这将在您的命令行上运行REPL。支持流式传输。

from swarm.repl import run_demo_loop
...
run_demo_loop(agent, stream=True)

2024-10-28(一)

相关文章:

Swarm - Agent 编排工具

文章目录 一、关于 Swarm(实验性、教育性)为什么选择蜂群文档 二、安装使用安装基本用法其它示例 三、Running Swarmclient.run()ArgumentsResponse字段 四、AgentFields Agent指令函数切换和更新上下文变量函数模式 流媒体评估工具 一、关于 Swarm&…...

使用Python中的jieba库进行简单情感分析

在自然语言处理(NLP)领域,情感分析是一项重要的任务,它可以帮助我们理解文本背后的情感倾向。本文将通过一个简单的例子来介绍如何使用Python的jieba库对中文文本进行基本的情感分析。 1. 环境准备 首先,确保已经安装…...

`pip` 下载速度慢

pip 下载速度慢(例如只有 50KB/s)可能由多个因素导致,以下是一些常见原因和解决方法: 1. 使用国内镜像源 国内访问 PyPI 服务器可能会较慢,您可以通过配置国内镜像源来提升下载速度。以下是一些常用的国内镜像源&…...

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…...

网管平台(进阶篇):网管软件的配置方式

正确选择网管软件配置方式对于确保网络运行的高效性、稳定性和安全性至关重要,因为它直接影响到网络管理的灵活性、监控的深度以及故障响应的速度,从而保障整体网络环境的顺畅运行和业务连续性。下面我们就分别介绍一下。 一、集中式网络管理配置 在集…...

推荐系统中的AB测试

在现代互联网平台中,推荐系统起着至关重要的作用,无论是视频平台、社交网络还是电商网站,推荐系统都能够帮助用户找到最感兴趣的内容。为了不断优化推荐效果,AB测试(A/B Testing)作为评估新算法或功能改进的…...

.NET 8 Web API 中的身份验证和授权

本次介绍分为3篇文章: 1:.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3:.NET …...

Vue弹窗用也可以直接调用Js方法了

问题描述 在前端开发中,弹窗开发是一个不可避免的场景。然而,按照正常的逻辑,通过在template模板中先引用组件,然后通过v-if指令控制显隐,进而达到弹窗的效果。然而,这种方法却有一个严重的缺陷&#xff0…...

【c语言测试】

1. C语言中,逻辑“真”等价于( ) 题目分析: “逻辑真”在C语言中通常指的是非零数。 A. 大于零的数B. 大于零的整数C. 非零的数 (正确答案)D. 非零的整数 正确答案:C 2. 若定义了数组 int a[3][4];,则对…...

一种将树莓派打造为游戏机的方法——Lakka

什么是Lakka? Lakka是一款Linux发行版,轻量级的,可将小型计算机转变为一台复古游戏机。 图1-Lakka官网,见参考链接[1] Lakka是RetroArch和libretro生态系统下的官方操作系统,前者RetroArch是模拟器、游戏引擎和媒体播…...

如何在 MySQL 中创建一个完整的数据库备份?

在MySQL数据库中创建一个完整的数据库备份通常不是通过编程语言直接实现的,而是借助MySQL提供的命令行工具mysqldump来完成。 作为Java开发者,我们可以编写脚本来调用这些工具,从而实现自动化备份。 下面我们将详细介绍如何使用Java来调度m…...

京准电钟HR-901GB双GPS北斗卫星时钟服务器

京准电钟HR-901GB双GPS北斗卫星时钟服务器 京准电钟HR-901GB双GPS北斗卫星时钟服务器 作为国家电力系统最重要的设备之一,卫星时间同步装置随着电力行业的发展不断有了新的要求,从单纯的具备时间数据输出能力,发展到装置状态信息上送、对用时设备的对时质量进行监测,确保站点内…...

uniapp使用websocket

后端java websoket中的 onOpen 中。依赖注入为null 引用:https://blog.csdn.net/qq_63431773/article/details/132389555 https://blog.csdn.net/weixin_43961117/article/details/123989515 https://cloud.tencent.com/developer/article/2107954 https://blog.c…...

基于Pycharm和Django模型技术的数据迁移

1.配置数据库 在trip_server/settings.py中修改配置: 其格式可访问官网:Settings | Django documentation | Django 1.1 配置数据库 文件地址:trip_server/settings.py 配置前需要创建(NaviCat)个人数据库 "…...

乐尚代驾-----Day10(订单三)

hi UU 们!!!我又来跟辛辣!感谢你们的观看,话不多说!~ 司机到达代驾终点,代驾结束了。结束代驾之后, – 获取额外费用(高速费、停车费等) – 计算订单实际里程…...

105. 聚光源SpotLight

入门部分给大家介绍过平行光DirectionalLight、点光源PointLight、环境光AmbientLight,下面给大家介绍一个新的光源对象,也就是聚光源SpotLight。 创建聚光源SpotLight 聚光源可以认为是一个沿着特定方会逐渐发散的光源,照射范围在三维空间中构成一个圆…...

系统接口权限拦截器,获取用户信息存储

UserInfo 类 这是一个表示用户信息的 Java 类,使用了 Lombok 注解来简化代码编写。 import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;import java.io.Serializable; import java.util.List;Data ToString EqualsAndHashCode public…...

Chromium HTML5 新的 Input 类型color 对应c++

一、Input 类型: color color 类型用在input字段主要用于选取颜色&#xff0c;如下所示&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body&…...

问:SQL中的通用函数及用法?

SQL函数是在SQL语句中使用的预定义的计算工具&#xff0c;可以对一列数据进行操作并返回一个单一的结果。这些函数大致可以分为两类&#xff1a;Aggregate函数和Scalar函数。Aggregate函数对一组值执行计算&#xff0c;并返回单个值&#xff0c;如求和、平均值、最大值和最小值…...

.NET Core WebApi第6讲:WebApi的前端怎么派人去拿数据?(区别MVC)

一、前端界面小基础 head&#xff1a;引入CSS, 引入JS是写在head里面。 body&#xff1a;眼睛肉眼能看到的用户展示的界面是写在body里面。 二、前端怎么派人去拿数据&#xff1f; 1、MVC&#xff1a;前后端不分离&#xff0c;MVC相比WebApi只是多了一个views的文件夹 &am…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...