從思考到行動:大模型自主工具調(diào)用能力的深度實(shí)現(xiàn)
本項目由復(fù)旦大學(xué)知識工場實(shí)驗室肖仰華教授、梁家卿青年副研究員領(lǐng)導(dǎo),博士生韓槿一,碩士生李廷云、熊程元、姜子上、王昕奕等同學(xué)共同參與完成。
GPT - 4o、Deepseek - R1 等高級模型已展現(xiàn)出令人驚嘆的「深度思考」能力:理解上下文關(guān)聯(lián)、拆解多步驟問題、甚至通過思維鏈(Chain - of - Thought)進(jìn)行自我驗證、自我反思等推理過程。
但是,多數(shù)主流模型仍在基礎(chǔ)問題上犯錯,復(fù)雜四則運(yùn)算計算失誤,簡單「兩個小數(shù)比大小」出錯、甚至連數(shù)清楚 strawberry 里有幾個「r」都能翻車……即使提示像 R1 這樣具備深度思考能力的大模型也要消耗大量的 token 才能勉強(qiáng)答對。
合適的工具調(diào)用能夠拓展大模型的能力邊界,但現(xiàn)有工具調(diào)用方式將大模型限制在預(yù)設(shè)的工具使用框架內(nèi),更像是一個被動的「提線木偶」,而非真正具備主動性的智能體。主要體現(xiàn)在以下幾個方面:
- 淺層模仿而非深度理解:SFT 只是學(xué)會了特定場景下工具調(diào)用的表面模式,而非真正理解工具的功能邊界、適用場景和內(nèi)部工作機(jī)制
- 上下文依賴性強(qiáng):基于 Prompt 的工具調(diào)用方法高度依賴于提示的精確性和完整性。一旦用戶描述模糊或提示設(shè)計不當(dāng),模型就無法正確選擇和使用工具
- 工具組合能力受限:當(dāng)需要多個工具協(xié)同解決復(fù)雜問題時,現(xiàn)有方法難以支持模型進(jìn)行靈活的工具組合
復(fù)旦大學(xué)知識工場實(shí)驗室團(tuán)隊在開源項目 SimpleGRPO 中開源實(shí)現(xiàn)了大模型自主工具調(diào)用機(jī)制,通過引入大模型的深度思考能力,從根本上重構(gòu)了大模型工具調(diào)用的范式。該技術(shù)使大模型實(shí)現(xiàn)了從被動執(zhí)行的「提線木偶」到具備自主決策能力的智能體的根本躍遷。
- 項目開源地址為:https://github.com/lsdefine/simple_GRPO/tree/main/Auto_Program
為什么大模型需要自主調(diào)用工具的能力?
- 深度整合:大模型不僅是工具的「操控者」,而是能在推理過程中深度理解工具的功能,知道什么時候、如何使用工具才能更高效地解決問題。
- 動態(tài)調(diào)整:每次調(diào)用工具后,模型會根據(jù)新獲得的信息自動調(diào)整思路,不斷改進(jìn)解決方案,讓每一次思考都更精確。
- 連續(xù)性與靈活性:不同于傳統(tǒng)的單次工具調(diào)用,自主工具調(diào)用能力可以使得模型能夠在復(fù)雜任務(wù)中多次調(diào)用工具,通過連續(xù)的交互獲取最佳答案。
- 創(chuàng)新組合:當(dāng)一個工具無法完成任務(wù)時,模型能創(chuàng)新性地將多個工具結(jié)合起來,解決更為復(fù)雜的挑戰(zhàn)。

表. 一般模型和融入思考進(jìn)行自主工具調(diào)用的模型在工具調(diào)用上的能力表現(xiàn)的差異
如何實(shí)現(xiàn)大模型的工具自主調(diào)用?
我們使用強(qiáng)化學(xué)習(xí)算法給 LLM 裝上「決策中樞」,實(shí)現(xiàn)兩種神仙模式:
方案 1【邊想邊干】:LLM 思考到一半突然寫代碼輔助解決 → 編譯器運(yùn)行 → 繼續(xù)思考完成后續(xù)的推理
當(dāng)大模型在生成推理或解決問題的過程中,意識到某些步驟需要借助編程工具(如 Python)來完成時,它會直接生成相應(yīng)的代碼片段,并通過編譯器執(zhí)行這些代碼,執(zhí)行結(jié)果會被捕獲并作為輸入重新融入到大模型的推理過程中。
這種即時反饋機(jī)制使得模型能夠動態(tài)調(diào)整后續(xù)的生成內(nèi)容。這種方式類似于人類在解決問題時,發(fā)現(xiàn)某個計算或分析任務(wù)復(fù)雜到需要用程序來輔助,便動手編寫代碼并運(yùn)行結(jié)果。
方案 2【專業(yè)分工】:LLM 負(fù)責(zé)提需求,直接說「我需要計算 38 和 16 的最小公倍數(shù)」,專屬代碼小弟秒速響應(yīng)!強(qiáng)強(qiáng)聯(lián)手更精準(zhǔn)!
生成模型在推理過程中,當(dāng)遇到需要編程工具協(xié)助的任務(wù)時,會明確描述出需求。例如,「我需要計算一組數(shù)據(jù)的標(biāo)準(zhǔn)差」或「請幫我實(shí)現(xiàn)一個排序算法」。這種需求描述通常以自然語言的形式表達(dá),清晰且易于理解。接收到需求后,專門的代碼生成模型會根據(jù)描述生成對應(yīng)的 Python 代碼。
該模型經(jīng)過大量代碼訓(xùn)練,擅長將自然語言需求轉(zhuǎn)化為準(zhǔn)確的代碼實(shí)現(xiàn)。生成的代碼通過編譯器執(zhí)行,執(zhí)行結(jié)果被返回給生成模型。生成模型根據(jù)結(jié)果調(diào)整后續(xù)推理路徑,確保整個過程連貫一致。
大模型邊思考邊行動
大模型自主調(diào)用 Python 命令行
我們首先在簡單數(shù)學(xué)題上驗證模型能否通過強(qiáng)化學(xué)習(xí)學(xué)會調(diào)用工具計算器來輔助解決問題,并觀察其泛化性。我們設(shè)定模型可在回答中通過「>>>」調(diào)用 Python 命令行,檢測到需要調(diào)用 python 程序時,編譯執(zhí)行并將代碼運(yùn)行結(jié)果插入到先前的生成過程中。以 Qwen2.5 - 7B 為基礎(chǔ)模型,在 GSM8K 上訓(xùn)練。
- 模型執(zhí)行復(fù)雜運(yùn)算時會自主調(diào)用命令行來計算

- 模型在訓(xùn)練時只接觸數(shù)學(xué)題,但推理時能自主泛化到其他問題上
- 3.11 和 3.9 誰大?
以前:瞎蒙(甚至理直氣壯答錯)
現(xiàn)在:秒寫代碼 print(3.11 > 3.9),輸出 False,鐵證如山!

- strawberry 有幾個「r」?
以前:靠概率硬猜(結(jié)果常漏數(shù))
現(xiàn)在:直接上代碼 "strawberry".count('r'),精準(zhǔn)輸出 3!

模型調(diào)用 Python 程序
面對更難的問題時,我們發(fā)現(xiàn)命令行難以發(fā)揮作用。例如,模型使用 Python 來解方程時,需要導(dǎo)入相應(yīng)的包,如果使用互相獨(dú)立的命令行難以完成,將多個命令行一起執(zhí)行則模型容易在格式和代碼編寫上出錯。因此,我們嘗試讓模型自己寫整段的 python 程序。
- 基礎(chǔ)模型:Qwen2.5 - Math - 7B - Base
- 算法:Reinforce++ ? 數(shù)據(jù)集:MATH level3 - 5 上進(jìn)行訓(xùn)練
- 訓(xùn)練重要參數(shù)設(shè)置:temperature:0;學(xué)習(xí)率:4e - 7;batch_size: 32;
- 獎勵設(shè)置:回答中包含 \boxed{} 且其中答案正確,則獎勵為 1,否則獎勵為 0
訓(xùn)練結(jié)果如下:

- 復(fù)雜一元三次方程求解借助編程解決
模型內(nèi)心 OS:「這題手算會崩,看我召喚 Python!」

大模型主動提出調(diào)用工具需求
實(shí)驗細(xì)節(jié)
1、訓(xùn)練數(shù)據(jù)集構(gòu)建:
從 MATH、Numina、OpenThoughts 中篩選訓(xùn)練問題時按照以下原則:
- 使用 Qwen2.5 - 7B - Base 對問題生成多個答案,過濾掉對模型而言較為簡單的題(正確率為 100%)
- 過濾掉選擇題、概念題等沒有標(biāo)準(zhǔn)答案的問題
2、測試數(shù)據(jù)集: 以 GSM8K 題目為原型,將其中的數(shù)值替換成超大(9~11 位)或者更加復(fù)雜(小數(shù))的數(shù)值。
數(shù)據(jù)集開源地址:https://huggingface.co/datasets/JinyiHan/big-value-gsm
3、算法:GRPO
4、訓(xùn)練技巧:
- 獎勵設(shè)置:我們注重對格式的獎懲,這樣可以保證在模型訓(xùn)練前期能快速學(xué)習(xí)到格式,格式準(zhǔn)確率能夠逐漸達(dá)到 95% 以上;從而在后期訓(xùn)練階段模型能夠?qū)W⒂谔嵘卮鸬臏?zhǔn)確率。

- 課程學(xué)習(xí):按照模型正確回答的概率從大到小進(jìn)行排列
- 避免 GRPO 同組得分同質(zhì)化:在訓(xùn)練過程中,得分完全相同的樣本直接過濾掉
5、模型選擇:
生成模型:Qwen2.5 - 7B - Instruct
代碼模型:Qwen2.5 - 7B - Instruct
實(shí)驗結(jié)果

- 模型反復(fù)多次提需求調(diào)用工具
以前:硬著頭皮硬算,強(qiáng)行編答案
現(xiàn)在:思考后主動使用工具輔助解決


其他有意思的觀察:
- 模型能夠根據(jù)代碼編譯結(jié)果能進(jìn)一步反思
當(dāng)模型編寫的 python 代碼出現(xiàn)編譯報錯、沒有輸出或運(yùn)行超時:
以前:出現(xiàn)錯誤后,后續(xù)生成的內(nèi)容全部出錯
現(xiàn)在:模型會根據(jù)報錯信息繼續(xù)調(diào)整策略

- 自主調(diào)用工具的能力能在未見的任務(wù)上進(jìn)行泛化
以前:特定領(lǐng)域微調(diào)后并不會遷移到未見任務(wù)上
現(xiàn)在:掌握工具后可以在其他領(lǐng)域靈活使用
case1: Knight & Knave (Logic - RL)

case2: CountDown

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

總結(jié)
我們探索了結(jié)合大模型的深度思考能力提升大模型自主工具調(diào)用的能力的兩種方式,包括讓大模型邊思考邊行動、以及讓大模型提出調(diào)用工具的需求。
我們發(fā)現(xiàn),通過強(qiáng)化學(xué)習(xí)的訓(xùn)練方式,邊想邊干和專業(yè)分工兩種方式都能夠使大模型靈活、自主地調(diào)用工具,并在生成過程中多次調(diào)用工具,將工具調(diào)用的結(jié)果無縫融入后續(xù)的推理與決策流程中。
更重要的是,這種自主工具調(diào)用能力展現(xiàn)出強(qiáng)大的泛化性,能夠成功應(yīng)用于完全未見過的任務(wù)場景,表現(xiàn)出令人驚嘆的潛力。
這一研究成果為未來大模型深度思考能力的實(shí)際應(yīng)用提供了重要的參考價值和技術(shù)基礎(chǔ)。我們計劃在不久后發(fā)布相關(guān)技術(shù)報告或論文,對這些方法進(jìn)行更詳細(xì)的闡述和討論,敬請期待。


































