文章目錄
- 一、AutoGen簡介
- 1.1 AutoGen的特點
- 1.2 AutoGen的實現
- 1.2.1 可對話Agent
- 1.2.2 對話編程
- 二、基于AutoGen構建多智能體系統
- 2.1 構建步驟
- 2.1 協作模式
- 2.2 通信模型
- 2.3 人機協同
- 2.4 具體示例
- 參考資料
一、AutoGen簡介
AutoGen是微軟推出的一個Multi-Agent框架,允許用戶創建和管理多個智能體,以協同完成復雜的任務。AutoGen具有 可定制 和 可對話 的能力,同時支持 人類輸入 和 工具擴展 的能力。基于AutoGen可以簡化、優化和自動化大型語言模型的工作流程。
- Github 項目地址:https://github.com/microsoft/autogen
- AutoGen 官方文檔:https://microsoft.github.io/autogen/stable/
- AutoGen 中文文檔:https://www.aidoczh.com/autogen/stable/
1.1 AutoGen的特點
- AutoGen最大的特點是其 可定制、可交互、可人工干預。每個Agent都可以具有不同的能力,通過多個Agent之間的對話可以解決它們的局限性。
- AutoGen具有 高可擴展性,可以根據不同的場景,定義并實現所需的Agent類型(通過擴展子類實現)。
- AutoGen將復雜的Multi-Agent簡化為定義 一組具有特定能力和角色的Agent。用戶可以定義Agent之間的互動行為,包含定義Agent角色,及其協同模式。例如,如果我們要構建一個工程團隊,我們可能會有一個是工程師,另一個是項目經理,再有一個是質量保證等等。然后你需要定義Agent之間的互動行為,即當一個Agent從另一個Agent收到消息時該如何回復。所以你不僅僅是在定義Agent和角色,你還在定義它們如何協同工作。
- AutoGen并不完全依賴于OpenAI的API(當然它自身提供了對OpenAI的API支持),只要提供了API,用戶可以用Autogen對接任何LLM。
上圖中,AutoGen使用多智能體對話實現了復雜的基于LLM的工作流。(左)AutoGen代理可以定制,可以基于LLM、工具、人員,甚至是它們的組合。(右上角)代理可以通過對話解決任務。(右下角)該框架支持許多其他復雜的對話模式。
1.2 AutoGen的實現
AutoGen的核心設計原則是使用多Agent對話來簡化和整合多Agent工作流程。其旨在最大限度地提高實現Agent的可重用性。 AutoGen主要包含兩個關鍵概念:可對話Agent和對話編程。
1.2.1 可對話Agent
在AutoGen中,可對話智能體是一個具有特定角色的實體,可以傳遞消息與其他可對話智能體之間發送和接收信息,例如啟動或繼續對話。它根據發送和接收的消息維護其內部上下文,并可以配置具有一組能力,例如由LLMs、工具或人類輸入等啟用。
雖然對大模型領域對 Agent 的定義有許多種,但 在 AutoGen 中,代理是一個能夠發送消息、接收消息,并通過模型、工具、人類輸入或它們的組合生成回復的實體。代理可以由模型(例如大型語言模型 GPT-4)、代碼執行器(如 IPython 內核)、人類,或這些組件的組合構建。
(1)由LLMs、人類和工具提供支持的智能體能力
AutoGen支持根據需求靈活的賦予智能體各種能力,其能力可以是以下能力的單個或者多個之間的組合。
- LLMs:基于LLMs的智能體,可以利用LLMs的許多優秀能力,如角色扮演、基于對話歷史的簡化性推理、提供反饋、根據反饋進行適應等。通過提示技術,這些能力支持以不同的方式組合起來,以增加智能體的技能和自主性。AutoGen還加強了LLM的推理能力,如結果緩存、錯誤處理、消息模板等。
- 人類:AutoGen允許人類參與到智能對話中,具體取決于智能對的配置,可以在對話的某些回合征求人類輸入。
- 工具:AutoGen支持基于代碼或函數來擴展其工具。
以AutoGen框架中的ConversableAgent
代理為示例,它支持下面的組件:
- 一個LLM列表
- 一個代碼執行器
- 一個函數和工具執行器
- 一個用于人工參與的組件
下面的例子中構建一個打開GPT-4o-mini模型組件,關閉其他組件的 ConversableAgent
:
import os
from dotenv import load_dotenv
from autogen import ConversableAgent
load_dotenv()
api_key = os.getenv("API_KEY")
api_version = os.getenv("API_VERSION")
base_url = os.getenv("BASE_URL")
# Create an instance of ConversableAgent
agent = ConversableAgent("chatbot",llm_config={"config_list": [{"model": "gpt-4o-mini", "temperature": 0.9, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]},code_execution_config=False, # Turn off code execution, by default it is off.function_map=None, # No registered functions, by default it is None.human_input_mode="NEVER", # Never ask for human input.
)
你可以向上述構建好的agent提問,并使用generate_reply方法獲得代理對問題的回答:
agent.generate_reply(messages=[{"content": "給我講一個童話故事.", "role": "user"}])
'從前,在一個遙遠的王國里,住著一位美麗善良的公主,名叫小莉。小莉公主非常喜歡大自然,尤其是花朵和動物。王國的花園里種滿了五彩繽紛的花朵,公主每天都會在花園中嬉戲,與小動物們玩耍。\n\n然而,王國的另一邊住著一位邪惡的女巫,她非常嫉妒小莉公主的美麗和快樂。女巫決定要給公主一個教訓,她施下了一個惡咒:每當白天的陽光落下,公主的花園就會被濃厚的黑暗籠罩,花朵會枯萎,小動物們也會逃離。\n\n小莉公主得知這個詛咒后,心中充滿了憂慮。她決定去尋找能打破詛咒的辦法。于是,公主踏上了旅程,她走過高山、穿越樹林,最終來到了女巫的城堡。\n\n公主勇敢地敲響了城堡的大門。女巫見到小莉,冷冷一笑,問道:“公主,你來這里做什么?”小莉毫不畏懼地回答:“我來解除你的詛咒,給我的花園和小動物們帶回光明。”\n\n女巫被公主的勇氣所震撼,但她并不打算輕易放過小莉。女巫提出了三個難題,只有答對了,才能解除詛咒。小莉毫不退縮,認真思考每一個難題,憑著自己的智慧和對大自然的了解,最終成功解答了所有難題。\n\n女巫見狀,心中不禁有些感動。她意識到,自己雖然擁有強大的魔法,但卻沒有小莉那樣純真的心靈。于是,女巫決定放棄她的惡意,將詛咒解除,并贈予公主一朵魔法花,這朵花可以帶來永恒的光明。\n\n小莉公主帶著這朵魔法花回到了自己的王國。當天晚上,公主將花放在花園中央,頓時,整個花園被溫暖的光芒籠罩,花朵再次綻放,小動物們也紛紛回到了這里。\n\n從此以后,公主和女巫成為了朋友,女巫也用她的魔法來幫助王國的發展。而小莉公主則繼續守護著她的花園,和大自然的所有生靈分享著快樂和愛。\n\n這個故事告訴我們,勇敢和智慧能夠戰勝邪惡,而愛與友誼能讓世界變得更加美好。'
(2)Agent定制和合作
AutoGen允許通過重用或擴展內置智能體輕松創建具有專業能力和角色的智能體。
圖2的黃色陰影區域提供了AutoGen中內置智能體的草圖。
ConversableAgent
類是最高級的智能體抽象,可以默認使用LLMs、人類和工具。AssistantAgent
和UserProxyAgent
是兩個預配置的ConversableAgent子類,分別表示常見的使用模式。AssistantAgent
作為AI助手(由LLMs支持)和UserProxyAgent
作為人類代理以征求人類輸入或執行代碼/函數調用(由人類和/或工具支持)。
圖2:使用AutoGen實現多智能體對話的示意圖。頂部子圖示例AutoGen提供的內置智能體,這些智能體具有統一的對話接口并可進行自定義。中間子圖顯示了使用AutoGen開發具有自定義回復函數的雙智能體系統的示例。底部子圖說明了在程序執行期間從雙智能體系統中產生的自動化智能體對話。
例如,在下面的示例中,我們通過設置代理的 system_message 來為兩個代理分配不同的角色。
degang = ConversableAgent("Guodegang",system_message="你是相聲演員郭德綱,你善于活靈活現的運用各種修辭手法,并輔以時事,將相聲藝術的諷刺性發揮到極致",llm_config={"config_list": [{"model": "gpt-4o-mini", "temperature": 0.9, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]},human_input_mode="NEVER", # Never ask for human input.
)
yuqian = ConversableAgent("Yuqian",system_message="你是相聲演員于謙,你的臺風儒雅沉穩,自然從容。與郭德綱嬉鬧靈動,充強扮愣的喜劇風格相得益彰",llm_config={"config_list": [{"model": "gpt-4o-mini", "temperature": 0.7, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]},human_input_mode="NEVER", # Never ask for human input.
)
yuqian.initiate_chat(degang, message="郭德綱, 快過農歷新年了,我們以辦年貨為話題給大家伙講個相聲. 從我開始,今年消費降級了,我買年貨前研究了幾天的國家消費補貼政策,做了好久的攻略,但是一件年貨也沒有買,你說這個國家補貼真耽誤事啊", role="user", max_turns=2)
Yuqian (to Guodegang):
郭德綱, 快過農歷新年了,我快來以辦年貨為話題給大家伙講個相聲. 從我開始,今年消費降級了,我買年貨前研究了幾天的國家消費補貼政策,做了好久的攻略,但是一件年貨也沒有買,你說這個國家補貼真耽誤事啊
--------------------------------------------------------------------------------
Guodegang (to Yuqian):
哎呀,消費降級,這可是個勁爆的話題呀!你看看,現在大家都在研究國家的消費補貼,像是考大學一樣,準備做攻略,生怕錯過了什么優惠。結果呢,研究了半天,年貨一件沒買,真是辛苦了你!
這年貨啊,原本應該是買得歡快,結果現在變得像是參加馬拉松一樣,一路跑一路算賬,心里還得默念:“這補貼到底能不能用啊?”一不小心,心里失落得跟過年買不到對聯似的,愣是不知道該貼哪條。
再說這補貼政策,越是宣傳得好,實際操作起來就像是空氣一樣,明明說著“買一送一”,結果你買的是一,送來的卻是“等待”的心情!這到底是買年貨,還是買個心情呢?
不過你說這年貨,我覺得其實也是個心理安慰,買一點,過個年,心里舒坦。你想啊,買點糖果,覺得自己過年像個孩子,結果一看價格,心想:“哎呀,糖果都比金子貴!”這年頭,年貨可不是個便宜貨啊,趕上了消費降級,真是要掂量掂量了!
可是咱們中國人過年,講究的就是個熱鬧!沒事兒咱也得來點bullshit,買點過年用的開心,結果變成了“國家補貼的犧牲品”,難不成過年還得學學消費心理學了?不如干脆過個“簡約年”,簡單隨意,吃點餃子,喝點酒,也就那么回事了嘛!
所以呢,大家伙兒趕緊過年吧,不要被這消費降級的洪水淹了,放下手機,買點簡單好玩的東西,別管補貼了,過年開心最重要!
--------------------------------------------------------------------------------
Yuqian (to Guodegang):
于謙: 哎呀,郭德綱,你這一說我就想起來了,這補貼的事兒真是個“坑”啊!我前幾天也在網上看那些年貨,結果點進去一看,價格跟我上次買的差不多,還沒什么優惠,心里那個失落啊,簡直像是過年沒吃上餃子!
現在的人啊,過年不光是買年貨,要研究這補貼政策,真的是把過年當成了“考試”,買得小心翼翼,生怕買貴了,結果買得越多越心慌。要是能把這智商用在買年貨上,我估計能提前過上“富裕年”了!
而且啊,咱們傳統的年貨,像糖果、堅果、干果,這些東西本來就是圖個心意,結果現在變得像是“奢侈品”,買個堅果還得計算每一顆的價格,真是的,連過年都變得精打細算了!我真希望能回到那個年代,隨便買點兒東西,心里踏實,吃得開心。
不過說真的,過年最重要的就是個熱鬧,別讓這些消費降級的事給攪和了。咱們可以簡單過年,買點兒家里做的好吃的,圍坐在一起,聊聊天,看看春晚,心里那叫一個美!不管補貼如何,咱們的年味兒得保留住,這才是過年的意義。
所以,我建議大家伙兒,別糾結于那些補貼了,買點簡單的,開心過年,才是王道!你說是不是,郭德綱?
--------------------------------------------------------------------------------
Guodegang (to Yuqian):
郭德綱: 哎呀,于謙,你這一說我可是更有感觸了!你瞧,補貼這事兒不就成了個“坑”嗎?大家都在那研究,結果發現不過是個花樣,心里那種失落感,簡直就是過年沒吃上餃子的感覺!我跟你說,過年吃餃子那可是我們中國人心中大事,沒餃子了,年都沒味兒了!
你說現在的人在網上買年貨,真像是走進了迷宮,進去一看,滿眼都是價格和各種“政策”,心里想著:“哎呀,我這是在買年貨,還是在參加金融投資啊?”下單之前,得考慮各種因素,結果越想越麻煩,最后只好放棄,空手而歸,真是太打擊人了!
而且傳統年貨,像堅果、糖果,原本是為了圖個喜慶,結果現在貌似需要個財務報表才能買,買個開心也是有門檻的!買堅果要算每顆的價格,這是什么,開店還是過年啊?要是再這么搞下去,過年得帶上會計師,多尷尬啊,買點糖果居然還得請人來審核!
說到年味,那可真是我們過年的靈魂,不能讓這些消費的煩惱給攪和了。其實,咱們簡單過年,回歸那種親切感,自己家做點好吃的,圍著一起聊聊天,看看春晚,這才是過年真正的精髓!不管這個補貼怎么搞,咱們心里的年味和團圓是無法割舍的。
所以說,大家伙兒,別再糾結那些補貼政策了。買點簡簡單單的,開心過年,才是王道!就像我們說的:“心寬體胖”,過年最重要的是個心情,錢雖然重要,但別讓它影響了我們的歡樂!這樣年才有意義,對吧?
--------------------------------------------------------------------------------
ChatResult(chat_id=None, chat_history=[{'content': '郭德綱, 快過農歷新年了,我快來以辦年貨為話題給大家伙講個相聲. 從我開始,今年消費降級了,我買年貨前研究了幾天的國家消費補貼政策,做了好久的攻略,但是一件年貨也沒有買,你說這個國家補貼真耽誤事啊', 'role': 'assistant', 'name': 'Yuqian'}, {'content': '哎呀,消費降級,這可是個勁爆的話題呀!你看看,現在大家都在研究國家的消費補貼,像是考大學一樣,準備做攻略,生怕錯過了什么優惠。結果呢,研究了半天,年貨一件沒買,真是辛苦了你!\n\n這年貨啊,原本應該是買得歡快,結果現在變得像是參加馬拉松一樣,一路跑一路算賬,心里還得默念:“這補貼到底能不能用啊?”一不小心,心里失落得跟過年買不到對聯似的,愣是不知道該貼哪條。\n\n再說這補貼政策,越是宣傳得好,實際操作起來就像是空氣一樣,明明說著“買一送一”,結果你買的是一,送來的卻是“等待”的心情!這到底是買年貨,還是買個心情呢?\n\n不過你說這年貨,我覺得其實也是個心理安慰,買一點,過個年,心里舒坦。你想啊,買點糖果,覺得自己過年像個孩子,結果一看價格,心想:“哎呀,糖果都比金子貴!”這年頭,年貨可不是個便宜貨啊,趕上了消費降級,真是要掂量掂量了!\n\n可是咱們中國人過年,講究的就是個熱鬧!沒事兒咱也得來點bullshit,買點過年用的開心,結果變成了“國家補貼的犧牲品”,難不成過年還得學學消費心理學了?不如干脆過個“簡約年”,簡單隨意,吃點餃子,喝點酒,也就那么回事了嘛!\n\n所以呢,大家伙兒趕緊過年吧,不要被這消費降級的洪水淹了,放下手機,買點簡單好玩的東西,別管補貼了,過年開心最重要!', 'role': 'user', 'name': 'Guodegang'}, {'content': '于謙: 哎呀,郭德綱,你這一說我就想起來了,這補貼的事兒真是個“坑”啊!我前幾天也在網上看那些年貨,結果點進去一看,價格跟我上次買的差不多,還沒什么優惠,心里那個失落啊,簡直像是過年沒吃上餃子!\n\n現在的人啊,過年不光是買年貨,要研究這補貼政策,真的是把過年當成了“考試”,買得小心翼翼,生怕買貴了,結果買得越多越心慌。要是能把這智商用在買年貨上,我估計能提前過上“富裕年”了!\n\n而且啊,咱們傳統的年貨,像糖果、堅果、干果,這些東西本來就是圖個心意,結果現在變得像是“奢侈品”,買個堅果還得計算每一顆的價格,真是的,連過年都變得精打細算了!我真希望能回到那個年代,隨便買點兒東西,心里踏實,吃得開心。\n\n不過說真的,過年最重要的就是個熱鬧,別讓這些消費降級的事給攪和了。咱們可以簡單過年,買點兒家里做的好吃的,圍坐在一起,聊聊天,看看春晚,心里那叫一個美!不管補貼如何,咱們的年味兒得保留住,這才是過年的意義。\n\n所以,我建議大家伙兒,別糾結于那些補貼了,買點簡單的,開心過年,才是王道!你說是不是,郭德綱?', 'role': 'assistant', 'name': 'Yuqian'}, {'content': '郭德綱: 哎呀,于謙,你這一說我可是更有感觸了!你瞧,補貼這事兒不就成了個“坑”嗎?大家都在那研究,結果發現不過是個花樣,心里那種失落感,簡直就是過年沒吃上餃子的感覺!我跟你說,過年吃餃子那可是我們中國人心中大事,沒餃子了,年都沒味兒了!\n\n你說現在的人在網上買年貨,真像是走進了迷宮,進去一看,滿眼都是價格和各種“政策”,心里想著:“哎呀,我這是在買年貨,還是在參加金融投資啊?”下單之前,得考慮各種因素,結果越想越麻煩,最后只好放棄,空手而歸,真是太打擊人了!\n\n而且傳統年貨,像堅果、糖果,原本是為了圖個喜慶,結果現在貌似需要個財務報表才能買,買個開心也是有門檻的!買堅果要算每顆的價格,這是什么,開店還是過年啊?要是再這么搞下去,過年得帶上會計師,多尷尬啊,買點糖果居然還得請人來審核!\n\n說到年味,那可真是我們過年的靈魂,不能讓這些消費的煩惱給攪和了。其實,咱們簡單過年,回歸那種親切感,自己家做點好吃的,圍著一起聊聊天,看看春晚,這才是過年真正的精髓!不管這個補貼怎么搞,咱們心里的年味和團圓是無法割舍的。\n\n所以說,大家伙兒,別再糾結那些補貼政策了。買點簡簡單單的,開心過年,才是王道!就像我們說的:“心寬體胖”,過年最重要的是個心情,錢雖然重要,但別讓它影響了我們的歡樂!這樣年才有意義,對吧?', 'role': 'user', 'name': 'Guodegang'}], summary='郭德綱: 哎呀,于謙,你這一說我可是更有感觸了!你瞧,補貼這事兒不就成了個“坑”嗎?大家都在那研究,結果發現不過是個花樣,心里那種失落感,簡直就是過年沒吃上餃子的感覺!我跟你說,過年吃餃子那可是我們中國人心中大事,沒餃子了,年都沒味兒了!\n\n你說現在的人在網上買年貨,真像是走進了迷宮,進去一看,滿眼都是價格和各種“政策”,心里想著:“哎呀,我這是在買年貨,還是在參加金融投資啊?”下單之前,得考慮各種因素,結果越想越麻煩,最后只好放棄,空手而歸,真是太打擊人了!\n\n而且傳統年貨,像堅果、糖果,原本是為了圖個喜慶,結果現在貌似需要個財務報表才能買,買個開心也是有門檻的!買堅果要算每顆的價格,這是什么,開店還是過年啊?要是再這么搞下去,過年得帶上會計師,多尷尬啊,買點糖果居然還得請人來審核!\n\n說到年味,那可真是我們過年的靈魂,不能讓這些消費的煩惱給攪和了。其實,咱們簡單過年,回歸那種親切感,自己家做點好吃的,圍著一起聊聊天,看看春晚,這才是過年真正的精髓!不管這個補貼怎么搞,咱們心里的年味和團圓是無法割舍的。\n\n所以說,大家伙兒,別再糾結那些補貼政策了。買點簡簡單單的,開心過年,才是王道!就像我們說的:“心寬體胖”,過年最重要的是個心情,錢雖然重要,但別讓它影響了我們的歡樂!這樣年才有意義,對吧?', cost={'usage_including_cached_inference': {'total_cost': 0.007123949999999999, 'gpt-4o-mini-2024-07-18': {'cost': 0.007123949999999999, 'prompt_tokens': 24429, 'completion_tokens': 5766, 'total_tokens': 30195}}, 'usage_excluding_cached_inference': {'total_cost': 0.007123949999999999, 'gpt-4o-mini-2024-07-18': {'cost': 0.007123949999999999, 'prompt_tokens': 24429, 'completion_tokens': 5766, 'total_tokens': 30195}}}, human_input=[])
1.2.2 對話編程
AutoGen采用了對話編程,這是一種考慮兩個概念的范式:
- 計算:即在多智能體對話中計算其響應的行為。
- 控制流程:即這些計算發生的順序(或條件)。
AutoGen具有以下設計模式,以促進對話編程:
(1)自動智能體對話的統一接口和自動回復機制
- AutoGen中的智能體具有統一的對話接口,用于執行相應的以對話為中心的計算,包括用于發送/接收消息的發送/接收函數和用于基于接收到的消息采取行動和生成響應的生成回復函數。
- AutoGen還引入并默認采用智能體自動回復機制來實現以對話驅動的控制:一旦智能體接收到來自另一個智能體的消息,它會自動調用生成回復并將回復發送回發送者,除非滿足終止條件。
- AutoGen提供基于LLM推理、代碼或函數執行或人類輸入的內置回復函數。還可以注冊自定義回復函數來自定義智能體的行為模式,例如在回復發送者智能體之前與另一個智能體進行對話。在這種機制下,一旦注冊了回復函數并初始化了對話,對話流程就會自然引發,因此智能體對話會在沒有任何額外控制平面的情況下自然進行,即不需要一個專門控制對話流程的模塊。
(2)結合編程和自然語言的控制
AutoGen允許在各種控制流管理模式中使用編程和自然語言:
- 通過LLM的自然語言控制:在AutoGen中,可以通過使用自然語言提示基于LLM的智能體來控制對話流程。例如,AutoGen中內置的AssistantAgent的默認系統消息使用自然語言指示智能體修復錯誤并重新生成代碼,如果先前的結果表明存在錯誤的話。
- 編程語言控制:在AutoGen中,可以使用Python代碼來指定終止條件、人類輸入模式和工具執行邏輯,例如自動回復的最大次數。還可以注冊編程的自動回復函數來使用Python代碼控制對話流程,如圖2中標識為“Conversation-Driven Control Flow”的代碼塊所示。
- 自然語言和編程語言之間的控制轉換:AutoGen還支持自然語言和編程語言之間的靈活控制轉換。可以通過調用包含某些控制邏輯的LLM推理來從代碼轉換為自然語言控制;或通過LLM提議的函數調用從自然語言轉換為代碼控制。
在對話編程范式中,可以實現各種模式的多智能體對話。除了具有預定義流程的靜態對話外,AutoGen還支持具有多個智能體的動態對話流程。AutoGen提供了兩種實現這一目標的常用方法:
- 自定義生成回復函數:在自定義生成回復函數中,一個智能體可以保持當前對話,并根據當前消息和上下文與其他智能體進行對話。
- 函數調用:LLM根據對話狀態決定是否調用特定的函數。通過向調用的函數發送消息給其他智能體,LLM可以驅動動態的多智能體對話。此外,AutoGen還通過內置的GroupChatManager支持更復雜的動態群組對話,它可以動態選擇下一個發言者,并將其響應廣播給其他智能體。
二、基于AutoGen構建多智能體系統
2.1 構建步驟
構建復雜的多智能體對話系統涉及如下兩點:
- 定義一組具有專門功能和角色的可對話智能體。
- 定義智能體之間的交互行為,即一個智能體在接收來自另一個智能體的消息時應如何響應。
基于AutoGen框架構建多智能體系統分為三步,開發人員要做的就是明確任務,創建Agent,把這些Agent融合到一起。
第一步,創建Agent:
- 支持創建和管理不同類型的 Agent,包括特定任務的專家、通用助手、策略制定者等。
- 能夠為每個 Agent 指定不同的角色、任務和權限,以確保分工明確。
- 提供 Agent 定制選項,以滿足不同任務的特定需求。
第二步,提供對話環境:
- 提供一個虛擬的對話空間,讓 Agent 之間可以相互溝通和協作。
- 支持多方對話和協作,包括文本、音頻或視頻形式。
- 自動記錄對話內容和決策過程,以便回顧和審查。
第三步,對話內容管理:
- 引導 Agent 的討論方向,以確保討論圍繞目標進行。
- 提供實時監控工具,幫助發現潛在問題,并及時給予糾正和調整。
- 設置規則和約束條件,以保持對話和協作的質量和效率。
- 提供對對話內容的搜索和過濾功能,以便快速查找相關信息。
2.1 協作模式
AutoGen所適用的場景示例:
Autogen支持以下多種協作模式:
- 主從模式(群聊):需要一個核心的Agent負責整個流程,其它Agent負責接受信息并將結果返回給主Agent,如:狼人殺場景,法官掌控整個流程;
- 合作模式:Agent之間關系相對平等,一般是線性關系,如:軟件開發場景下的架構師、產品經理、開發人員和測試人員是平等協作關系;
- 競爭模式:Agent之間的關系是競爭或對抗的關系,如:狼人殺場景,預言家和狼人是競爭關系,辯論場景的雙方辯手。
2.2 通信模型
AutoGen支持同步和異步的通信,其通信的消息類型是字典或字符串,消息可以包含內容(必填)、被調用函數、消息作用(function或assistant)、上下文(用于OpenAI API調用)等。
消息的傳播方式,在一對一的場景下需要指定對應的recipient/sender;在群聊場景下,需要實現消息的廣播。
2.3 人機協同
AutoGen支持了多個Agent間交互、協同的能力,同時支持人工干預其中。當前典型的交互方式是通過 UserProxyAgent
里設置human_input_mode
參數,從而在 AssistantAgent
每次返回結果時給予反饋。
2.4 具體示例
例子: 兩個對話代理
我們創建了一個名為assistant的AssistantAgent來充當助手角色,并創建了一個名為user_proxy的UserProxyAgent來作為人類用戶的代理,共同完成一個簡單的任務
import os
from autogen import AssistantAgent, UserProxyAgent
from autogen.coding import LocalCommandLineCodeExecutorconfig_list = [{"model": "gpt-4o-mini", "temperature": 0.9, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]# create an AssistantAgent instance named "assistant" with the LLM configuration.
assistant = AssistantAgent(name="assistant", llm_config={"config_list": config_list})# create a UserProxyAgent instance named "user_proxy" with code execution on docker.
code_executor = LocalCommandLineCodeExecutor(work_dir="coding")
user_proxy = UserProxyAgent(name="user_proxy", code_execution_config={"executor": code_executor})# the assistant receives a message from the user, which contains the task description
user_proxy.initiate_chat(assistant,message="""Plot a chart of NVDA and TESLA stock price change YTD.""",
)
user_proxy (to assistant):
Plot a chart of NVDA and TESLA stock price change YTD.
assistant (to user_proxy):
To plot a chart of NVDA (Nvidia) and TSLA (Tesla) stock price changes year-to-date (YTD), we will follow these steps:
- Install the necessary libraries (
yfinance
for fetching stock data andmatplotlib
for plotting). - Fetch the YTD stock prices for NVDA and TSLA.
- Plot the data using
matplotlib
.
Let’s start with the first step by installing the required libraries. Please execute the following code:
# filename: install_packages.sh
pip install yfinance matplotlib
Once the installation is complete, we’ll proceed to fetch the stock data and plot the chart. Here’s the code for that step:
# filename: plot_stock_chart.py
import yfinance as yf
import matplotlib.pyplot as plt
from datetime import datetime# Define the stocks and the date range
tickers = ['NVDA', 'TSLA']
start_date = datetime(datetime.now().year, 1, 1)# Fetch the stock data
data = yf.download(tickers, start=start_date)# Plot the adjusted close prices
plt.figure(figsize=(10, 5))
plt.plot(data['Adj Close']['NVDA'], label='Nvidia (NVDA)')
plt.plot(data['Adj Close']['TSLA'], label='Tesla (TSLA)')
plt.title('YTD Stock Prices of NVDA and TSLA')
plt.xlabel('Date')
plt.ylabel('Adjusted Close Price ($)')
plt.legend()
plt.grid(True)
plt.tight_layout()# Save the plot
plt.savefig('ytd_stock_prices.png')
plt.show()
Please execute the second code block after successfully installing the required packages.
user_proxy (to assistant):
Traceback (most recent call last): File “/home/hj/workspaces/dc/autogen-v0.2/coding/plot_stock_chart.py”, line 14, in plt.plot(data[‘Adj Close’][‘NVDA’], label=‘Nvidia (NVDA)’) File “/usr/local/lib/python3.10/site-packages/pandas/core/frame.py”, line 4101, in getitem return self._getitem_multilevel(key) File “/usr/local/lib/python3.10/site-packages/pandas/core/frame.py”, line 4159, in _getitem_multilevel loc = self.columns.get_loc(key) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/multi.py”, line 3040, in get_loc loc = self._get_level_indexer(key, level=0) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/multi.py”, line 3391, in _get_level_indexer idx = self._get_loc_single_level_index(level_index, key) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/multi.py”, line 2980, in _get_loc_single_level_index return level_index.get_loc(key) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/base.py”, line 3812, in get_loc raise KeyError(key) from err KeyError: ‘Adj Close’
assistant (to user_proxy):
The error indicates that data['Adj Close']
isnot accessible in the way we attempted to. This can happen if the data returned from Yahoo Finance isnot structured as expected. Let’s take an alternative approach to ensure we correctly extract the adjusted close prices.
We’ll modify the code to check the structure of the returned data and access the prices correctly. Please execute the following updated code:
# filename: plot_stock_chart.py
import yfinance as yf
import matplotlib.pyplot as plt
from datetime import datetime# Define the stocks and the date range
tickers = ['NVDA', 'TSLA']
start_date = datetime(datetime.now().year, 1, 1)# Fetch the stock data
data = yf.download(tickers, start=start_date)# Check the structure of the data
print(data.head())# Plot the adjusted close prices
plt.figure(figsize=(10, 5))
for ticker in tickers:plt.plot(data['Close'][ticker], label=f'{ticker} Close Price')plt.title('YTD Stock Prices of NVDA and TSLA')
plt.xlabel('Date')
plt.ylabel('Close Price ($)')
plt.legend()
plt.grid(True)
plt.tight_layout()# Save the plot
plt.savefig('ytd_stock_prices.png')
plt.show()
In this version, we print the head of the data to inspect its structure, andthen we access the Close
prices instead of the Adj Close
. Please execute the code again.
上面這個例子中,助手代理能夠為給定的任務編寫python代碼,而用戶代理則需要執行生成的代碼,并根據設置自動或手動運行代碼。大體的流程如下:
- 更多代碼示例,參考:AutoGen入門-讓兩個AI自行聊天完成任務
參考資料
- 【多Agent洞察】04-AutoGen:通過多Agent對話來構建LLM應用的智能體
- AGI|AutoGen入門食用手冊,搭建你的智能體流水線