LLMCompiler:大模型的并行工具調用 原創
大型語言模型(LLM)有一些固有限制,如知識截斷、較差的算術能力或無法訪問私有數據等。為了克服這些限制,研究人員使用了諸如檢索增強生成(Retrieval Augmented Generation,RAG)的技術,該技術通過查詢向量或結構化數據庫,在提示中添加相關上下文的結果。
像Toolformer和ReAct這樣的創新提高了LLM的性能,使其能夠使用外部函數進行復雜問題的解決。LLM整合各種工具和函數調用的能力可能會導致在開發基于LLM的軟件時發生根本性的轉變。當前方法(特別是ReAct)存在一些挑戰:
- 準確性:連接中間觀察結果可能會影響LLM的執行流程,從而降低準確性。
- 串行執行:無法并行運行多個工具。
- 可靠性:中間結果可能會影響LLM跟蹤任務的能力。
- 可測試性:很難為代碼的特定路徑創建單元測試。
- 長期規劃:當前的LLM在長期規劃方面表現不佳。
- 調試:需要手動閱讀中間思考/觀察,并推理LLM為什么得出錯誤的結果。
- 容錯性:很難從LLM的錯誤決策中恢復(無重新規劃)。
?? 如果我們能將問題分解為更易處理的函數調用,會怎樣?
這與熟練的程序員在大規模代碼中所做的類似,將代碼分解成較小、易于推理、調試和測試的部分。編寫正確調用這些部分的控制邏輯,并使用try/except進行錯誤處理。
這正是LLMCompiler想要解決的問題!
LLMCompiler是第一個優化LLM函數調用編排的框架,它不僅可以提高響應時間和成本,還可以通過減少中間函數調用的干擾來提高準確性,并優化LLM的并行函數調用性能。
從高層次上看,這是通過引入三個關鍵組件來實現的:
- LLM計劃器:用于識別執行流程的LLM計劃器;
- 任務獲取單元:根據貪婪策略,將任務并行地發送給執行器;
- 執行器:使用關聯函數執行任務的執行器。
LLMCompiler概述
LLM計劃器:LLM計劃器生成一個任務序列及其依賴關系,形成一個有向無環圖。它利用LLMs的推理能力,識別任務、輸入和相互依賴關系。如果一個任務依賴于之前的任務,它將使用占位符變量,在稍后用該任務的實際輸出替換該變量。
計劃器利用LLMs的推理能力,通過預定義的提示將自然語言輸入分解為任務,并指導它如何創建依賴圖并確保正確的語法格式。
任務獲取單元:任務獲取單元根據貪婪策略,一旦任務準備就緒(并行執行),就將任務發送給執行器。它將變量替換為計劃器最初設置的占位符的實際輸出。在上面的示例中,Task Fetching Unit會在搜索任務完成后,將任務
中的變量1和$2替換為Microsoft和Apple的實際市值。
執行器:執行器以異步和并發的方式執行從任務獲取單元獲取的任務。執行器配備了用戶提供的工具,并將任務委托給關聯的工具。這些工具可以是簡單的函數,如計算器、維基百科搜索或API調用,甚至可以是針對特定任務定制的LLM代理。每個任務都有專用的內存來存儲其中間結果,類似于典型的順序框架在將觀察結果聚合為單個提示時所做的操作。任務完成后,最終結果將作為輸入轉發給依賴于它們的其他任務。
動態重新規劃:執行圖可能需要根據先前未知的中間結果進行調整。在程序中,類似的情況是分支,執行路徑只在運行時確定,取決于滿足哪些分支條件。在LLM函數調用中也可能出現這種動態執行模式。在重新規劃中,執行器將中間結果發送回LLM計劃器。根據此結果,計劃器生成一組新的任務及其關聯的依賴關系,并將它們發送給任務獲取單元,然后再發送給執行器。此過程重復執行,直到獲得最終結果。
如何使用?
在LLMCompiler中,用戶只需要提供以下內容:
工具定義:工具的名稱、類型和參數,與其他框架(如ReAct、OpenAI函數調用等)類似。
計劃器的上下文示例:說明計劃器應該如何工作的示例,這有助于LLM計劃器以正確的格式生成適當的依賴圖。
性能結果
LLMCompiler的延遲改進:LLMCompiler通過避免順序推理和函數調用顯著減少延遲,在各種數據集上相對于ReAct的加速比可達到1.8倍和3.7倍。
值得注意的是,LLMCompiler在并行函數調用方面甚至超過了OpenAI,提高了高達35%的性能。這種改進可能源于在幕后減少驗證函數名稱和參數的開銷。
LLMCompiler的準確性改進:LLMCompiler在準確性方面優于ReAct。通過預先規劃的執行和最小化每個推理-操作循環中間結果的干擾,LLMCompiler減輕了ReAct的冗余函數調用和過早終止等缺點。
LLMCompiler與OpenAI的并行函數調用的準確性相匹配。
結論
LLMCompiler框架代表了在更有效的問題解決中利用大型語言模型(LLM)的一項變革性進展,解決了知識截斷、算術限制和數據訪問限制等固有挑戰。通過優化LLM函數調用以提高響應時間、成本和準確性,LLMCompiler引入了一種新穎的方法,類似于熟練的編程實踐——將復雜任務分解為可管理的單元,并采用動態重新規劃。它不僅在實際應用中顯著增強了LLM的效用,而且為人工智能和機器學習技術的未來開辟了新的視野,為開發更強大、適應性更強、能夠應對復雜挑戰的系統帶來了希望。
譯自(有刪改):??https://www.anup.io/p/llmcompiler-towards-parallel-function??
本文轉載自公眾號AIGC最前線
