從思考到行動:大模型自主工具調用能力的深度實現

本項目由複旦大學知識工場實驗室肖仰華教授、梁家卿青年副研究員領導,博士生韓槿一,碩士生李廷雲、熊程元、薑子上、王昕奕等同學共同參與完成。

GPT – 4o、Deepseek – R1 等高級模型已展現出令人驚歎的「深度思考」能力:理解上下文關聯、拆解多步驟問題、甚至通過思維鏈(Chain – of – Thought)進行自我驗證、自我反思等推理過程。

但是,多數主流模型仍在基礎問題上犯錯,複雜四則運算計算失誤,簡單「兩個小數比大小」出錯、甚至連數清楚 strawberry 里有幾個「r」都能翻車……即使提示像 R1 這樣具備深度思考能力的大模型也要消耗大量的 token 才能勉強答對。

合適的工具調用能夠拓展大模型的能力邊界,但現有工具調用方式將大模型限制在預設的工具使用框架內,更像是一個被動的「提線木偶」,而非真正具備主動性的智能體。主要體現在以下幾個方面:

  • 淺層模仿而非深度理解:SFT 只是學會了特定場景下工具調用的表面模式,而非真正理解工具的功能邊界、適用場景和內部工作機制 

  • 上下文依賴性強:基於 Prompt 的工具調用方法卡奧度依賴於提示的精確性和完整性。一旦用戶描述模糊或提示設計不當,模型就無法正確選擇和使用工具 

  • 工具組合能力受限:當需要多個工具協同解決複雜問題時,現有方法難以支持模型進行靈活的工具組合

複旦大學知識工場實驗室團隊在開源項目 SimpleGRPO 中開源實現了大模型自主工具調用機制,通過引入大模型的深度思考能力,從根本上重構了大模型工具調用的範式。該技術使大模型實現了從被動執行的「提線木偶」到具備自主決策能力的智能體的根本躍遷。

  • 項目開源地址為:https://github.com/lsdefine/simple_GRPO/tree/main/Auto_Program

為什麼大模型需要自主調用工具的能力?

  • 深度整合:大模型不僅是工具的「操控者」,而是能在推理過程中深度理解工具的功能,知道什麼時候、如何使用工具才能更高效地解決問題。

  • 動態調整每次調用工具後,模型會根據新獲得的信息自動調整思路,不斷改進解決方案,讓每一次思考都更精確。

  • 連續性與靈活性:不同於傳統的單次工具調用,自主工具調用能力可以使得模型能夠在複雜任務中多次調用工具,通過連續的交互獲取最佳答案

  • 創新組合:當一個工具無法完成任務時,模型能創新性地將多個工具結合起來,解決更為複雜的挑戰。

表. 一般模型和融入思考進行自主工具調用的模型在工具調用上的能力表現的差異 表. 一般模型和融入思考進行自主工具調用的模型在工具調用上的能力表現的差異 

如何實現大模型的工具自主調用?

我們使用強化學習算法給 LLM 裝上「決策中樞」,實現兩種神仙模式: 

方案 1【邊想邊干】:LLM 思考到一半突然寫代碼輔助解決 → 編譯器運行 → 繼續思考完成後續的推理

當大模型在生成推理或解決問題的過程中,意識到某些步驟需要借助編程工具(如 Python)來完成時,它會直接生成相應的代碼片段,並通過編譯器執行這些代碼,執行結果會被捕獲並作為輸入重新融入到大模型的推理過程中。

這種即時反饋機制使得模型能夠動態調整後續的生成內容。這種方式類似於人類在解決問題時,發現某個計算或分析任務複雜到需要用程序來輔助,便動手編寫代碼並運行結果。 

方案 2【專業分工】:LLM 負責提需求,直接說「我需要計算 38 和 16 的最小公倍數」,專屬代碼小弟秒速響應!強強聯手更精準!

生成模型在推理過程中,當遇到需要編程工具協助的任務時,會明確描述出需求。例如,「我需要計算一組數據的標準差」或「請幫我實現一個排序算法」。這種需求描述通常以自然語言的形式表達,清晰且易於理解。接收到需求後,專門的代碼生成模型會根據描述生成對應的 Python 代碼。

該模型經過大量代碼訓練,擅長將自然語言需求轉化為準確的代碼實現。生成的代碼通過編譯器執行,執行結果被返回給生成模型。生成模型根據結果調整後續推理路徑,確保整個過程連貫一致。

大模型邊思考邊行動

大模型自主調用 Python 命令行

我們首先在簡單數學題上驗證模型能否通過強化學習學會調用工具計算器來輔助解決問題,並觀察其泛化性。我們設定模型可在回答中通過「>>>」調用 Python 命令行,檢測到需要調用 python 程序時,編譯執行並將代碼運行結果插入到先前的生成過程中。以 Qwen2.5 – 7B 為基礎模型,在 GSM8K 上訓練。

  • 模型執行複雜運算時會自主調用命令行來計算

  • 模型在訓練時只接觸數學題,但推理時能自主泛化到其他問題上

  • 3.11 和 3.9 誰大?

以前:瞎蒙(甚至理直氣壯答錯)

現在:秒寫代碼 print(3.11 > 3.9),輸出 False,鐵證如山!

  • strawberry 有幾個「r」?

以前:靠概率硬猜(結果常漏數)

現在:直接上代碼 “strawberry”.count(‘r’),精準輸出 3!

模型調用 Python 程序

面對更難的問題時,我們發現命令行難以發揮作用。例如,模型使用 Python 來解方程時,需要導入相應的包,如果使用互相獨立的命令行難以完成,將多個命令行一起執行則模型容易在格式和代碼編寫上出錯。因此,我們嘗試讓模型自己寫整段的 python 程序。

  • 基礎模型:Qwen2.5 – Math – 7B – Base

  • 算法:Reinforce++ • 數據集:MATH level3 – 5 上進行訓練

  • 訓練重要參數設置:temperature:0;學習率:4e – 7;batch_size: 32;

  • 獎勵設置:回答中包含 \boxed{} 且其中答案正確,則獎勵為 1,否則獎勵為 0

訓練結果如下:

  • 複雜一元三次方程求解借助編程解決

模型內心 OS:「這題手算會崩,看我召喚 Python!」

大模型主動提出調用工具需求

實驗細節

1、訓練數據集構建:

從 MATH、Numina、OpenThoughts 中篩選訓練問題時按照以下原則:

  • 使用 Qwen2.5 – 7B – Base 對問題生成多個答案,過濾掉對模型而言較為簡單的題(正確率為 100%)

  • 過濾掉選擇題、概念題等沒有標準答案的問題

2、測試數據集: 以 GSM8K 題目為原型,將其中的數值替換成超大(9~11 位)或者更加複雜(小數)的數值。 

  • 數據集開源地址:https://huggingface.co/datasets/JinyiHan/big-value-gsm

3、算法:GRPO

4、訓練技巧:

  • 獎勵設置:我們注重對格式的獎懲,這樣可以保證在模型訓練前期能快速學習到格式,格式準確率能夠逐漸達到 95% 以上;從而在後期訓練階段模型能夠專注於提升回答的準確率。

  • 課程學習:按照模型正確回答的概率從大到小進行排列

  • 避免 GRPO 同組得分同質化:在訓練過程中,得分完全相同的樣本直接過濾掉

5、模型選擇:

生成模型:Qwen2.5 – 7B – Instruct

代碼模型:Qwen2.5 – 7B – Instruct

實驗結果

  • 模型反復多次提需求調用工具

以前:硬著頭皮硬算,強行編答案

現在:思考後主動使用工具輔助解決

其他有意思的觀察:

  • 模型能夠根據代碼編譯結果能進一步反思

當模型編寫的 python 代碼出現編譯報錯、沒有輸出或運行超時:

以前:出現錯誤後,後續生成的內容全部出錯

現在:模型會根據報錯信息繼續調整策略

  • 自主調用工具的能力能在未見的任務上進行泛化

以前:特定領域微調後並不會遷移到未見任務上

現在:掌握工具後可以在其他領域靈活使用

case1: Knight & Knave (Logic – RL)

case2: CountDown

  • 解鎖新能力,使用 python 來驗證生成答案的正確性

總結

我們探索了結合大模型的深度思考能力提升大模型自主工具調用的能力的兩種方式,包括讓大模型邊思考邊行動、以及讓大模型提出調用工具的需求。

我們發現,通過強化學習的訓練方式,邊想邊干專業分工兩種方式都能夠使大模型靈活、自主地調用工具,並在生成過程中多次調用工具,將工具調用的結果無縫融入後續的推理與決策流程中。

更重要的是,這種自主工具調用能力展現出強大的泛化性,能夠成功應用於完全未見過的任務場景,表現出令人驚歎的潛力。

這一研究成果為未來大模型深度思考能力的實際應用提供了重要的參考價值和技術基礎。我們計劃在不久後發佈相關技術報告或論文,對這些方法進行更詳細的闡述和討論,敬請期待。