AutoGen 是一個支持使用多個代理來開發大型語言模型(LLM) 應用程序的框架,這些代理采樣相互對話的方式來解決人類交給的任務。AutoGen 代理是可定制的、可對話的,并且無縫地允許人類參與。他們采用LLM、人類輸入和各種工具組合的各種運作模式。
?AutoGen 提供了可對話的 LLM 代理比如用戶代理、助理代理等,還可用于通過人工或自動反饋解決各種任務,包括那些需要通過寫代碼才能完成的任務。下面我們來演示AutoGen通過代理之間的對話來完成人類交給的任務,并且代理們會在對話過程中完成生成代碼,執行代碼,觀察代碼結果,調試代碼等迭代過程,直至最后完成任務。
以下demo建議在linux或者macos上測試成功!不建議在windows上執行,因為window環境容易產生莫名其妙的錯誤!
安裝autogen
請新建一個python虛擬環境,并在命令行中執行以下安裝命令:
pip install pyautogen
?任務1:計算股票價格收益率
在下面的示例中,讓我們看看如何使用AutoGen中的代理來編寫python腳本并執行該腳本。這個過程包括構造一個充當助手的AssistantAgent,以及一個充當人類用戶代理的UserProxyAgent。首先我們需要配置模型和api_key, 這里我們選擇的模型為:“gpt-4”, 這也是autogo官方推薦的模型。
import autogenconfig_list = [{'model': 'gpt-4','api_key': 'your_api_key',#輸入用戶自己的api_key}
]
接下來我們需要創建2個代理分別是assistant和user_proxy,其中user_proxy代表人類,主要的職能是向assistant交代人類的任務,并執行assistant生成的代碼,然后將代碼執行結果反饋給assistant, 而assistant的主要職能是接受user_proxy交代的人類任務,然后向告知user_proxy完成任務所需要的步驟和代碼,并觀察user_proxy反饋的代碼執行結果以此來判斷任務是否完成,如果未能完成任務則需要進一步修改代碼后再讓user_proxy執行代碼直至最后完成。整個完成任務的過程就是assistant和user_proxy一問一答的迭代過程,常規情況下退出迭代的條件就是assistant從user_proxy反饋中判斷出任務已經完成并返回給user_proxy一個“TERMINATE”標記。如下圖所示:
下面我們需要創建UserProxyAgent和AssistantAgent兩個代理,我們在創建UserProxyAgent時,我們設置參數human_input_mode為“NEVER”,它表示UserProxyAgent將不會征求人類用戶的反饋。當達到max_consecutive_auto_reply定義的限制時,或者當is_termination_msg()對接收到的消息返回true時,接下來我們來創建這兩個代理:
# 創建"assistant" 代理
assistant = autogen.AssistantAgent(name="assistant",llm_config={"cache_seed": 42, # seed 用戶緩存中間結果"config_list": config_list, "temperature": 0, },
)
# 創建"user_proxy"代理
user_proxy = autogen.UserProxyAgent(name="user_proxy",human_input_mode="NEVER",max_consecutive_auto_reply=10,is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),code_execution_config={"work_dir": "coding","use_docker": False, },
)
這里我們根據官方文檔的說明來介紹一些兩個代理的參數的含義:
AssistantAgent是ConversableAgent的一個子類,它配置了一個默認的系統消息。默認的系統消息是用來用LLM解決任務的,包括建議python代碼塊和調試。?human_input_mode
默認為“NEVER”并且code_execution_config
默認為 False。默認情況下,該代理不執行代碼,而是期望用戶執行代碼。
UserProxyAgent 是ConversableAgent 的子類,它可以執行代碼并向其他代理提供反饋?,參數human_input_mode
默認設置為“ALWAYS” 和llm_config
默認設置為“False”。默認情況下,代理將在每次收到消息時提示人工輸入。而在本例中我們將human_input_mode
默認設置為“NEVER”即無需人工參與。
接下來我們就任務交給user_proxy ,讓它和assistant 一起合作來完成任務:
# 助手從user_proxy接收一條消息,其中包含任務描述
user_proxy.initiate_chat(assistant,message="""What date is today? Compare the year-to-date gain for META and TESLA.""",
)
我們的問題是:“What date is today? Compare the year-to-date gain for META and TESLA.” 中文意思為:“今天是幾號?比較一下META和特斯拉今年的收益”。 要完成這個任務是需要查詢meta和tesla這兩支股票的年初和年末的價格來實現的,下面我們看看這兩個代理是如何完成這個任務的:
?以上是user_proxy?和assistant之間一部分對話內容的,這里我們可以看到,user_proxy向assistant交代任務后,assistant便回復了user_proxy?完成任務的所有步驟:firs, next..., 以及所需要的代碼,而user_proxy?則去執行這些代碼,在執行代碼過程中可能會出現異常,user_proxy?會將代碼執行的異常情況再反饋給assistant,assistant再修改代碼,user_proxy再次執行代碼,這樣迭代循環,直至最后完成任務:
?最后我們看到所有代碼中的bug被解決以后,user_proxy執行代碼后計算出了META和TESLA的年度收益率并將結果反饋給了assistant,assistant最后回復用戶user_proxy時在末尾加上了 “TERMINATE”標記表示任務已經完成。上面的例子涉及代碼執行。
在AutoGen中,當UserProxyAgent(用戶代理)在接收到的消息中檢測到可執行代碼塊并且沒有提供人工用戶輸入時,它會自動觸發代碼執行。這個過程在指定的工作目錄中進行,默認使用Docker容器。除非指定了特定的目錄,比如在本例中我們在用戶代理的參數code_execution_config中指定了work_dir為“coding”也就是說autogen會在我們的工作目錄下創建一個coding文件夾,所有的工作都會在coding文件夾內完成,否則AutoGen默認為extensions目錄。在構造UserProxyAgent的新實例時,用戶可以通過設置work_dir參數來指定不同的工作目錄。
任務2:繪圖
接下來我們在任務1的基礎上畫出這兩個股票的收益率趨勢圖,同樣我們只需要告訴用戶代理我們的要求即可:
# 上一個問題的后續
user_proxy.send(recipient=assistant,message="""Plot a chart of their stock price change YTD and save to stock_price_ytd.png.""",
)
?這里我們完成了任務2,并在工作目錄的“coding”文件夾內創建了一個股票收益率的圖片,下面我們來打開這個圖片:
from IPython.display import ImageImage(filename='coding/stock_price_ytd.png')
總結
今天我們學習了AutoGen的基本原理以及基礎參數的設置,并通過兩個簡單的例子輕松實現了原本需要使用復雜邏輯才能完成的任務。任務的復雜邏輯并沒有發生變化,只是實現這些邏輯的主體由人變成了AI,我們模擬出兩個由AI擔任的人物角色,他們通過相互之間的對話一步一步的解決了人類交給它們的任務,你說神奇不神奇!😀。
參考資料
Getting Started | AutoGen