作者 | 崔皓
審校 | 重樓
摘要
AutoGen是基于AI Agent的框架,通過(guò)模擬人類(lèi)決策過(guò)程來(lái)解決復(fù)雜問(wèn)題。它利用AI Agent來(lái)處理大量數(shù)據(jù),做出快速?zèng)Q策,并優(yōu)化用戶(hù)交互。具備數(shù)據(jù)處理、自動(dòng)化決策、用戶(hù)交互和復(fù)雜問(wèn)題解決能力的AutoGen,為用戶(hù)提供了處理復(fù)雜問(wèn)題的新思路。通過(guò)構(gòu)建包含多個(gè)AI代理的應(yīng)用程序,AutoGen簡(jiǎn)化了LLM應(yīng)用程序的構(gòu)建過(guò)程,并支持多樣化的對(duì)話(huà)模式,提升了效率和生產(chǎn)力。
本文中,我們通過(guò)一個(gè)具體的例子——A股小助手,展示了如何使用AutoGen框架。在這個(gè)示例中,用戶(hù)通過(guò)代理發(fā)起請(qǐng)求,助手代理通過(guò)自動(dòng)生成和驗(yàn)證代碼的方式,協(xié)助用戶(hù)完成了股票數(shù)據(jù)的下載、分析和圖表繪制任務(wù)。
從AI Agent開(kāi)始
在當(dāng)今時(shí)代,人工智能技術(shù)已深入滲透到我們生活和工作的方方面面,從簡(jiǎn)化日常任務(wù)到優(yōu)化復(fù)雜的業(yè)務(wù)流程,AI的影響無(wú)處不在。然而,盡管AI技術(shù)的發(fā)展迅速,但在處理一些特別復(fù)雜的問(wèn)題時(shí),它仍然面臨挑戰(zhàn)。這些問(wèn)題往往涉及到大量數(shù)據(jù)的處理、復(fù)雜決策的制定,以及對(duì)動(dòng)態(tài)環(huán)境的快速適應(yīng),這些都是傳統(tǒng)AI系統(tǒng)難以克服的難題。
正是在這種背景下,AI Agent的概念應(yīng)運(yùn)而生。AI Agent是一種特殊類(lèi)型的人工智能系統(tǒng),它通過(guò)模擬人類(lèi)的決策過(guò)程來(lái)處理復(fù)雜的任務(wù)。這些智能代理能夠處理和分析大量數(shù)據(jù),提供快速且準(zhǔn)確的解決方案,從而在那些對(duì)人類(lèi)來(lái)說(shuō)過(guò)于耗時(shí)或復(fù)雜的任務(wù)中大放異彩。AI Agent的核心優(yōu)勢(shì)在于其能夠極大地提高處理這些復(fù)雜問(wèn)題的效率和生產(chǎn)力,從而推動(dòng)技術(shù)的進(jìn)一步發(fā)展和應(yīng)用。
AI Agent解決的具體問(wèn)題包括:
數(shù)據(jù)處理和分析:AI Agent能夠快速處理和分析大量數(shù)據(jù),提供有洞察力的結(jié)果,這對(duì)于人類(lèi)來(lái)說(shuō)可能既費(fèi)時(shí)又費(fèi)力。
自動(dòng)化決策:在需要快速響應(yīng)的場(chǎng)景中,AI Agent可以自動(dòng)做出決策,減少了人為干預(yù)的需要。
用戶(hù)交互:通過(guò)聊天機(jī)器人等形式,AI Agent能夠提供7*24小時(shí)的客戶(hù)服務(wù),改善用戶(hù)體驗(yàn)。
復(fù)雜問(wèn)題解決:AI Agent能夠解決復(fù)雜的問(wèn)題,如預(yù)測(cè)分析優(yōu)化問(wèn)題等,這些通常超出了人類(lèi)的直接處理能力。
什么是AutoGen
AI Agent為我們提供了一種處理復(fù)雜問(wèn)題的思路,那么如何實(shí)現(xiàn)AI Agent呢?那就是AutoGen, AutoGen作為一個(gè)框架,提供了創(chuàng)建和管理AI Agent的必要工具和結(jié)構(gòu)。它不僅僅是一個(gè)簡(jiǎn)單的代理實(shí)現(xiàn),而是一個(gè)全面的解決方案,使得開(kāi)發(fā)者能夠構(gòu)建復(fù)雜的基于多個(gè)AI代理的應(yīng)用程序。
Microsoft AutoGen,用于開(kāi)發(fā)使用多個(gè)代理進(jìn)行對(duì)話(huà)以解決任務(wù)的大型語(yǔ)言模型(LLM)應(yīng)用程序。AutoGen的代理是可定制的、可對(duì)話(huà)的,并且無(wú)縫地允許人類(lèi)參與。它們可以在使用LLM人類(lèi)輸入和工具的組合的各種模式下操作。
主要特點(diǎn):
AutoGen使構(gòu)建基于多代理對(duì)話(huà)的下一代LLM應(yīng)用程序變得簡(jiǎn)單,它簡(jiǎn)化了復(fù)雜LLM工作流的編排自動(dòng)化和優(yōu)化。
它支持復(fù)雜工作流的多樣化對(duì)話(huà)模式,并提供了不同復(fù)雜度的工作系統(tǒng)示例,展示了AutoGen如何輕松支持多樣化的對(duì)話(huà)模式。
AutoGen提供了增強(qiáng)的LLM推理功能,包括API統(tǒng)一緩存以及高級(jí)使用模式,如錯(cuò)誤處理多配置推理上下文編程等。
AutoGen不僅功能強(qiáng)大,而且安裝簡(jiǎn)單,通過(guò)pip安裝:
pip install pyautogen
接下來(lái),我們想通過(guò)AutoGen示例,讓大家對(duì)其有更加全面的了解。
A股小助手:用戶(hù)代理與智能助手
在快節(jié)奏的職場(chǎng)環(huán)境中,經(jīng)常會(huì)遇到需要對(duì)公開(kāi)的商業(yè)數(shù)據(jù)進(jìn)行匯總和分析的任務(wù)。想象一下,您的老板要求您收集和分析某些關(guān)鍵數(shù)據(jù),比如股票市場(chǎng)的表現(xiàn)。這項(xiàng)任務(wù)不僅包括搜索和下載相關(guān)數(shù)據(jù),還涉及到對(duì)數(shù)據(jù)的深入分析,并且需要將分析結(jié)果以可視化的形式呈現(xiàn)。這個(gè)過(guò)程不僅繁瑣,而且在處理數(shù)據(jù)時(shí)還存在潛在的風(fēng)險(xiǎn)和偏差,因此,一個(gè)能夠有效協(xié)助您的工具變得至關(guān)重要。
在這種情境下,讓我們以一個(gè)具體的例子來(lái)展示如何使用AutoGen來(lái)簡(jiǎn)化這一過(guò)程。假設(shè)您需要比較中國(guó)A股市場(chǎng)中兩只知名股票——萬(wàn)科A和招商銀行的表現(xiàn)。具體任務(wù)是下載這兩只股票的歷史數(shù)據(jù),對(duì)它們的收益情況進(jìn)行比較,并生成相應(yīng)的分析圖表。這不僅需要對(duì)數(shù)據(jù)進(jìn)行準(zhǔn)確的提取和處理,還要求能夠以一種清晰直觀的方式展示結(jié)果。
使用AutoGen,您可以構(gòu)建一個(gè)流程,其中包括多個(gè)AI代理,每個(gè)代理負(fù)責(zé)處理流程的不同部分。例如,一個(gè)代理可以負(fù)責(zé)從金融數(shù)據(jù)庫(kù)中下載所需的股票數(shù)據(jù),另一個(gè)代理則專(zhuān)注于數(shù)據(jù)的分析和處理,最后一個(gè)代理則將分析結(jié)果轉(zhuǎn)化為易于理解的圖表。通過(guò)這種方式,AutoGen不僅大大減輕了您的工作負(fù)擔(dān),還提高了整個(gè)分析過(guò)程的準(zhǔn)確性和效率。最終,您可以向老板展示一份既全面又直觀的股票表現(xiàn)對(duì)比報(bào)告,這份報(bào)告不僅基于最新的數(shù)據(jù),而且以一種易于理解的圖形方式呈現(xiàn)。
思路整理
在開(kāi)始實(shí)現(xiàn)上述功能之前,先讓我們把參與者和流程整理一下,如下圖所示:
AutoGen處理股票數(shù)據(jù)比較的過(guò)程,有用戶(hù)、用戶(hù)代理、用戶(hù)助手三個(gè)參與者。用戶(hù)負(fù)責(zé)提出問(wèn)題。用戶(hù)代理由AutoGen的對(duì)象扮演,它負(fù)責(zé)理解用戶(hù)提出的問(wèn)題,并向用戶(hù)助手發(fā)出命令,如果在執(zhí)行過(guò)程中用戶(hù)助手遇到問(wèn)題,用戶(hù)代理需要對(duì)其進(jìn)行解釋。用戶(hù)助手負(fù)責(zé)拿出解決方案,生成執(zhí)行代碼,同時(shí)還需要評(píng)估代碼的正確性。最終,將執(zhí)行的代碼交給用戶(hù)代理執(zhí)行。
流程的步驟如下:
- 用戶(hù)提出問(wèn)題,需要將股票的比較信息通過(guò)畫(huà)圖的方式展示出來(lái)。
- 用戶(hù)助手收到問(wèn)題后,進(jìn)行理解和解釋?zhuān)S后判斷問(wèn)題的性質(zhì),并且轉(zhuǎn)交給用戶(hù)助手進(jìn)行執(zhí)行。
- 用戶(hù)助手采取相應(yīng)的處理措施,按照得到的方案生成執(zhí)行任務(wù),在模擬代碼執(zhí)行的時(shí)候發(fā)現(xiàn)問(wèn)題。
- 針對(duì)問(wèn)題,用戶(hù)助手進(jìn)行自我修復(fù),再次模擬執(zhí)行代碼。在代碼通過(guò)執(zhí)行之后,將其交給用戶(hù)代理執(zhí)行。
- 用戶(hù)代理執(zhí)行代碼之后,將結(jié)果返回給用戶(hù)。
股票比較流程圖
代碼編寫(xiě)
清楚流程之后我們來(lái)看看代碼,如下:
# 導(dǎo)入autogen模塊。這個(gè)模塊可能是一個(gè)自動(dòng)生成某些配置的庫(kù)。
import autogen
# 使用autogen模塊中的config_list_from_json函數(shù)。
# 此函數(shù)的作用是從一個(gè)JSON格式的配置文件中創(chuàng)建配置列表。
config_list = autogen.config_list_from_json(
# 第一個(gè)參數(shù)是JSON配置文件的名稱(chēng),這里指定的是"OAI_CONFIG_LIST.json"。
# 這個(gè)JSON文件包含了一些配置數(shù)據(jù)。
"OAI_CONFIG_LIST.json",
# 第二個(gè)參數(shù)是一個(gè)字典,它用于過(guò)濾配置文件中的內(nèi)容。
# 這里的字典指定了只選擇模型為"gpt-4"的配置。
filter_dict={
"model": ["gpt-4"],
},
)
這段代碼用于導(dǎo)入AutoGen 的模塊并調(diào)用其中的 config_list_from_json 函數(shù)加載與大模型相關(guān)的配置信息。下面按照要求進(jìn)行解釋?zhuān)?/span>
1. 導(dǎo)入模塊:
import autogen:導(dǎo)入名為 autogen 的Python模塊。這個(gè)模塊的具體功能未在代碼中說(shuō)明,但根據(jù)名稱(chēng)推測(cè),它可能與自動(dòng)生成配置或代碼有關(guān)。
2. 函數(shù)調(diào)用:
config_list_from_json 函數(shù)從JSON文件中讀取配置,并根據(jù)提供的過(guò)濾條件生成一個(gè)配置列表。
過(guò)濾字典:
3. filter_dict:用于過(guò)濾JSON文件中的內(nèi)容。在這個(gè)例子中,它指定了["gpt-4"] 作為AutoGen要使用的模型。
接下來(lái)看看 OAI_CONFIG_LIST.json文件長(zhǎng)什么樣子。文件包含了一個(gè)JSON數(shù)組,每個(gè)元素是一個(gè)JSON對(duì)象,代表一個(gè)API配置。這個(gè)文件可能被用于存儲(chǔ)不同API環(huán)境的配置信息,如API密鑰和基礎(chǔ)URL。
[
{
#大模型的名字
'model': 'gpt-4',
#對(duì)應(yīng)的API的Key
'api_key': '<your OpenAI API key here>',
},
{
'model': 'gpt-4',
'api_key': '<your Azure OpenAI API key here>',
'base_url': '<your Azure OpenAI API base here>',
'api_type': 'azure',
'api_version': '2023-06-01-preview',
},
{
'model': 'gpt-4-32k',
'api_key': '<your Azure OpenAI API key here>',
'base_url': '<your Azure OpenAI API base here>',
'api_type': 'azure',
'api_version': '2023-06-01-preview',
},
]
接著重頭戲上演,我們創(chuàng)建了兩個(gè)對(duì)象:assistant 和 user_proxy。它們用來(lái)創(chuàng)建用戶(hù)代理和用戶(hù)助手。用于模擬用戶(hù)代理和用戶(hù)助手之間的交互。下面是對(duì)代碼的逐行解釋?zhuān)?/span>
1.創(chuàng)建用戶(hù)助手 (assistant)
# 創(chuàng)建一個(gè)名為'assistant'的AssistantAgent對(duì)象,這個(gè)對(duì)象可能代表一個(gè)智能助手。
assistant = autogen.AssistantAgent(
name="assistant", # 名字屬性被設(shè)置為'assistant'。
llm_config={ # llm_config是一個(gè)字典,用于配置助手的行為。
"cache_seed": 42, # 'cache_seed'可能用于初始化隨機(jī)數(shù)生成器,以保持結(jié)果的一致性。
"config_list": config_list, # 'config_list'是之前從JSON文件中得到的配置列表。
"temperature": 0, # 'temperature'設(shè)置為0,可能用于控制生成內(nèi)容時(shí)的隨機(jī)性或創(chuàng)造性。
},
)
2.創(chuàng)建用戶(hù)代理 (user_proxy)
# 創(chuàng)建一個(gè)名為'user_proxy'的UserProxyAgent對(duì)象,這個(gè)對(duì)象可能代表一個(gè)用戶(hù)界面或代理。
user_proxy = autogen.UserProxyAgent(
name="user_proxy", # 名字屬性被設(shè)置為'user_proxy'。
human_input_mode="NEVER", # 'human_input_mode'被設(shè)置為'NEVER',表明不預(yù)期會(huì)有來(lái)自真人的輸入。
max_consecutive_auto_reply=10, # 'max_consecutive_auto_reply'設(shè)定在需要用戶(hù)輸入而沒(méi)有輸入時(shí),自動(dòng)回復(fù)的最大次數(shù)。
is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"), # 'is_termination_msg'是一個(gè)函數(shù),用于判斷消息內(nèi)容是否表示終止對(duì)話(huà)。
code_execution_config={ # 'code_execution_config'配置代碼執(zhí)行的環(huán)境。
"work_dir": "coding", # 'work_dir'設(shè)定工作目錄為'coding'。
"use_docker": False, # 'use_docker'表明在執(zhí)行代碼時(shí)不使用Docker容器。
},
)
3.初始化聊天和發(fā)送消息
# user_proxy使用initiate_chat方法向助手發(fā)起聊天,并發(fā)送一條消息。
user_proxy.initiate_chat(
assistant, # 指定要發(fā)送到的助手。
message="""今天是幾號(hào)? 請(qǐng)幫我比較萬(wàn)科A股票和招商銀行股票的收益情況,用圖表的形式對(duì)兩者進(jìn)行比較。""", # 發(fā)送的消息內(nèi)容。
)
assistant 是一個(gè)配置了特定參數(shù)的助手代理,可能用于執(zhí)行某種自動(dòng)化任務(wù)或處理。
user_proxy 是一個(gè)模擬用戶(hù)的代理,配置了自動(dòng)回復(fù)和終止對(duì)話(huà)的條件。
user_proxy 通過(guò) initiate_chat 方法與 assistant 開(kāi)啟對(duì)話(huà),并發(fā)送了一個(gè)關(guān)于比較股票收益的任務(wù)描述。
結(jié)果展示
在執(zhí)行代碼之后可以產(chǎn)生結(jié)果,由于結(jié)果內(nèi)容比較長(zhǎng),涉及到方案的提出,代碼生成,代碼驗(yàn)證,代碼修改等過(guò)程。這是一個(gè)復(fù)雜的自我修正過(guò)程,主要體現(xiàn)了用戶(hù)代理與助手之間的互動(dòng)中,我把結(jié)果的輸出整理成如下內(nèi)容,方便大家閱讀:
提問(wèn)-用戶(hù)代理To助手:
用戶(hù)詢(xún)問(wèn)了當(dāng)前的日期,并請(qǐng)求比較萬(wàn)科A股票與招商銀行股票的收益情況,并要求以圖表形式展示。
得出方案-助手To用戶(hù)代理:
助手提出了一個(gè)解決方案,該方案分為三個(gè)主要步驟:
1. 使用Python的datetime庫(kù)獲取當(dāng)前日期。
2. 利用pandas_datareader庫(kù)從Yahoo Finance獲取股票的歷史數(shù)據(jù)。
3. 使用matplotlib庫(kù)將數(shù)據(jù)繪制成圖表形式,比較兩只股票的收益情況。
然而,當(dāng)嘗試執(zhí)行獲取Yahoo財(cái)經(jīng)數(shù)據(jù)的代碼時(shí)遇到了問(wèn)題,錯(cuò)誤提示表明類(lèi)型錯(cuò)誤,字符串索引必須是整數(shù)。
再次執(zhí)行代碼-助手To用戶(hù)代理:
助手建議使用yfinance庫(kù)來(lái)替代pandas_datareader,以解決從Yahoo財(cái)經(jīng)獲取數(shù)據(jù)的問(wèn)題。在成功安裝yfinance庫(kù)后,助手提供了新的代碼片段來(lái)重新獲取股票數(shù)據(jù),并將數(shù)據(jù)保存到CSV文件中。然后,又提供了另一段代碼來(lái)創(chuàng)建圖表,這次的代碼執(zhí)行成功。
最終得到結(jié)果-助手To用戶(hù)代理:
助手確認(rèn)萬(wàn)科A和招商銀行的歷史價(jià)格數(shù)據(jù)已成功獲取,并且圖表已創(chuàng)建。由于環(huán)境限制,助手指出無(wú)法直接顯示圖表,并建議用戶(hù)在本地環(huán)境中運(yùn)行代碼以查看圖表。最終,通過(guò)發(fā)送“TERMINATE”,結(jié)束了對(duì)話(huà)。
AutoGen任務(wù)代碼
在整個(gè)過(guò)程中,用戶(hù)代理與助手之間的交互主要集中在解決問(wèn)題和代碼執(zhí)行上。助手在診斷并解決問(wèn)題時(shí)表現(xiàn)出適應(yīng)性和靈活性,最終提供了滿(mǎn)足用戶(hù)請(qǐng)求的結(jié)果。
下面我們把用戶(hù)助理生成的代碼放在下面,大家可以參考。這段Python代碼用于比較兩只股票(萬(wàn)科A和招商銀行)的每日收益情況,并將結(jié)果以圖表形式展示。下面是對(duì)每一部分代碼的詳細(xì)解釋?zhuān)?/span>
# 導(dǎo)入必要的Python庫(kù)。
import datetime # 用于處理日期和時(shí)間。
import pandas as pd # 用于數(shù)據(jù)分析和操作。
import matplotlib.pyplot as plt # 用于數(shù)據(jù)可視化。
import yfinance as yf # 用于從Yahoo Finance下載股票數(shù)據(jù)。
# 獲取當(dāng)前日期并打印。
today = datetime.date.today()
print("今天是:", today)
# 設(shè)置獲取股票數(shù)據(jù)的起始和結(jié)束日期。
start_date = '2020-01-01' # 設(shè)置起始日期為2020年1月1日。
end_date = today # 設(shè)置結(jié)束日期為當(dāng)前日期。
# 使用yfinance下載萬(wàn)科A和招商銀行的股票數(shù)據(jù)。
vanke = yf.download('000002.SZ', start=start_date, end=end_date) # 下載萬(wàn)科A的數(shù)據(jù)。
cmb = yf.download('600036.SS', start=start_date, end=end_date) # 下載招商銀行的數(shù)據(jù)。
# 計(jì)算每日收益率。收益率是通過(guò)將每日的收盤(pán)價(jià)與前一日的收盤(pán)價(jià)進(jìn)行比較計(jì)算得出的。
vanke['Daily Return'] = vanke['Close'].pct_change() # 計(jì)算萬(wàn)科A的每日收益率。
cmb['Daily Return'] = cmb['Close'].pct_change() # 計(jì)算招商銀行的每日收益率。
# 使用matplotlib創(chuàng)建圖表并設(shè)置圖表大小。
plt.figure(figsize=(12,6))
# 設(shè)置圖表的標(biāo)題。
plt.title('Daily Return Comparison')
# 繪制兩只股票的每日收益率曲線(xiàn)。
vanke['Daily Return'].plot(label='Vanke A') # 繪制萬(wàn)科A的收益率曲線(xiàn)。
cmb['Daily Return'].plot(label='CMB') # 繪制招商銀行的收益率曲線(xiàn)。
# 添加圖例。
plt.legend()
# 顯示圖表。
plt.show()
代碼整體比較簡(jiǎn)單,其執(zhí)行過(guò)程如下:
1. 導(dǎo)入所需的庫(kù)。
2. 獲取并打印當(dāng)前日期。
3. 定義獲取股票數(shù)據(jù)的時(shí)間范圍。
4. 從Yahoo Finance下載指定日期范圍內(nèi)的萬(wàn)科A和招商銀行股票數(shù)據(jù)。
5. 計(jì)算并添加每日收益率到下載的數(shù)據(jù)中。
6. 繪制并顯示兩只股票的每日收益率對(duì)比圖表。
代碼中使用的yfinance庫(kù)是一個(gè)流行的金融數(shù)據(jù)接口,可從Yahoo Finance下載歷史市場(chǎng)數(shù)據(jù)。Matplotlib是一個(gè)廣泛使用的Python繪圖庫(kù),可以創(chuàng)建多種靜態(tài)動(dòng)態(tài)和交互式圖表。.pct_change()函數(shù)用于計(jì)算數(shù)據(jù)幀中元素的百分比變化,常用于金融數(shù)據(jù)分析中計(jì)算收益率。plt.show()函數(shù)調(diào)用會(huì)打開(kāi)一個(gè)窗口展示生成的圖表。在Jupyter Notebook或其他交互式環(huán)境中,圖表通常會(huì)直接顯示。
兩只股票收益的比較圖
總結(jié)
本文介紹了AutoGen框架及其在金融數(shù)據(jù)分析中的應(yīng)用。用戶(hù)通過(guò)代理請(qǐng)求幫助,AutoGen框架的助手代理接收任務(wù)后,使用Python代碼處理股票數(shù)據(jù)并繪制比較圖表。這個(gè)過(guò)程展示了AutoGen在處理數(shù)據(jù)下載、分析和可視化方面的能力。
通過(guò)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的A股小助手,AutoGen減輕了用戶(hù)的工作負(fù)擔(dān),提高了任務(wù)執(zhí)行的準(zhǔn)確性和效率。使用AutoGen,即使是復(fù)雜的任務(wù),也可以通過(guò)構(gòu)建流程、分配代理和自動(dòng)化代碼執(zhí)行來(lái)簡(jiǎn)化,從而使用戶(hù)能夠以更直觀的方式呈現(xiàn)數(shù)據(jù)和分析結(jié)果。
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開(kāi)發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。