展會信息港展會大全

OpenAI今天Open了一下:開源多智能體框架Swarm
來源:互聯(lián)網(wǎng)   發(fā)布日期:2024-10-14 09:10:47   瀏覽:1161次  

導(dǎo)讀:機(jī)器之心報(bào)道 編輯:Panda 毫無疑問,多智能體肯定是 OpenAI 未來重要的研究方向之一,前些天 OpenAI 著名研究科學(xué)家 Noam Brown 還在 X 上為 OpenAI 正在組建的一個(gè)新的多智能體研究團(tuán)隊(duì)招募機(jī)器學(xué)習(xí)工程師。 就在幾個(gè)小時(shí)前,這個(gè)或許還沒有組建完成的新研...

機(jī)器之心報(bào)道

編輯:Panda

毫無疑問,多智能體肯定是 OpenAI 未來重要的研究方向之一,前些天 OpenAI 著名研究科學(xué)家 Noam Brown 還在 X 上為 OpenAI 正在組建的一個(gè)新的多智能體研究團(tuán)隊(duì)招募機(jī)器學(xué)習(xí)工程師。

OpenAI今天Open了一下:開源多智能體框架Swarm

就在幾個(gè)小時(shí)前,這個(gè)或許還沒有組建完成的新研究團(tuán)隊(duì)就已經(jīng)開源發(fā)布了一項(xiàng)重量級研究成果:Swarm。這是一個(gè)實(shí)驗(yàn)性質(zhì)的多智能體編排框架,主打特征是工效(ergonomic)與輕量(lightweight)。

OpenAI今天Open了一下:開源多智能體框架Swarm

項(xiàng)目地址:https://github.com/openai/swarm

Swarm 開源后引起了熱烈討論,有網(wǎng)友表示這能幫助簡化許多潛在的多智能體用例的工作流程。

OpenAI今天Open了一下:開源多智能體框架Swarm

我們先來看一個(gè)例子。首先安裝 Swarm,很簡單:

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

裝好這個(gè)框架之后,用起來也很方便。以下代碼定義了 2 個(gè)智能體,而用戶的指令是與智能體 B 交談:

from swarm import Swarm, Agent

client = Swarm()

def transfer_to_agent_b():

return agent_b

agent_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?

下面我們就來簡單介紹一下這個(gè)開源項(xiàng)目。

首先,需要再次強(qiáng)調(diào),Swarm 是一個(gè)實(shí)驗(yàn)性質(zhì)的多智能體框架,并不是為生產(chǎn)目的開發(fā)的,因此團(tuán)隊(duì)表示不會提供任何官方支持。

Swarm 概況

Swarm 關(guān)注的重點(diǎn)是讓智能體協(xié)作和執(zhí)行變得輕量、高度可控且易于測試。

為此,它使用了兩種原語抽象:智能體(agent)交接(handoff)。其中,智能體包含指令和工具,并且在任何時(shí)間都可以選擇將對話交接給另一個(gè)智能體。

該團(tuán)隊(duì)表示,這些原語很強(qiáng)大,「足以表達(dá)工具和智能體網(wǎng)絡(luò)之間的豐富動態(tài),讓你可以針對真實(shí)世界問題構(gòu)建可擴(kuò)展的解決方案,同時(shí)避免陡峭的學(xué)習(xí)曲線。」

另外,該團(tuán)隊(duì)指出,請注意 Swarm 智能體與 Assistants API 中的 Assistants 無關(guān)。之所以名字相似,只是為了方便。Swarm 完全由 Chat Completions API 提供支持,因此在調(diào)用之間是無狀態(tài)的。

為什么要使用 Swarm?

在設(shè)計(jì)上,Swarm 是輕量級、可擴(kuò)展且高度可定制的。它最適合處理存在大量獨(dú)立功能和指令的情況這些功能和指令很難編碼成單個(gè)提示詞。

果開發(fā)者想要尋求完全托管的線程以及內(nèi)置的內(nèi)存管理和檢索,那么 Assistants API 就已經(jīng)是很好的選擇了。但如果開發(fā)者想要完全的透明度,并且能夠細(xì)粒度地控制上下文、步驟和工具調(diào)用,那么 Swarm 才是最佳選擇。Swarm (幾乎)完全運(yùn)行在客戶端,與 Chat Completions API 非常相似,不會在調(diào)用之間存儲狀態(tài)。

該團(tuán)隊(duì)還展示了一個(gè)應(yīng)用示例,包括天氣查詢智能體、用于在航空公司環(huán)境中處理不同客戶服務(wù)請求的多智能體設(shè)置、客服機(jī)器人、可以幫助銷售和退款的個(gè)人智能體等。具體示例請?jiān)L問 Swarm 代碼庫。

OpenAI今天Open了一下:開源多智能體框架Swarm

簡單的天氣查詢智能體示例,問題先經(jīng)過篩選智能體處理,再轉(zhuǎn)交給天氣智能體解答

Swarm 的核心組件

Swarm 的核心組件包括 client(客戶端)、Agent(智能體)、Function(函數(shù))。

運(yùn)行 Swarm 就是從實(shí)例化一個(gè) client 開始的(其就是在內(nèi)部實(shí)例化一個(gè) OpenAI 客戶端)。

from swarm import Swarm

client = Swarm()

client.run()

Swarm 的 run() 函數(shù)類似于 Chat Completions API 中的 chat.completions.create() 函數(shù)接收消息并返回消息,并且在調(diào)用之間不保存任何狀態(tài)。但重點(diǎn)在于,它還處理 Agent 函數(shù)執(zhí)行、交接、上下文變量引用,并且可以在返回給用戶之前進(jìn)行多輪執(zhí)行。

究其核心,Swarm 的 client.run() 是實(shí)現(xiàn)以下循環(huán):

先讓當(dāng)前智能體完成一個(gè)結(jié)果

執(zhí)行工具調(diào)用并附加結(jié)果

如有必要,切換智能體

如有必要,更新上下文變量

如果沒有新的函數(shù)調(diào)用,則返回

參數(shù)

client.run() 的參數(shù)包括:

OpenAI今天Open了一下:開源多智能體框架Swarm

client.run() 完成后(可能進(jìn)行過多次智能體和工具調(diào)用),會返回一個(gè)響應(yīng),其中包含所有相關(guān)的已更新狀態(tài)。具體來說,即包含新消息、最后調(diào)用的智能體、最新的上下文變量。你可以將這些值(加上新的用戶消息)傳遞給 client.run() 的下一次執(zhí)行,以繼續(xù)上次的交互就像是 chat.completions.create()

響應(yīng)字段

OpenAI今天Open了一下:開源多智能體框架Swarm

Agent

Agent(智能體)就是將一組指令與一組函數(shù)封裝在一起(再加上一些額外的設(shè)置),并且其有能力將執(zhí)行過程交接給另一個(gè) Agent。

Agent 字段

OpenAI今天Open了一下:開源多智能體框架Swarm

指令(instructions)

Agent instructions 會直接轉(zhuǎn)換成對話的系統(tǒng)提示詞(作為第一條消息)。只有當(dāng)前活動的 Agent 的指令會被使用(當(dāng)發(fā)生智能體交接時(shí),系統(tǒng)提示詞會變化,但聊天歷史不會)。

agent = Agent(

instructions="You are a helpful agent."

instructions 可以是常規(guī)字符串,也可以是返回字符串的函數(shù)。該函數(shù)可以選擇性地接收 context_variables 參數(shù),該參數(shù)將由傳入 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?

Function

Swarm Agent 可以直接調(diào)用 Python 函數(shù)。

函數(shù)通常應(yīng)返回一個(gè)字符串(數(shù)值會被轉(zhuǎn)換為字符串)。

如果一個(gè)函數(shù)返回了一個(gè) Agent,則執(zhí)行過程將轉(zhuǎn)交給該 Agent。

如果函數(shù)定義了 context_variables 參數(shù),則它將由傳遞到 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=[print_hello]

client.run(

agent=agent,

messages=[{"role": "user", "content": "Usa greet() por favor."}],

context_variables={"user_name": "John"}

輸出消息:

Hola, John!

如果某個(gè) Agent 函數(shù)調(diào)用出錯(cuò)(缺少函數(shù)、參數(shù)錯(cuò)誤等),則會在聊天之中附加一條報(bào)錯(cuò)響應(yīng),以便 Agent 恢復(fù)正常。

如果 Ageny 調(diào)用多個(gè)函數(shù),則按順序執(zhí)行它們。

交接和更新上下文變量

通過在返回的函數(shù)中包含一個(gè) Agent,可將執(zhí)行過程交接給這個(gè) Agent。

sales_agent = Agent(name="Sales Agent")

def transfer_to_sales():

return sales_agent

agent = Agent(functions=[transfer_to_sales])

response = client.run(agent, [{"role":"user", "content":"Transfer me to sales."}])

print(response.agent.name)

輸出消息:

Sales Agent

它還可以通過返回更完整的 Result 對象來更新 context_variables。如果你希望用單個(gè)函數(shù)返回一個(gè)值、更新智能體并更新上下文變量(或三者中的任何組合),它還可以包含一個(gè) value 和一個(gè) 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'}

注意:如果一個(gè) Agent 調(diào)用了多個(gè)交接 Agent 的函數(shù),則僅使用最后一個(gè)交接函數(shù)。

函數(shù)模式

Swarm 會自動將函數(shù)轉(zhuǎn)換為 JSON 模式,然后將其傳遞給聊天補(bǔ)全工具。

文檔字符串會轉(zhuǎn)換為函數(shù) description。

沒有默認(rèn)值的參數(shù)會設(shè)置為 required。

類型提示會映射到參數(shù)的 type(默認(rèn)為 string)。

不明確支持對每個(gè)參數(shù)進(jìn)行描述,但如果只是在文檔字符串中添加,應(yīng)該能以相似的方式工作。

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"]

}

}

}

流式處理

Swarm 也支持流式處理。

stream = client.run(agent, messages, stream=True)

for chunk in stream:

print(chunk)

使用了與 Chat Completions API streaming 一樣的事件,但添加了兩個(gè)事件類型:

{"delim":"start"} 和 {"delim":"start"},用于在 Agent 每次處理單個(gè)消息(響應(yīng)或函數(shù)調(diào)用)時(shí)發(fā)出信號。這有助于識別 Agent 之間的切換。

為方便起見,{"response": Response} 將在流的末尾返回帶有已聚合的(完整)響應(yīng)的 Response 對象。

核心貢獻(xiàn)者

Swarm 的核心貢獻(xiàn)者均就職于 OpenAI,他們分別是(右側(cè)為對應(yīng)的 GitHub 用戶名):

Ilan Bigio - ibigio

James Hills - jhills20

Shyamal Anadkat - shyamal-anadkat

Charu Jaiswal - charuj

Colin Jarvis - colin-openai

贊助本站

相關(guān)熱詞: OpenAI 今天 Open 一下 開源 智能 框架 Swa

相關(guān)內(nèi)容
AiLab云推薦
展開

熱門欄目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能實(shí)驗(yàn)室 版權(quán)所有    關(guān)于我們 | 聯(lián)系我們 | 廣告服務(wù) | 公司動態(tài) | 免責(zé)聲明 | 隱私條款 | 工作機(jī)會 | 展會港