目錄
1. AutoGen簡介
主要特點
2.快速安裝
3. 相關概念
Agent
Roles and Conversations
4.多代理對話
4.1 Agents
例子: 兩個對話代理
4.2 支持多樣化的對話模式
1. AutoGen簡介
AutoGen 是一個開源編程框架,用于構建AI代理并促進多個代理之間的合作以解決任務。
它具有強大的可定制和可對話的代理,這些代理通過自動化的聊天將 LLM(大語言模型)、工具和人類集成在一起。
通過自動化多個LLM代理之間的聊天,開發人員可以輕松地讓他們自主或根據人工反饋共同執行任務,包括需要通過代碼使用工具的任務。
上圖中,AutoGen使用多智能體對話實現了復雜的基于LLM的工作流。(左)AutoGen代理可以定制,可以基于LLM、工具、人員,甚至是它們的組合。(右上角)代理可以通過對話解決任務。(右下角)該框架支持許多其他復雜的對話模式。
主要特點
- AutoGen 通過最小的工作量,使基于?多代理對話?構建LLM 應用變得簡單
- 它支持?多樣化的對話模式?以適應復雜的工作流程。
- AutoGen 提供了?增強的 LLM 推理。 它提供了 API 統一和緩存, 以及高級用法模式, 如錯誤處理, 多配置處理, 上下文編程, 等實用工具。
2.快速安裝
要求Python Version >= 3.8, < 3.13,使用pip安裝命令如下
#!pip install autogen-agentchat~=0.2
3. 相關概念
Agent
雖然對代理的定義有許多種,但在 AutoGen 中,代理是一個能夠發送消息、接收消息,并通過模型、工具、人類輸入或它們的組合生成回復的實體。
代理可以由模型(例如大型語言模型 GPT-4)、代碼執行器(如 IPython 內核)、人類,或這些組件的組合構建。
以ConversableAgent代理為示例,它支持下面的組件
- 一個LLM列表
- 一個代碼執行器
- 一個函數和工具執行器
- 一個用于人工參與的組件
您可以打開或關閉每個組件并對其進行自定義以滿足您的應用程序的需求。對于高級用戶,您可以使用 registered_reply 向代理添加其他組件。
關于代理(agent)有許多不同的定義。在構建AutoGen時,尋找了一種最通用的概念,能夠涵蓋所有這些不同類型的定義。為了實現這一點,我們需要思考所需的最小概念集合。
在AutoGen中,我們將代理視為可以代表人類意圖行動的實體。它們可以發送消息、接收消息、在采取行動后響應其他代理并與其他代理交互。我們認為這是代理所需的最小能力集合。代理可以基于不同類型的后端支持來執行操作和生成回復。例如:
- 一些代理可以使用AI模型生成回復;
- 另一些代理可以通過工具支持的功能生成基于工具的回復;
- 還有一些代理可以使用人類輸入作為回復其他代理的方式。
此外,您還可以創建混合使用這些不同類型后端的代理,或者更復雜的代理,這些代理通過內部的多代理對話來處理問題。但在表面上,其他代理仍將其視為一個單一的通信實體。
下面的例子中構建一個打開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這個故事告訴我們,勇敢和智慧能夠戰勝邪惡,而愛與友誼能讓世界變得更加美好。'
Roles and Conversations
在 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=[])
4.多代理對話
AutoGen是一個多代理對話框架,因為它支持多個代理進行交互和協作以解決復雜的任務。
它簡化了復雜LLM工作流的編排、自動化和優化。它最大限度地提升了LLM模型的性能,這使得基于多代理對話構建LLM 應用變得簡單。
4.1 Agents
AutoGen抽象并實現了通過對話來解決任務的可對話代理,代理具有以下顯著特點:
- 可對話性:AutoGen 的代理具有可對話性,這意味著任何代理都可以向其他代理發送和接收消息,以發起或繼續對話。
- 可定制性:AutoGen 的代理可以定制化,以集成大語言模型(LLMs)、人類、工具或它們的組合。
下面這張圖展示了AutoGen中內置的幾種代理:
AutoGen先聲明了一個Agent, 規定了作為一個Agent的基本屬性和方法:
- name屬性:每個Agent必須有一個屬性。
- description屬性:每個Agent必須有個自我介紹,描述自己的能干啥和一些行為模式。
- send方法:發送消息給另一個Agent。
- receive方法:接收來自另一個代理的消息Agent。
- generate_reply方法:基于接收到的消息生成回復,也可以同步或異步執行。
具有上述屬性和方法的類就認為是一個Agent, LLMAgent是在Agent的基礎上添加了system_message屬性,便于大模型在生成回復時賦予代理身份角色參與到代理們的會話中。
ConversableAgent主要實現了收到其他代理的發過來的消息后,使用generate_reply生成回復,然后再發送給指定的接受代理。
最后,AutoGen在ConversableAgent的基礎上實現了常用的三種類型的代理。
值得一提的是,在ConversableAgent還實現了使用工具的功能,偽代碼如下:
def my_tool_function(param1, param2):# 實現工具的功能return result
agent = ConversableAgent(...)
agent.register_function({"my_tool_function": my_tool_function})
例子: 兩個對話代理
我們創建了一個名為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:1. Install the necessary libraries (`yfinance` for fetching stock data and `matplotlib` for plotting).
2. Fetch the YTD stock prices for NVDA and TSLA.
3. Plot the data using `matplotlib`.Let’s start with the first step by installing the required libraries. Please execute the following code:```sh
# 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:```python
# 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 <module> 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:```python
# 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.--------------------------------------------------------------------------------
ChatResult(chat_id=None, chat_history=[{'content': 'Plot a chart of NVDA and TESLA stock price change YTD.', 'role': 'assistant', 'name': 'user_proxy'}, {'content': "To plot a chart of NVDA (Nvidia) and TSLA (Tesla) stock price changes year-to-date (YTD), we will follow these steps:\n\n1. Install the necessary libraries (`yfinance` for fetching stock data and `matplotlib` for plotting).\n2. Fetch the YTD stock prices for NVDA and TSLA.\n3. Plot the data using `matplotlib`.\n\nLet’s start with the first step by installing the required libraries. Please execute the following code:\n\n```sh\n# filename: install_packages.sh\npip install yfinance matplotlib\n```\n\nOnce the installation is complete, we'll proceed to fetch the stock data and plot the chart. Here's the code for that step:\n\n```python\n# filename: plot_stock_chart.py\nimport yfinance as yf\nimport matplotlib.pyplot as plt\nfrom datetime import datetime\n\n# Define the stocks and the date range\ntickers = ['NVDA', 'TSLA']\nstart_date = datetime(datetime.now().year, 1, 1)\n\n# Fetch the stock data\ndata = yf.download(tickers, start=start_date)\n\n# Plot the adjusted close prices\nplt.figure(figsize=(10, 5))\nplt.plot(data['Adj Close']['NVDA'], label='Nvidia (NVDA)')\nplt.plot(data['Adj Close']['TSLA'], label='Tesla (TSLA)')\nplt.title('YTD Stock Prices of NVDA and TSLA')\nplt.xlabel('Date')\nplt.ylabel('Adjusted Close Price ($)')\nplt.legend()\nplt.grid(True)\nplt.tight_layout()\n\n# Save the plot\nplt.savefig('ytd_stock_prices.png')\nplt.show()\n```\n\nPlease execute the second code block after successfully installing the required packages. ", 'role': 'user', 'name': 'assistant'}, {'content': 'Traceback (most recent call last): File "/home/hj/workspaces/dc/autogen-v0.2/coding/plot_stock_chart.py", line 14, in <module> 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\'', 'role': 'assistant', 'name': 'user_proxy'}, {'content': "The error indicates that `data['Adj Close']` is not accessible in the way we attempted to. This can happen if the data returned from Yahoo Finance is not structured as expected. Let's take an alternative approach to ensure we correctly extract the adjusted close prices.\n\nWe'll modify the code to check the structure of the returned data and access the prices correctly. Please execute the following updated code:\n\n```python\n# filename: plot_stock_chart.py\nimport yfinance as yf\nimport matplotlib.pyplot as plt\nfrom datetime import datetime\n\n# Define the stocks and the date range\ntickers = ['NVDA', 'TSLA']\nstart_date = datetime(datetime.now().year, 1, 1)\n\n# Fetch the stock data\ndata = yf.download(tickers, start=start_date)\n\n# Check the structure of the data\nprint(data.head())\n\n# Plot the adjusted close prices\nplt.figure(figsize=(10, 5))\nfor ticker in tickers:\n plt.plot(data['Close'][ticker], label=f'{ticker} Close Price')\n \nplt.title('YTD Stock Prices of NVDA and TSLA')\nplt.xlabel('Date')\nplt.ylabel('Close Price ($)')\nplt.legend()\nplt.grid(True)\nplt.tight_layout()\n\n# Save the plot\nplt.savefig('ytd_stock_prices.png')\nplt.show()\n```\n\nIn this version, we print the head of the data to inspect its structure, and then we access the `Close` prices instead of the `Adj Close`. Please execute the code again.", 'role': 'user', 'name': 'assistant'}], summary="The error indicates that `data['Adj Close']` is not accessible in the way we attempted to. This can happen if the data returned from Yahoo Finance is not structured as expected. Let's take an alternative approach to ensure we correctly extract the adjusted close prices.\n\nWe'll modify the code to check the structure of the returned data and access the prices correctly. Please execute the following updated code:\n\n```python\n# filename: plot_stock_chart.py\nimport yfinance as yf\nimport matplotlib.pyplot as plt\nfrom datetime import datetime\n\n# Define the stocks and the date range\ntickers = ['NVDA', 'TSLA']\nstart_date = datetime(datetime.now().year, 1, 1)\n\n# Fetch the stock data\ndata = yf.download(tickers, start=start_date)\n\n# Check the structure of the data\nprint(data.head())\n\n# Plot the adjusted close prices\nplt.figure(figsize=(10, 5))\nfor ticker in tickers:\n plt.plot(data['Close'][ticker], label=f'{ticker} Close Price')\n \nplt.title('YTD Stock Prices of NVDA and TSLA')\nplt.xlabel('Date')\nplt.ylabel('Close Price ($)')\nplt.legend()\nplt.grid(True)\nplt.tight_layout()\n\n# Save the plot\nplt.savefig('ytd_stock_prices.png')\nplt.show()\n```\n\nIn this version, we print the head of the data to inspect its structure, and then we access the `Close` prices instead of the `Adj Close`. Please execute the code again.", cost={'usage_including_cached_inference': {'total_cost': 0.0006329999999999999, 'gpt-4o-mini-2024-07-18': {'cost': 0.0006329999999999999, 'prompt_tokens': 1632, 'completion_tokens': 647, 'total_tokens': 2279}}, 'usage_excluding_cached_inference': {'total_cost': 0.0006329999999999999, 'gpt-4o-mini-2024-07-18': {'cost': 0.0006329999999999999, 'prompt_tokens': 1632, 'completion_tokens': 647, 'total_tokens': 2279}}}, human_input=['Traceback (most recent call last): File "/home/hj/workspaces/dc/autogen-v0.2/coding/plot_stock_chart.py", line 14, in <module> 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\'', 'exit'])from IPython.display import Image
Image("ytd_stock_prices.png")
上面這個例子中,助手代理能夠為給定的任務編寫python代碼,而用戶代理則需要執行生成的代碼,并根據設置自動或手動運行代碼。大體的流程如下:
4.2 支持多樣化的對話模式
- 具有不同自治級別和人類參與模式的對話
AutoGen 支持在初始化步驟后實現完全自主的對話。 另一方面,AutoGen 可以通過配置人類參與程度和模式來實現人機協同解決問題(例如,將 human_input_mode 設置為 ALWAYS)這在許多需要或期望人類參與的應用中非常有用。
- 靜態和動態對話
AutoGen 通過結合編程和自然語言驅動的對話控制,天然支持動態對話。 動態對話允許代理拓撲根據實際對話流程和不同的輸入問題場景進行調整,適用于無法預定義交互模式的復雜場景。 靜態對話 則遵循預定義的拓撲結構,適合于交互模式明確的場景。
- 注冊自動回復
通過可插拔的自動回復功能,可以根據當前消息內容和上下文選擇是否與其他代理展開對話。例如:
- 分層對話:如?OptiGuide?中的實現。
- 動態群聊:一種特殊的分層對話形式,群聊管理器中注冊的回復函數可廣播消息,并決定群聊中的下一位發言者。
- 有限狀態機圖:設置發言者轉換限制的特殊動態群聊形式。通過輸入有向轉換矩陣,用戶可以指定合法的發言者轉換或禁止的轉換。
- 嵌套對話:如對話式國際象棋中的嵌套結構。
- 基于 LLM 的函數調用
基于 LLM 的函數調用是另一種方法,其中 LLM 在每次推理期間根據對話狀態決定是否調用特定函數。 這種方法支持動態的多代理對話。例如,在多用戶數學問題求解場景中,學生助手可以通過函數調用自動尋求專業知識,從而實現高效的動態協作。