智能體常用策略FunctionCalling和ReAct有什么區別?
Dify 內置了兩種 Agent 策略:Function Calling 和 ReAct,但二者有什么區別呢?在使用時又該如何選擇呢?接下來我們一起來看。
1.Function Calling
Function Call 會通過將用戶指令映射到預定義函數或工具,LLM 先識別用戶意圖,再決定調用哪個函數并提取所需參數。
它的核心是調用外部函數或工具,屬于一種明確的工具調用機制。
優點:
- 精確:對于明確的任務,可以直接調用相應的工具,無需復雜的推理過程。
- 易于集成外部功能可以將各種外部 API 或工具封裝成函數供模型調用。
- 結構化輸出:模型輸出的是結構化的函數調用信息,方便下游節點處理。
- 執行效率高:對于簡單、明確的任務,執行速度快。
缺點:
- 如果任務定義不明確或用戶意圖模糊,LLM 可能難以準確選擇工具或提取參數。
- 對于需要多輪推理才能確定調用哪個工具的任務,不夠靈活。
適用場景:
- 需要根據用戶意圖精確調用特定工具的自動化任務。
- 需要與外部 API 或服務進行交互的場景。
- 數據檢索、信息查詢并以特定格式呈現的應用
2.ReAct
ReAct=Reason+Act,推理+行動,LLM 首先思考當前狀態和目標,然后選擇并調用合適的工具,工具的輸出結果又將引導 LLM 進行下一步的思考和行動,如此循環,直到問題解決。
舉例說明
舉個例子,正常情況下,當我們在計算一個商品的價格時,它的執行步驟是這樣的:
- 查詢商品原價。
- 計算商品優惠價。
- 計算商品最終價格=商品原價-優惠價。
但某個商品情況比較特殊,它在以上第二步中存儲的不是優惠價,而是折扣價(例如 8 折優惠),那么此時商品的最終價格的計算公式就變成了以下方式:
- 查詢商品原價。
- 查詢商品折扣價。
- 計算商品最終價格=商品原價 X 商品折扣價。
在這種情況下就要使用 ReAct 策略了,因為 ReAct 策略會根據第二步的觀測結果,分析并改變第三步的計算公式,保證任務的精準執行,這種情況下就要使用 React 策略。
核心機制:
- ReAct 是一個迭代過程,LLM 在“思考(Reason)-> 行動(Act)-> 觀察(Observe)”的循環中逐步推進任務。
- LLM 首先分析當前狀態和目標,選擇并調用工具,然后根據工具的輸出進行下一步的思考和行動,直到問題解決。
優點:
- 利用外部信息:可以有效使用外部工具來收集模型單獨無法處理的任務所需的信息。
- 可解釋性好:推理和行動步驟交織在一起,允許一定程度上跟蹤 Agent 的過程。
- 廣泛適用性:適用于需要外部知識或特定行動的任務,例如問答、信息檢索和任務執行。
- 靈活性高:對于復雜、多步驟的任務,以及需要探索和動態調整策略的場景,具有更好的適應性。
缺點:
- 執行速度和成本:由于涉及多次 LLM 調用,ReAct 通常比 Function Calling 更慢,并且消耗更多的 tokens。
- 推理穩定性:在很大程度上取決于 LLM 的推理能力以及提示(Instruction)的質量。
- 輸出解析復雜:ReAct 過程中 LLM 產生的“思考”文本格式可能不一致,給解析和提取關鍵信息帶來挑戰。
適用場景:
- 需要進行探索性研究、從多個來源收集和綜合信息的任務。
- 問題解決方案路徑不明確,需要通過迭代嘗試和調整來找到答案的復雜問題。
- 需要較高可解釋性,希望了解 Agent 決策過程的場景。
3.Function Calling VS React
Function Calling 和 React 區別如下:
- Function Calling 更適合簡單、明確的任務,強調直接調用工具的高效性。
- ReAct 更適合復雜、多步驟的任務,強調推理過程的靈活性和可解釋性。