微軟TaskWeaver開源框架:攜手?jǐn)?shù)據(jù)分析與行業(yè)定制,打造頂級Agent解決方案
數(shù)據(jù)分析一直是現(xiàn)代社會中的重要工具,它幫助我們洞察本質(zhì)、發(fā)現(xiàn)規(guī)律并指導(dǎo)決策。然而,數(shù)據(jù)分析過程往往復(fù)雜且費時,因此我們期望存在一個智能助手助力用戶直接 “與數(shù)據(jù)對話 “。得益于大語言模型(LLM)的發(fā)展,虛擬助手和 Copilot 等智能 Agent 紛紛涌現(xiàn),它們在自然語言理解和生成方面的表現(xiàn)令人嘆為觀止。但遺憾的是,在處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)(如 DataFrame, ndarray 等)和引入領(lǐng)域知識方面,現(xiàn)有的 Agent 框架仍然舉步維艱,而這恰恰是數(shù)據(jù)分析和專業(yè)領(lǐng)域中的核心需求。
為了突破這一瓶頸,微軟推出了 TaskWeaver—— 一款代碼優(yōu)先的 Agent 框架。TaskWeaver 能夠?qū)⒂脩舻淖匀徽Z言請求巧妙地轉(zhuǎn)化為可執(zhí)行代碼,并支持豐富的數(shù)據(jù)結(jié)構(gòu)、動態(tài)插件選擇以及專業(yè)領(lǐng)域適應(yīng)的規(guī)劃過程。作為開源框架,TaskWeaver 充分發(fā)揮了大語言模型的潛力,通過可定制的示例和插件融入特定領(lǐng)域知識,讓用戶能夠輕松打造個性化虛擬助手。
- 論文:TaskWeaver: A Code-First Agent Framework
- 論文地址:https://export.arxiv.org/abs/2311.17541
TaskWeaver 項目已在 GitHub上開源,并于發(fā)布當(dāng)日登上 GitHub 趨勢榜,目前已收獲 2.9k 個 star,在領(lǐng)英等社交平臺上也有一些實用案例(例如用 TaskWeaver 進(jìn)行 SAP 數(shù)據(jù)分析)。
- 項目主頁:https://microsoft.github.io/TaskWeaver/
- 項目地址:https://github.com/microsoft/TaskWeaver
故事示例
追蹤銷售數(shù)據(jù)中的隱藏秘密
作為商業(yè)分析師的小雅,她的日常工作之一就是從近期的銷售數(shù)據(jù)中找出異?,F(xiàn)象,從而指導(dǎo)公司調(diào)整銷售策略。所有銷售數(shù)據(jù)都安全地存儲在一個 SQL 數(shù)據(jù)庫中。她渴望通過與 AI 助手的自然語言交流來輕松提取和分析數(shù)據(jù)。更重要的是,在銷售領(lǐng)域,異?,F(xiàn)象有其獨特性,因此她希望 AI 助手能采用定制的異常檢測算法來解決問題。圖 1 生動地展示了小雅與 AI 助手的聊天實錄。在收到小雅的求助信息后,AI 助手首先從數(shù)據(jù)庫中提取出相應(yīng)數(shù)據(jù),并匯報給小雅進(jìn)行確認(rèn)。隨后,該 AI 助手運用專屬異常檢測算法進(jìn)行分析,并最終向小雅展示出一份直觀的可視化結(jié)果。
圖 1. 故事示例中的對話實錄
Agent 框架需要具備哪些技能?
通過上述小雅的故事,我們梳理了 Agent 框架應(yīng)具備的幾大核心能力:
1. 插件支持:在上面的故事中,Agent 需要從數(shù)據(jù)庫中獲取數(shù)據(jù),然后使用指定的異常檢測算法。為了完成這些任務(wù),智能助手需要能夠定義和調(diào)用自定義插件,如 “query_database” 插件和 “anomaly_detection” 插件。
2. 豐富的數(shù)據(jù)結(jié)構(gòu)支持:Agent 需要處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如數(shù)組、矩陣、表格數(shù)據(jù)等,從而順利進(jìn)行高級數(shù)據(jù)處理,如預(yù)測、聚類等。此外,這些數(shù)據(jù)應(yīng)能在不同插件間無縫傳遞。然而,現(xiàn)有的大多數(shù) Agent 框架會將數(shù)據(jù)分析的中間結(jié)果轉(zhuǎn)換為 Prompt 中的文本,或者先將它們保存為本地文件,然后需要時再讀取。然而,這些做法容易出錯和超過 Prompt 的字?jǐn)?shù)限制。
3. 有狀態(tài)執(zhí)行:Agent 往往需要與用戶進(jìn)行多輪迭代交互,并根據(jù)用戶輸入,生成并執(zhí)行代碼。因此,這些代碼的執(zhí)行狀態(tài)應(yīng)在整個會話期間保留,直到會話結(jié)束。
4. 先推理后行動(ReAct):Agent 應(yīng)該擁有 ReAct 的能力,即先觀察推理后再采取行動,這在一些存在有不確定性的場景中非常有必要。例如,在上述樣例中,由于數(shù)據(jù)庫中的數(shù)據(jù)模式(schema)通常比較多樣,因而 Agent 必須首先獲取數(shù)據(jù)模式信息并了解哪些列是合適的(且與用戶確認(rèn)),然后才可以將相應(yīng)的列名輸入到異常檢測算法中。
5. 生成任意代碼:有時候,預(yù)定義的插件無法滿足用戶的請求,Agent 應(yīng)能夠生成代碼以應(yīng)對用戶的臨時需求。在上述示例中,Agent 需要生成代碼來可視化檢測到的異常,而這個過程是不借助于任何插件來實現(xiàn)的。
6. 融入領(lǐng)域知識:Agent 應(yīng)提供一種系統(tǒng)性的方案來融入特定領(lǐng)域的知識。這將幫助 LLM 進(jìn)行更好的規(guī)劃和準(zhǔn)確地調(diào)用工具,從而產(chǎn)生可靠的結(jié)果,尤其是在行業(yè)定制的場景中。
揭秘 TaskWeaver 的核心架構(gòu)
圖 2 展示了 TaskWeaver 的總體架構(gòu),包括規(guī)劃器(Planner),代碼解釋器(Code Interpreter),以及記憶模塊(Memory)。
規(guī)劃器就像是系統(tǒng)的大腦,它有兩個核心職責(zé):1)制定計劃,即把用戶的需求拆分成子任務(wù),將這些子任務(wù)逐個發(fā)送給代碼解釋器,并在整個計劃執(zhí)行過程中根據(jù)需要自我調(diào)整計劃方案;2)回應(yīng)用戶,它會將代碼解釋器的反饋結(jié)果轉(zhuǎn)換成用戶容易理解的答案并發(fā)送給用戶。
代碼解釋器主要由兩個組件組成:代碼生成器(Code Generator)會收到規(guī)劃器發(fā)送的子任務(wù),結(jié)合現(xiàn)有可用的插件以及領(lǐng)域特有的任務(wù)示例,來生成相應(yīng)的代碼塊;代碼執(zhí)行器(Code Executor)則負(fù)責(zé)執(zhí)行生成的代碼,并在整個會話過程中保持執(zhí)行狀態(tài)。正因為此,復(fù)雜數(shù)據(jù)結(jié)構(gòu)可以在內(nèi)存中傳遞而無需通過 Prompt 或者文件系統(tǒng)。這就像在 Jupyter Notebook 中用 Python 編程,用戶在單元格中輸入代碼片段,程序的內(nèi)部狀態(tài)會按順序執(zhí)行保留下來并且可被后續(xù)過程被引用。在實現(xiàn)上,每個會話中,代碼執(zhí)行器都會有一個獨立的 Python 進(jìn)程來執(zhí)行代碼,從而支持同時服務(wù)多用戶。
記憶模塊主要存儲了整個系統(tǒng)運行過程中的有用信息,如執(zhí)行結(jié)果等,可以被不同的模塊寫入和讀取。短期記憶主要包括當(dāng)前會話中用戶和 TaskWeaver 之間的通信記錄,以及各模塊之間的通信記錄。長期記憶則包括了用戶可預(yù)先定制的領(lǐng)域知識,以及在交互過程中總結(jié)出的一些經(jīng)驗等等。
圖 2. TaskWeaver 整體架構(gòu)示意圖
除了基本架構(gòu)之外,TaskWeaver 還具有許多獨特的設(shè)計。例如,會話壓縮功能可以減小文本大小,從而允許更多的對話輪數(shù);動態(tài)插件選擇功能能夠根據(jù)用戶請求自動挑選合適的插件,從而允許集成更多的定制插件。此外,TaskWeaver 還支持經(jīng)驗保存功能,用戶在使用過程中通過輸入命令即可觸發(fā)該功能,它將總結(jié)用戶在當(dāng)前會話中的經(jīng)驗教訓(xùn),避免在下次會話中重復(fù)錯誤,實現(xiàn)真正的個性化。在安全性方面,TaskWeaver 也進(jìn)行了精心設(shè)計,例如用戶可以指定一個 Python 模塊的白名單列表,如果生成的代碼中引用了白名單之外的模塊,將觸發(fā)錯誤,從而降低安全風(fēng)險。
TaskWeaver 的具體流程
圖 3 向我們展示了 TaskWeaver 在完成前述樣例任務(wù)的部分流程。
首先,規(guī)劃器接收用戶的輸入,結(jié)合各模塊功能描述和規(guī)劃示例生成具體規(guī)劃。該規(guī)劃包含四個子任務(wù),而其中第一個子任務(wù)是從數(shù)據(jù)庫中提取數(shù)據(jù)并描述數(shù)據(jù)模式。
然后,代碼生成器根據(jù)其能力描述和所有相關(guān)插件的定義生成一段代碼。這段代碼調(diào)用了 sql_pull_data 插件,將數(shù)據(jù)保存到 DataFrame 中,并提供數(shù)據(jù)模式的描述。
最后,生成的代碼會被發(fā)送到代碼執(zhí)行器中執(zhí)行,完成后的結(jié)果將被發(fā)送到規(guī)劃器中以更新規(guī)劃或者進(jìn)行下一個子任務(wù)。圖中執(zhí)行結(jié)果顯示 DataFrame 中有兩個列,即日期和數(shù)值。規(guī)劃器可以進(jìn)一步與用戶確認(rèn)這些列是否正確,或者直接進(jìn)行下一步的 anomaly_detection 插件的調(diào)用。
圖 3. TaskWeaver 內(nèi)部工作流
TaskWeaver 中如何注入領(lǐng)域知識?
在大模型應(yīng)用中,整合特定領(lǐng)域知識的主要目的是提高 LLM 在行業(yè)定制中的泛化性能。TaskWeaver 提供了三種將領(lǐng)域知識注入模型的方法:
- 使用插件進(jìn)行定制:用戶可以通過自定義插件的形式整合領(lǐng)域知識。插件可以有多種形式,如調(diào)用 API,從特定數(shù)據(jù)庫中抓取數(shù)據(jù),或運行特定的機(jī)器學(xué)習(xí)算法或模型等。插件定制相對直觀,只需提供插件的基本信息(包括插件名稱、功能描述、輸入?yún)?shù)和返回值)以及 Python 實現(xiàn)。
- 使用示例進(jìn)行定制:TaskWeaver 還為用戶提供了一個系統(tǒng)化的接口(以 YAML 格式)來配置示例,從而教導(dǎo) LLM 如何響應(yīng)用戶請求。具體而言,示例可以分為兩種類型,分別用于規(guī)劃器中的規(guī)劃制定和代碼生成器中的代碼編程。
- 進(jìn)行經(jīng)驗保存:TaskWeaver 支持用戶將當(dāng)前會話過程總結(jié)并存儲為長期記憶。用戶可以將專業(yè)領(lǐng)域知識作為對話內(nèi)容對 TaskWeaver 進(jìn)行 “教學(xué)”,隨后保存對話為經(jīng)驗。在后續(xù)的使用過程中就可以通過動態(tài)加載經(jīng)驗,更好地完成專業(yè)領(lǐng)域問題。
如何使用 TaskWeaver?
TaskWeaver 的完整代碼目前已在 GitHub 上開源。目前支持三種方案進(jìn)行使用,分別是命令行啟動,網(wǎng)頁服務(wù),以及以 Python 庫的形式導(dǎo)入。在簡單安裝后,用戶只需要配置幾項關(guān)鍵參數(shù),如 LLM API 地址、密鑰和模型名稱,即可輕松啟動 TaskWeaver 服務(wù)。
圖 4. 命令行啟動界面
圖 5. TaskWeaver 運行樣例
TaskWeaver 是一款全新的 Agent 框架方案,其設(shè)計符合數(shù)據(jù)分析和行業(yè)定制場景的需要。通過將用戶語言轉(zhuǎn)成程序語言,「與數(shù)據(jù)對話」將不再是夢想,而是現(xiàn)實。