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
包含instructions
和tools
,并且可以 随时选择将对话 交给另一个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()
的核心实现了以下循环:
- 从当前代理处获得完成
- 执行工具调用并附加结果
- 必要时切换代理
- 如有必要,更新上下文变量
- 如果没有新的函数调用,返回
Arguments
参数 | 类型 | 描述 | 默认 |
---|---|---|---|
agent | Agent | 要调用的(初始)代理。 | (必需) |
messages | List | 消息对象列表,与 Chat Completions messages | (必需) |
context_variables | dict | 附加上下文变量的字典,可用于函数和代理指令 | {} |
max_turns | int | 允许的最大会话轮流次数 | float("inf") |
model_override | str | 一个可选字符串,用于覆盖代理正在使用的模型 | None |
execute_tools | bool | 如果False ,中断执行并立即返回tool_calls 消息,当代理尝试调用函数时 | True |
stream | bool | 如果True ,启用流响应 | False |
debug | bool | 如果True ,启用调试日志 | False |
一旦client.run()
完成(在可能多次调用代理和工具之后),它将返回一个Response
,其中包含所有相关的更新状态。
具体来说,新messages
、最后一个要调用的Agent
和最新的context_variables
。
您可以将这些值(加上新用户消息)传递到client.run()
的下一次执行中,以继续它中断的交互——很像chat.completions.create()
。
(run_demo_loop
函数在/swarm/repl/repl.py
.)中实现完整执行循环的示例
Response
字段
字段 | 类型 | 描述 |
---|---|---|
messages | List | 对话期间生成的消息对象列表。非常类似于聊天完成messages ,但有一个sender 字段,指示消息来自哪个Agent 。 |
agent | Agent | 处理消息的最后一个代理。 |
context_variables | dict | 与输入变量相同,加上任何更改。 |
四、Agent
一个Agent
只是用一组functions
封装了一组instructions
(加上下面的一些附加设置),并且能够将执行交给另一个Agent
。
虽然很容易将Agent
拟人化为“做X的人”,但它也可以用来表示由一组instructions
和functions
定义的非常具体的工作流或步骤(例如一组步骤、复杂的检索、单步数据转换等)。
这允许Agent
被组成一个由“代理”、“工作流”和“任务”组成的网络,所有这些都由同一个原语表示。
Fields Agent
字段 | 类型 | 描述 | 默认 |
---|---|---|---|
name | str | 代理的名称。 | "Agent" |
model | str | 代理要使用的模型。 | "gpt-4o" |
instructions | str 或func() -> str | 代理的说明,可以是字符串或返回字符串的可调用对象。 | "You are a helpful agent." |
functions | List | 代理可以调用的函数列表。 | [] |
tool_choice | str | 代理的工具选择(如果有)。 | None |
指令
Agent
instructions
直接转换为对话的system
提示(作为第一条消息),任何给定时间只有活动Agent
的instructions
会出现(例如,如果有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?
函数
- Swarm
Agent
可以直接调用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套件来测试他们的集群的性能。作为参考,我们有一些关于如何在airline
、weather_agent
和triage_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指令控制显隐,进而达到弹窗的效果。然而,这种方法却有一个严重的缺陷࿰…...
【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字段主要用于选取颜色,如下所示: <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body&…...
问:SQL中的通用函数及用法?
SQL函数是在SQL语句中使用的预定义的计算工具,可以对一列数据进行操作并返回一个单一的结果。这些函数大致可以分为两类:Aggregate函数和Scalar函数。Aggregate函数对一组值执行计算,并返回单个值,如求和、平均值、最大值和最小值…...
.NET Core WebApi第6讲:WebApi的前端怎么派人去拿数据?(区别MVC)
一、前端界面小基础 head:引入CSS, 引入JS是写在head里面。 body:眼睛肉眼能看到的用户展示的界面是写在body里面。 二、前端怎么派人去拿数据? 1、MVC:前后端不分离,MVC相比WebApi只是多了一个views的文件夹 &am…...
Chromium HTML5 新的 Input 类型date 对应c++
一、Input 类型: date date 类型允许你从一个日期选择器选择一个日期。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…...
ZooKeeper的应用场景:深入探讨分布式系统中的多样化应用
Apache ZooKeeper 是一个开源的分布式协调服务,专为确保分布式系统中的高可用性和一致性而设计。在现代分布式应用程序中,协调、同步和管理是实现高效和可靠服务的关键部分,而 ZooKeeper 通过提供这些基础功能而成为许多分布式系统不可或缺的…...
【Vue3】第四篇
Vue3学习第四篇 01. 插槽Slots02. 插槽Slots(续集)03. 插槽Slots(再续集)04. 组件生命周期05. 生命周期应用06. 动态组件07. 组件保持存活08. 异步组件09. 依赖注入10. Vue应用 01. 插槽Slots 模板内容:html结构&#…...
Chromium HTML5 新的 Input 类型tel对应c++
一、Input 类型: tel <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php">电话号码: <input type"tel" name…...
JVM—类加载器、双亲委派机制
目录 什么是类加载器 类加载器的分类 Bootstrap启动类加载器 通过启动类加载器加载用户jar包 Extension扩展类加载器和Application应用程序类加载器 通过扩展类加载器加载用户jar包 双亲委派机制 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加…...
笔试题 求空格分割的英文句子中,最大单词长度。
求空格分割的英文句子中,最大单词长度。例如:“this is a word”,最大单词长度为4。要求:不能用 split 函数对字符串进行切分,算法复杂度为o(n) public class MaxWordLength { public static int maxWordLength(String sentence) { if (se…...
【笔记】大模型长度外推技术 NTK-Aware Scaled RoPE
NTK-Aware Scaled RoPE 正弦编码(Sinusoidal)旋转位置编码RoPE编码步骤:旋转位置编码的优势 NTK-Aware Scaled RoPE直接外推线性内插进制转换高频外推、低频内插的理解位置编码 总结参考: 长度外推技术是自然语言处理(NLP)领域中&…...
前端 eslint 配置,以及在git提交之前自动format
目录 1、配置eslint步骤 1、eslint安装配置步骤 2、配置scripts步骤 3、测试eslint 2、配置git-hook1、安装环境2、最终效果 众所周知,前端项目可以在报很多error的情况下运行。但是良好的代码规范仍然有利于项目的开发维护,这里提供我的规范,…...
2024.10.9华为留学生笔试题解
第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…...
利用ADPF性能提示优化Android应用体验
Android Dynamic Performance Framework(ADPF)是google推广的一套用于优化散热以及CPU性能的动态性能框架。本文主要介绍其中的performance hint的部分。 1、为何引入ADPF 我们都知道,在大多数设备上,Android 会动态调整CPU的频率和核心类型。如果work l…...
购物网站建设案例/网络推广公司收费标准
前面分享了Centos6.9安装部署Zabbix分布式监控系统今天讲配置文件一、Zabbix配置文件详解Zabbix监控系统组件分为Server、Proxy、Agentd端,对参数的详细了解,能够更加深入理解Zabbix监控功能,及对Zabbix进行调优,如下为三个组件常…...
网站建设中可能出现的问题/网络推广方案的基本思路
用Resharper的同学都知道,如果你写了一个私有函数,这个函数没有访问类里面的其他参数和方法,那么它建议你标记这个方法为私有静态方法,提示是这样的: 值得这样做吗?看看微软的建议: After you m…...
陕西企业营销型网站建设/网站权重怎么看
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 按钮 Drop Down Control 按钮 -Circular Music Player Control 》》 Flat Pill Button 按钮类 --Fancy Menu 按钮之 每日一道理 我拽着春姑娘的衣裙,春姑娘把我带…...
国内知名网站建设排名/苏州网站开发公司
转自:http://www.pinlue.com/article/2021/03/3114/4311569671742.html...
东台建设局网站/跨境电商平台有哪些
一、重新加入storyboard 黑屏并且提示以下错误 错误:[Application] Failed to instantiate the default view controller for UIMainStoryboardFile Main - pe 解决方案: 1、在general编辑标签中,deployment info 部分,Main inter…...
六安seo地址/成都seo优化排名推广
<asp:textbox id"txtWXMT" runat"server" Width"100%" Height"108px" TextMode"MultiLine"></asp:textbox>...