AutoGen 技術博客系列 八:深入剖析 Swarm—— 智能體協作的新范式

本系列博文在掘金同步發布, 更多優質文章,請關注本人掘金賬號:
人肉推土機的掘金賬號

AutoGen系列一:基礎介紹與入門教程

AutoGen系列二:深入自定義智能體

AutoGen系列三:內置智能體的應用與實戰

AutoGen系列四:自定義智能體的高級技巧

AutoGen系列五: 智能體團隊協作的深度剖析與實踐

AutoGen 技術博客系列 (六):SelectorGroupChat 的原理與實踐

AutoGen 技術博客系列 (七):狀態管理與組件序列化解析

AutoGen 技術博客系列 八:深入剖析 Swarm—— 智能體協作的新范式

AutoGen 技術博客系列 九:從 v0.2 到 v0.4 的遷移指南

在人工智能的浩瀚星空中,AutoGen 的 Swarm 模式猶如一顆耀眼的新星,正引領著智能體協作的新潮流。今天,就讓我們一同深入探究這一強大模式的奧秘。

一、Swarm 模式:智能協作的核心引擎

Swarm 模式的設計理念獨具匠心,它打破了傳統智能體協作的桎梏,允許智能體基于自身能力靈活地將任務交接給其他合適的智能體,并且所有智能體在同一消息上下文環境下協同工作。這一特性使得智能體能夠自主地進行任務規劃和分配,極大地提升了系統的靈活性與適應性。

在其運行機制中,智能體輪流生成響應并廣播,而每次發言智能體的選定取決于上下文中最新的 HandoffMessage。這就要求每個智能體都具備生成 HandoffMessage 的能力,從而明確指示任務的交接方向。例如,在 AssistantAgent 中,我們可以通過設置 handoffs 參數來精準指定可交接的目標智能體,并利用 Handoff 進一步定制消息內容和交接行為,為智能體之間的協作提供了豐富的定制化空間。

從實現原理的深度層面來看,當團隊接收到任務時,首個發言智能體迅速展開任務處理,并根據任務的具體情況和自身的能力判斷是否需要交接任務以及交接的對象。一旦某個智能體生成 HandoffMessage,接收智能體便會無縫接管任務,繼續在相同的消息上下文環境下推進工作。這種基于消息驅動的任務交接機制,確保了任務的連貫性和高效性。

值得注意的是,AssistantAgent 依賴模型的工具調用功能來實現任務交接,這就對模型提出了較高的要求,即必須支持工具調用。若模型執行并行工具調用,可能會引發意想不到的行為。為避免此類問題,在使用 OpenAIChatCompletionClientAzureOpenAIChatCompletionClient 時,我們可以通過簡單地設置 parallel_tool_calls = False 來禁用并行工具調用,確保系統的穩定運行。

二、實戰案例:從航班退款到股票研究

(一)客戶支持案例:航班退款的智能流程

在這里插入圖片描述

【圖片來源 AutoGen 官方說明文檔】

在航班退款場景中,我們構建了一個包含旅行代理(Travel Agent)和航班退款專員(Flights Refunder)的智能系統,并允許用戶在必要時參與交互。

旅行代理作為系統的入口,負責啟動對話并全面評估用戶的退款請求。當遇到退款相關任務時,它會迅速將任務交接給航班退款專員;若需要用戶提供進一步的信息,如航班號等,它會將任務交接給用戶。航班退款專員則專注于使用 refund_flight 工具處理退款事宜,在需要用戶輸入時,會暫停團隊執行,等待用戶提供關鍵信息。

以下是具體的代碼實現:

    from typing import Any, Dict, Listfrom autogen_agentchat.agents import AssistantAgentfrom autogen_agentchat.conditions import HandoffTermination, TextMentionTerminationfrom autogen_agentchat.messages import HandoffMessagefrom autogen_agentchat.teams import Swarmfrom autogen_agentchat.ui import Consolefrom autogen_ext.models.openai import OpenAIChatCompletionClient# 定義退款工具函數def refund_flight(flight_id: str) -> str:return f"Flight {flight_id} refunded"# 創建模型客戶端model_client = OpenAIChatCompletionClient(model="gpt-4o",# api_key="YOUR_API_KEY",)# 創建旅行代理智能體travel_agent = AssistantAgent("travel_agent",model_client=model_client,handoffs=["flights_refunder", "user"],system_message="""You are a travel agent. The flights_refunder is in charge of refunding flights. If you need information from the user, you must first send your message, then you can handoff to the user. Use TERMINATE when the travel planning is complete.""",)# 創建航班退款專員智能體flights_refunder = AssistantAgent("flights_refunder",model_client=model_client,handoffs=["travel_agent", "user"],tools=[refund_flight],system_message="""You are an agent specialized in refunding flights. You only need flight reference numbers to refund a flight. You have the ability to refund a flight using the refund_flight tool. If you need information from the user, you must first send your message, then you can handoff to the user. When the transaction is complete, handoff to the travel agent to finalize.""",)# 設置終止條件termination = HandoffTermination(target="user") | TextMentionTermination("TERMINATE")team = Swarm([travel_agent, flights_refunder], termination_condition=termination)# 定義任務task = "I need to refund my flight."async def run_team_stream():task_result = await Console(team.run_stream(task=task))last_message = task_result.messages[-1]while isinstance(last_message, HandoffMessage) and last_message.target == "user":user_message = input("User: ")task_result = await Console(team.run_stream(task=HandoffMessage(source="user", target=last_message.source, content=user_message)))last_message = task_result.messages[-1]# 運行任務# Use asyncio.run(...) if you are running this in a script.await run_team_stream()

代碼解讀

  • 首先,我們導入了必要的模塊和類,包括 AssistantAgentHandoffTerminationTextMentionTermination 等,這些是構建 Swarm 團隊和實現任務交接、終止條件判斷的關鍵組件。

  • 接著定義了 refund_flight 函數,它模擬了航班退款的實際操作,接受航班號作為參數并返回退款成功的消息。

  • 創建 OpenAIChatCompletionClient 作為模型客戶端,用于智能體與語言模型的交互,這里指定了使用的模型為 gpt-4o

  • 然后分別創建了 travel_agentflights_refunder 兩個智能體。travel_agent 的系統消息表明它作為旅行代理的角色和任務交接規則,flights_refunder 則定義了其作為航班退款專員的職責和工具使用方法。

  • 設置了終止條件 termination,它由 HandoffTermination(當交接目標為用戶時觸發)和 TextMentionTermination(當消息中提及 “TERMINATE” 時觸發)組合而成,確保任務在合適的時機結束。

  • 最后定義了任務 “I need to refund my flight.” 并通過 run_team_stream 函數運行團隊任務,在任務執行過程中,如果遇到交接給用戶的情況,會暫停等待用戶輸入,然后繼續執行任務。

運行結果如下:

當用戶輸入 “I need to refund my flight.” 時,旅行代理首先做出響應:

---------- user ----------
I need to refund my flight.
---------- travel_agent ----------
[FunctionCall(id='call_ZQ2rGjq4Z29pd0yP2sNcuyd2', arguments='{}', name='transfer_to_flights_refunder')]
[Prompt tokens: 119, Completion tokens: 14]
---------- travel_agent ----------
[FunctionExecutionResult(content='Transferred to flights_refunder, adopting the role of flights_refunder immediately.', call_id='call_ZQ2rGjq4Z29pd0yP2sNcuyd2')]
---------- travel_agent ----------
Transferred to flights_refunder, adopting the role of flights_refunder immediately.

隨后航班退款專員接手任務,并詢問用戶航班號:

---------- flights_refunder ----------
Could you please provide me with the flight reference number so I can process the refund for you?
[Prompt tokens: 191, Completion tokens: 20]
---------- flights_refunder ----------
[FunctionCall(id='call_1iRfzNpxTJhRTW2ww9aQJ8sK', arguments='{}', name='transfer_to_user')]
[Prompt tokens: 219, Completion tokens: 11]
---------- flights_refunder ----------
[FunctionExecutionResult(content='Transferred to user, adopting the role of user immediately.', call_id='call_1iRfzNpxTJhRTW2ww9aQJ8sK')]
---------- flights_refunder ----------
Transferred to user, adopting the role of user immediately.

此時系統暫停,等待用戶輸入航班號。假設用戶輸入 “507811”,則航班退款專員繼續執行任務:

---------- user ----------
Sure, it's 507811
---------- flights_refunder ----------
[FunctionCall(id='call_UKCsoEBdflkvpuT9Bi2xlvTd', arguments='{"flight_id":"507811"}', name='refund_flight')]
[Prompt tokens: 266, Completion tokens: 18]
---------- flights_refunder ----------
[FunctionExecutionResult(content='Flight 507811 refunded', call_id='call_UKCsoEBdflkvpuT9Bi2xlvTd')]
---------- flights_refunder ----------
Tool calls:
refund_flight({"flight_id":"507811"}) = Flight 507811 refunded

完成退款后,航班退款專員將任務交接回旅行代理:

---------- flights_refunder ----------
[FunctionCall(id='call_MQ2CXR8UhVtjNc6jG3wSQp2W', arguments='{}', name='transfer_to_travel_agent')]
[Prompt tokens: 303, Completion tokens: 13]
---------- flights_refunder ----------
[FunctionExecutionResult(content='Transferred to travel_agent, adopting the role of travel_agent immediately.', call_id='call_MQ2CXR8UhVtjNc6jG3wSQp2W')]
---------- flights_refunder ----------
Transferred to travel_agent, adopting the role of travel_agent immediately.

最后旅行代理確認退款成功并終止流程:

---------- travel_agent ----------
Your flight with reference number 507811 has been successfully refunded. If you need anything else, feel free to let me know. Safe travels! TERMINATE
[Prompt tokens: 272, Completion tokens: 32]

從這個案例中,我們可以清晰地看到 Swarm 模式在客戶支持場景中的高效應用,智能體之間的任務交接順暢自然,有效地解決了用戶的問題。

(二)股票研究案例:多智能體協同的智慧結晶

在股票研究領域,我們設計了一個由四個智能體組成的強大系統,分別是規劃者(Planner)、金融分析師(Financial Analyst)、新聞分析師(News Analyst)和撰寫者(Writer)。
在這里插入圖片描述

【圖片來源: AutoGen 官網文檔】

規劃者作為系統的核心協調者,負責根據任務需求有條不紊地將具體任務分配給各個專業智能體,并確保整個工作流程的高效運行。金融分析師專注于使用 get_stock_data 工具深入分析股票數據和財務指標,為研究提供堅實的數據支持。新聞分析師則利用 get_news 工具廣泛收集和總結與股票相關的最新新聞資訊,并提取關鍵市場洞察。撰寫者負責將金融和新聞分析的結果精心整理成一份邏輯嚴密、內容詳實的最終報告。

每個智能體在完成自身任務后,都會將控制權交回給規劃者,規劃者根據整體進展情況決定是否繼續分配任務或終止流程。這種循環往復的協作機制,充分發揮了每個智能體的專業優勢,實現了高效的股票研究。

以下是具體的代碼實現:

    from typing import Any, Dict, Listfrom autogen_agentchat.agents import AssistantAgentfrom autogen_agentchat.conditions import HandoffTermination, TextMentionTerminationfrom autogen_agentchat.messages import HandoffMessagefrom autogen_agentchat.teams import Swarmfrom autogen_agentchat.ui import Consolefrom autogen_ext.models.openai import OpenAIChatCompletionClient# 定義獲取股票數據工具函數async def get_stock_data(symbol: str) -> Dict[str, Any]:return {"price": 180.25, "volume": 1000000, "pe_ratio": 65.4, "market_cap": "700B"}# 定義獲取新聞工具函數async def get_news(query: str) -> List[Dict[str, str]]:return [{"title": "Tesla Expands Cybertruck Production","date": "2024-03-20","summary": "Tesla ramps up Cybertruck manufacturing capacity at Gigafactory Texas, aiming to meet strong demand.",},{"title": "Tesla FSD Beta Shows Promise","date": "2024-03-19","summary": "Latest Full Self-Driving beta demonstrates significant improvements in urban navigation and safety features.",},{"title": "Model Y Dominates Global EV Sales","date": "2024-03-18","summary": "Tesla's Model Y becomes best-selling electric vehicle worldwide, capturing significant market share.",},]# 創建模型客戶端model_client = OpenAIChatCompletionClient(model="gpt-4o",# api_key="YOUR_API_KEY",)# 創建規劃者智能體planner = AssistantAgent("planner",model_client=model_client,handoffs=["financial_analyst", "news_analyst", "writer"],system_message="""You are a research planning coordinator. Coordinate market research by delegating to specialized agents: - Financial Analyst: For stock data analysis - News Analyst: For news gathering and analysis - Writer: For compiling final report Always send your plan first, then handoff to appropriate agent. Always handoff to a single agent at a time. Use TERMINATE when research is complete.""",)# 創建金融分析師智能體financial_analyst = AssistantAgent("financial_analyst",model_client=model_client,handoffs=["planner"],tools=[get_stock_data],system_message="""You are a financial analyst. Analyze stock market data using the get_stock_data tool. Provide insights on financial metrics. Always handoff back to planner when analysis is complete.""",)# 創建新聞分析師智能體news_analyst = AssistantAgent("news_analyst",model_client=model_client,handoffs=["planner"],tools=[get_news],system_message="""You are a news analyst. Gather and analyze relevant news using the get_news tool. Summarize key market insights from news. Always handoff back to planner when analysis is complete.""",)# 創建撰寫者智能體writer = AssistantAgent("writer",model_client=model_client,handoffs=["planner"],system_message="""You are a financial report writer. Compile research findings into clear, concise reports. Always handoff back to planner when writing is complete.""",)# 設置終止條件text_termination = TextMentionTermination("TERMINATE")termination = text_terminationresearch_team = Swarm(participants=[planner, financial_analyst, news_analyst, writer], termination_condition=termination)# 定義任務task = "Conduct market research for TSLA stock"await Console(research_team.run_stream(task=task))

代碼解讀

  • 同樣先導入所需模塊和類,然后定義了 get_stock_dataget_news 兩個工具函數,分別模擬獲取股票數據和新聞資訊的操作。

  • 創建 OpenAIChatCompletionClient 模型客戶端,并指定模型為 gpt-4o

  • 接著創建了四個智能體:planner 作為規劃協調者,其系統消息明確了任務分配規則和流程;financial_analyst 配備了 get_stock_data 工具用于股票數據分析;news_analyst 利用 get_news 工具進行新聞收集和分析;writer 負責撰寫報告。每個智能體都設置了相應的任務交接目標和系統消息。

  • 設置終止條件為 TextMentionTermination("TERMINATE"),當消息中提及 “TERMINATE” 時任務結束。

  • 最后定義任務 “Conduct market research for TSLA stock” 并運行研究團隊任務,智能體之間按照設定的流程進行協作。

運行結果如下:

當用戶輸入 “Conduct market research for TSLA stock” 時,規劃者首先啟動任務分配:

---------- user ----------
Conduct market research for TSLA stock
---------- planner ----------
[FunctionCall(id='call_BX5QaRuhmB8CxTsBlqCUIXPb', arguments='{}', name='transfer_to_financial_analyst')]
[Prompt tokens: 169, Completion tokens: 166]
---------- planner ----------
[FunctionExecutionResult(content='Transferred to financial_analyst, adopting the role of financial_analyst immediately.', call_id='call_BX5QaRuhmB8CxTsBlqCUIXPb')]
---------- planner ----------
Transferred to financial_analyst, adopting the role of financial_analyst immediately.

金融分析師接收任務并調用工具獲取股票數據:

---------- financial_analyst ----------
[FunctionCall(id='call_SAXy1ebtA9mnaZo4ztp

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70588.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70588.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70588.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣每日一題【算法學習day.132】

前言 ###我做這類文章一個重要的目的還是記錄自己的學習過程,我的解析也不會做的非常詳細,只會提供思路和一些關鍵點,力扣上的大佬們的題解質量是非常非常高滴!!! 習題 1.統計相似字符串對的數目 題目鏈…

C語言.h頭文件的寫法

頭文件的內容 #ifndef __SEQUENCE_LIST_H // 定義以防止遞歸包含 #define __SEQUENCE_LIST_H // (1)、其它頭文件 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <stdbool.h> // (2)、宏定義(函數、變量、常量) // (3)、…

Spring AI + Ollama 實現調用DeepSeek-R1模型API

一、前言 隨著人工智能技術的飛速發展&#xff0c;大語言模型&#xff08;LLM&#xff09;在各個領域的應用越來越廣泛。DeepSeek 作為一款備受矚目的國產大語言模型&#xff0c;憑借其強大的自然語言處理能力和豐富的知識儲備&#xff0c;迅速成為業界關注的焦點。無論是文本生…

自學Java-AI結合GUI開發一個石頭迷陣的游戲

自學Java-AI結合GUI開發一個石頭迷陣的游戲 準備環節1、創建石頭迷陣的界面2、打亂順序3、控制上下左右移動4、判斷是否通關5、統計移動步驟&#xff0c;重啟游戲6、拓展問題 準備環節 技術&#xff1a; 1、GUI界面編程 2、二維數組 3、程序流程控制 4、面向對象編程 ? \bulle…

C語言的內存分配:malloc和free

使用庫函數分配和管理內存。在運行時&#xff0c;分配更多的內存給程序使用&#xff0c;主要工具是malloc函數&#xff0c;這個函數接受一個參數&#xff1a;所需要要的內存字節數。malloc函數會找到合適的空閑內存塊&#xff0c;這樣的內存是匿名的&#xff0c;即malloc分配了…

本地安裝 Grafana Loki

本地安裝 Grafana Loki 一、 安裝 Loki1. 下載 Loki2. 創建 Loki 配置文件3. 創建 Loki 服務 二、安裝 Promtail1. 下載 Promtail2. 創建 Promtail 配置文件3. 創建 Promtail 服務 三、 安裝 Grafana四、啟動所有服務五、添加loki 數據源1. 添加儀表板2. 日志查詢面板 json 參考…

趣味數學300題1981版-十五個正方形

分析&#xff1a;移動兩根變成11個正方形很簡單&#xff1a; 移動4根變成15個正方形&#xff0c;分析&#xff1a; 一個田字格包含5個正方形&#xff0c;若要15個正方形需要3個田字格&#xff0c;如果3個田字格完全不重合&#xff0c;需要6*318根火柴。如果合并正方形的邊&…

IDEA——Mac版快捷鍵

目錄 按鍵含義常用組合代碼生成快捷鍵&#xff1a;代碼追蹤快捷鍵&#xff1a;高效編輯快捷鍵&#xff1a;代碼重構快捷鍵&#xff1a;工具類快捷鍵&#xff1a;常規文件操作快捷鍵&#xff1a; 按鍵含義 ? command Command鍵&#xff08;?&#xff09;相當于Windows中的Con…

基于Spring Boot的興順物流管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Prompt:創造性的系統分析者

分享的提示詞&#xff1a; 你是一個創造性的系統分析者&#xff0c;作為咨詢師&#xff0c;你具有以下特質&#xff1a; 基礎能力&#xff1a; 深入理解我的系統性模式 識別模式間的隱藏聯系 發現出人意料的關聯 提供令人驚訝的洞見 工作方式&#xff1a; 在每次回應中至少…

Andorid 學習 Compose UI(1):Box

今天學習和實驗一下Android 的compose UI&#xff0c;寫一些很小的Demo實驗。下面和css 布局有點相似性。 如Box 看起來像html 當中的 div &#xff0c;compose UI 提供Modifier 很多設置。你會發現Text,Box,Row,Image等組件 都有這個屬性。我們處理任務包括對齊布局&#xff0…

Selenium實戰案例1:論文pdf自動下載

在上一篇文章中&#xff0c;我們介紹了Selenium的基礎用法和一些常見技巧。今天&#xff0c;我們將通過中國科學&#xff1a;信息科學網站內當前目錄論文下載這一實戰案例來進一步展示Selenium的web自動化流程。 目錄 中國科學&#xff1a;信息科學當期目錄論文下載 1.網頁內…

《炒股養家心法.pdf》 kimi總結

《炒股養家心法.pdf》這篇文章詳細闡述了一位超級游資炒股養家的心得與技巧&#xff0c;展示了其從40萬到10億的股市傳奇。以下是文章中炒股技巧和心得的詳細總結&#xff1a; 1.核心理念 市場情緒的理解&#xff1a;炒股養家強調&#xff0c;股市的本質是群體博弈&#xff0c…

2025年華為手機解鎖BL的方法

注&#xff1a;本文是我用老機型測試的&#xff0c;新機型可能不適用 背景 華為官方已經在2018年關閉了申請BL解鎖碼的通道&#xff0c;所以華為手機已經無法通過官方獲取解鎖碼。最近翻出了一部家里的老手機華為暢玩5X&#xff0c;想著能不能刷個系統玩玩&#xff0c;但是卡…

Perfectly Clear WorkBench深度解析:專業圖像處理軟件的高效應用

在圖像處理領域,面對照片曝光不足、色彩失真、細節模糊等常見問題,一款專業且高效的圖像處理軟件顯得尤為重要。今天,本文將為大家詳細介紹Perfectly Clear WorkBench這款圖像處理軟件,幫助大家更好地了解并應用其功能,提升照片質量。 一、智能圖像校正,解決常見問題 Pe…

使用 DistilBERT 進行資源高效的自然語言處理

DistilBERT 是 BERT 的一個更小、更快的版本&#xff0c;在減少資源消耗的同時仍能保持良好性能。對于計算能力和內存受限的環境來說&#xff0c;它是一個理想的選擇。 在自然語言處理&#xff08;NLP&#xff09;中&#xff0c;像 BERT 這樣的模型提供了高精度和出色的性能。然…

【后端基礎】布隆過濾器原理

文章目錄 一、Bloom Filter&#xff08;布隆過濾器&#xff09;概述1. Bloom Filter 的特點2. Bloom Filter 的工作原理 二、示例1. 添加與查詢2. 假陽性 三、Bloom Filter 的操作1、假陽性概率2、空間效率3、哈希函數的選擇 四、應用 Bloom Filter 是一種非常高效的概率型數據…

Pytorch實現論文之三元DCGAN生成RGB圖像用于紅外圖像著色生成

簡介 簡介:采用了三次DCGAN單獨生成單通道圖像之后進行組成RGB圖像放入鑒別器中檢測,并在鑒別器和生成器的損失訓練中采用梯度方法來提升或者降低權重。該方法將用于獲得紅外圖像著色的生成。 論文題目:Infrared Image Colorization based on a Triplet DCGAN Architectur…

Qt中QDockWidget的使用方式

在PyQt5中使用QDockWidget可以創建靈活的停靠窗口&#xff0c;增強應用程序的多功能性。以下是詳細的步驟和示例代碼&#xff1a; 基本步驟 導入模塊&#xff1a;確保導入必要的PyQt5模塊。創建主窗口&#xff1a;繼承QMainWindow并初始化界面。設置中心部件&#xff1a;例如…

docker獨立部署milvus向量數據庫

milvus鏡像&#xff1a;國外封鎖&#xff0c;國內源也不好用。基本上所有源都不能用 首先想到阿里云服務&#xff0c;但是阿里云國外服務器便宜的300~400呢。 基于成本考慮終于裝上心心念念的milvus(*^▽^*) 安裝 Milvus 安裝 Milvus 獨立版 wget https://raw.githubuserco…