工具学习与函数调用:从推理到行动的闭环
1.1 为什么大模型需要工具
1.1.1.1 知识边界的困境:一个查天气的例子
想象我们问模型:"明天北京飞上海的航班会不会延误?"模型内部存储了大量训练语料,但它不知道明天北京的天气,也无法实时访问民航系统的数据库。如果强行生成答案,它可能会胡编一个概率,或者给出一个基于历史统计的模糊推断。这种知识截止与实时信息缺失的困境,是所有纯文本生成模型面临的硬边界。
在继续之前,我们先看看这个边界在数学上长什么样子。大模型的输出是一个在词表空间上的概率分布:
πθ(yt∣y<t)∈Δ∣V∣ \pi_\theta(y_t \mid y_{<t}) \in \Delta^{|V|} πθ(yt∣y<t)∈Δ∣V∣
其中 ∣V∣|V|∣V∣ 是词表大小,Δ∣V∣\Delta^{|V|}Δ∣V∣ 是概率单纯形。这个分布完全由模型参数 θ\thetaθ 和输入上下文决定。如果训练语料中没有包含"2026年5月23日北京首都机场航班状态",那么无论模型多大,这个条件概率都无法收敛到真实答案。模型被囚禁在自己的参数空间里。
现在我们已经了解了纯生成模型的知识边界,接下来看看打破这个边界需要什么。
1.1.1.2 从生成到决策的范式转换
听起来抽象对吧?如果画成图会是什么样子?我们可以把纯大模型想象成一个关在玻璃房里的学者,房里堆满了书籍(训练数据),但房门被焊死了。学者可以引经据典,却无法感知房间外的世界。工具学习就是在这间玻璃房上凿开一扇门,让学者能够伸手出去按门铃、查日历、打电话。
这个范式转换的核心在于:模型的输出不再仅仅是词元序列,而是动作序列。某些特殊的词元被重新解释为"调用外部函数的指令"。模型从"纯粹的说话者"变成了"带执行能力的控制器"。
这在训练与实际使用中意味着什么:当我们面对需要实时数据、精确计算或物理世界交互的任务时,必须给模型配备一套可执行的工具集。模型的价值不再取决于它记住了多少知识,而取决于它知道何时以及如何调用正确的工具来获取知识。
1.2 工具调用的形式化框架
1.2.1.1 工具作为外部动作空间
现在我们已经了解了打破边界的动机,接下来看看工具在数学上如何被形式化。
我们把工具库定义为一个有限集合 T={τ1,τ2,…,τM}\mathcal{T} = \{\tau_1, \tau_2, \dots, \tau_M\}T={τ1,τ2,…,τM}。每个工具 τi\tau_iτi 是一个可计算函数:
τi:Xi→Yi \tau_i: \mathcal{X}_i \to \mathcal{Y}_i τi:Xi→Yi
其中 Xi\mathcal{X}_iXi 是输入参数空间,Yi\mathcal{Y}_iYi 是输出观察空间。例如,天气查询工具的 X\mathcal{X}X 可能是"城市名+日期",Y\mathcal{Y}Y 则是"温度+降水概率+风速"。
大模型的词表 VVV 被扩展为 V′=V∪TV' = V \cup \mathcal{T}V′=V∪T。模型在生成过程中,不仅可以选择普通词元,还可以选择"工具调用标记"。当模型输出一个工具调用标记时,系统暂停文本生成,执行对应工具,然后将工具的返回值作为新的上下文片段重新注入模型。
如果画成图会是什么样子?想象一条传送带,上面原本只运送文字卡片。现在我们在这条传送带上增设了几个绿色站点,每当一张"工具卡片"经过站点,传送带就暂停,一张机械臂伸出去执行操作,然后把操作结果打印成一张新的卡片放回传送带。
1.2.1.2 马尔可夫决策过程的重新建模
工具学习的完整交互过程可以严格建模为一个部分可观察马尔可夫决策过程(POMDP)。我们用六元组来定义:
M=(S,A,O,T,Z,R) \mathcal{M} = (\mathcal{S}, \mathcal{A}, \mathcal{O}, \mathcal{T}, \mathcal{Z}, \mathcal{R}) M=(S,A,O,T,Z,R)
其中状态空间 S\mathcal{S}S 包含"模型内部上下文表示+环境状态"。动作空间 A=V′=V∪T\mathcal{A} = V' = V \cup \mathcal{T}A=V′=V∪T,既包括生成词元,也包括调用工具。观察空间 O\mathcal{O}O 是工具返回的结果文本。状态转移 T(s′∣s,a)\mathcal{T}(s'|s,a)T(s′∣s,a) 在 aaa 是普通词元时由模型自回归决定,在 aaa 是工具时由外部系统决定。观察函数 Z(o∣s′,a)\mathcal{Z}(o|s',a)Z(o∣s′,a) 在工具调用后返回工具输出,否则返回空。奖励函数 R\mathcal{R}R 可以是任务完成度或人类偏好。
关键洞察在于:当 at∈Ta_t \in \mathcal{T}at∈T 时,状态转移不再由模型参数控制,而是由外部世界的真实动力学接管。模型在这个时刻** relinquish( relinquish 控制权)**,等待观察注入后再继续。
这在实际使用中意味着:工具调用把纯文本生成从一个封闭的自回归过程,改造成了一个开放的控制回路。模型每一步都在做决策:是继续自己生成,还是把控制权交给外部工具?
1.3 ReAct循环的数学结构
1.3.1.1 观察-推理-行动的交替序列
现在我们已经了解了POMDP的建模框架,接下来看看ReAct循环在这个框架下如何运转。
ReAct这个名字是Reasoning和Acting的拼接。它的核心思想是:推理和行动不是两个独立阶段,而是交替编织在同一条序列里。在第 ttt 步,模型面对当前上下文 ctc_tct,它可以选择生成一个推理片段(Thought),或者生成一个行动(Action)。
形式化地,一个ReAct轨迹 τ\tauτ 是一个交替序列:
τ=(q,r1,a1,o1⏟第1轮,r2,a2,o2⏟第2轮,…,rK,aK,oK⏟第K轮,answer) \tau = (q, \underbrace{r_1, a_1, o_1}_{\text{第1轮}}, \underbrace{r_2, a_2, o_2}_{\text{第2轮}}, \dots, \underbrace{r_K, a_K, o_K}_{\text{第K轮}}, \text{answer}) τ=(q,第1轮r1,a1,o1,第2轮r2,a2,o2,…,第K轮rK,aK,oK,answer)
其中 qqq 是初始问题,rkr_krk 是第 kkk 轮的推理文本,aka_kak 是行动(可以是普通词元或工具调用),oko_kok 是执行 aka_kak 后获得的观察。每一轮的三元组 (rk,ak,ok)(r_k, a_k, o_k)(rk,ak,ok) 构成了一个完整的"思考-行动-反馈"节拍。
如果画成图会是什么样子?想象一个三角循环:顶部是"思考气泡",左下角是"行动箭头",右下角是"观察窗口"。三个节点顺时针旋转,每转一圈,模型对外部世界的理解就更深一层。
1.3.1.2 循环收敛性的条件推导
ReAct循环会不会无限转下去?这是一个关键的工程问题。我们从POMDP的角度给出收敛条件。
假设模型在每一步选择行动的策略是 πθ(a∣c)\pi_\theta(a|c)πθ(a∣c)。当 aaa 是终止标记(例如"最终答案:")时,循环结束。我们可以把ReAct循环看作一个随机过程,其停止时间 KKK 是一个随机变量。
收敛性需要两个条件。第一个条件是信息增益递减:每一轮新观察带来的条件熵减少量必须趋于零。形式化地,设 HtH_tHt 是第 ttt 轮后模型对答案的不确定性(答案分布的熵),我们需要:
E[Ht+1−Ht∣ct]≤−ϵ<0 \mathbb{E}[H_{t+1} - H_t \mid c_t] \le -\epsilon < 0 E[Ht+1−Ht∣ct]≤−ϵ<0
直到 HtH_tHt 低于某个阈值。也就是说,每一轮都必须"有所收获",不能空转。
第二个条件是行动空间的有限性。由于工具库 T\mathcal{T}T 和问题相关的推理深度有限,模型不可能无限调用新的工具。我们可以引入一个最大轮数 KmaxK_{\max}Kmax 作为硬截断。
更精细的分析使用吸收态马尔可夫链。把"任务完成"建模为吸收态。ReAct循环收敛等价于这个马尔可夫链以概率1被吸收。根据吸收态链的基本定理,只要从任意非吸收态出发到达吸收态的概率大于零,且状态空间有限,吸收就几乎必然发生。
在实际实现中,这个条件通过以下机制保证:
- 工具调用次数限制(例如最多10次)
- 推理轮数硬截断
- 重复观察检测(如果连续两轮观察相同,强制终止)
这在训练与实际使用中意味着什么:ReAct不是无限制的"自由对话",而是一个带有预算约束的资源受限搜索过程。模型必须在有限的轮数内,通过工具调用收集足够信息,然后收敛到最终答案。收敛性条件告诉我们:好的工具学习策略应该最大化每轮的信息增益,而不是盲目尝试。
1.4 工具选择的决策边界
1.4.1.1 何时调用工具:置信度阈值与信息增益
现在我们已经了解了ReAct循环的收敛框架,接下来看看模型在每一步面临的核心决策:现在该自己回答,还是该调用工具?
这个决策本质上是一个置信度检验。模型对当前上下文 ccc 维护一个关于答案分布 P(answer∣c)P(\text{answer}|c)P(answer∣c) 的信念。如果分布的熵很低(模型很确定),或者最高概率答案的置信度超过阈值 γ\gammaγ,模型应该直接输出答案。否则,模型应该调用工具来降低熵。
形式化地,定义答案分布的熵:
H(P)=−∑a∈AansP(a∣c)logP(a∣c) H(P) = -\sum_{a \in \mathcal{A}_{\text{ans}}} P(a|c) \log P(a|c) H(P)=−a∈Aans∑P(a∣c)logP(a∣c)
当 H(P)<HminH(P) < H_{\min}H(P)<Hmin 时,直接生成答案;否则,从工具库中选择能够最大化期望信息增益的工具:
τ∗=argmaxτ∈TEo∼τ(⋅∣params)[H(P)−H(P∣o)] \tau^* = \arg\max_{\tau \in \mathcal{T}} \mathbb{E}_{o \sim \tau(\cdot|\text{params})} \left[ H(P) - H(P|o) \right] τ∗=argτ∈TmaxEo∼τ(⋅∣params)[H(P)−H(P∣o)]
这里 H(P)−H(P∣o)H(P) - H(P|o)H(P)−H(P∣o) 就是互信息 I(answer;o)I(\text{answer}; o)I(answer;o),表示观察 ooo 能够减少多少关于答案的不确定性。
听起来抽象对吧?如果画成图会是什么样子?想象一个天平,左边托盘放着"模型自信",右边托盘放着"信息缺口"。当左边下沉时,模型直接作答;当右边下沉时,模型伸手去工具箱里挑一个最合适的工具。
1.4.1.2 工具参数的形式化生成
选定工具 τ\tauτ 后,模型还需要生成正确的输入参数。参数生成不是自由文本,而是结构化输出。通常采用JSON模式:
{
"tool": "weather_query",
"parameters": {
"city": "北京",
"date": "2026-05-23"
}
}
在训练阶段,这被转化为一个约束解码问题。模型在生成工具调用标记后,解码器被强制切换到JSON模式,只能生成符合预定义schema的token序列。从概率角度看,这相当于在原始分布 πθ\pi_\thetaπθ 上施加了一个硬约束:
πθconstrained(yt∣c)∝πθ(yt∣c)⋅I[yt∈Validt] \pi_\theta^{\text{constrained}}(y_t|c) \propto \pi_\theta(y_t|c) \cdot \mathbb{I}[y_t \in \text{Valid}_t] πθconstrained(yt∣c)∝πθ(yt∣c)⋅I[yt∈Validt]
其中 Validt\text{Valid}_tValidt 是第 ttt 个参数位置允许出现的token集合,由JSON schema和已生成前缀共同决定。
在继续之前,我们先看看参数生成的一个关键难点:参数值可能来自问题文本,也可能来自之前的观察。例如,模型先查了北京天气,发现下雨,然后决定查"北京首都机场航班",这里的"北京"是从问题中继承的上下文,而"下雨"是上一轮观察。参数生成器必须能够跨轮引用历史信息。
这在实际使用中意味着:工具调用的决策边界不是简单的"用不用工具",而是一个涉及置信度估计、信息增益计算、结构化解码和跨轮引用的复合决策系统。模型必须同时扮演"策略师"(选哪个工具)、“翻译官”(把意图转为参数)和"档案员"(记住之前的观察)三个角色。
1.5 从语料中自学工具调用
1.5.1.1 自发挖掘与数据构造
现在我们已经了解了工具选择的决策机制,接下来看看模型如何学会这一切。ReAct需要大量"问题-推理-行动-观察"的轨迹数据,人工标注成本极高。Toolformer提出了一条更经济的路径:让模型从纯文本语料中自学何时需要工具。
核心思路是:给定一段普通文本,例如"法国首都的人口超过两百万",模型可以主动插入工具调用标记:
法国首都的人口超过<API>搜索引擎("法国首都人口")<API>两百万。
如果工具返回的结果与原文一致,说明这个工具调用是自洽的;如果不一致,说明原文可能过时或错误,工具调用提供了修正。通过这种方式,普通语料被自动转换为带工具调用的训练数据。
形式化地,对于语料中的每个位置 ttt,我们计算在该位置插入工具调用 τ\tauτ 后,模型对后续文本的困惑度变化:
Δτ,t=logPθ(wt+1:T∣w1:t)−logPθ(wt+1:T∣w1:t,τ,o) \Delta_{\tau,t} = \log P_\theta(w_{t+1:T}|w_{1:t}) - \log P_\theta(w_{t+1:T}|w_{1:t}, \tau, o) Δτ,t=logPθ(wt+1:T∣w1:t)−logPθ(wt+1:T∣w1:t,τ,o)
其中 ooo 是工具 τ\tauτ 的实际返回值。如果 Δτ,t>0\Delta_{\tau,t} > 0Δτ,t>0,说明工具调用降低了后续文本的预测难度,这个位置就是一个高质量的训练样本。
1.5.1.2 损失掩码与梯度隔离
Toolformer的训练有一个精巧的 trick:它不需要修改模型架构,只需要修改训练目标。在标准语言建模中,模型预测每一个位置的下一个token。Toolformer在包含工具调用的序列上训练时,对工具调用标记及其返回值施加损失掩码。
具体地,设序列 x=(x1,x2,…,xT)x = (x_1, x_2, \dots, x_T)x=(x1,x2,…,xT) 包含若干工具调用片段。损失函数为:
L=−∑t∈MlogPθ(xt∣x<t) \mathcal{L} = -\sum_{t \in \mathcal{M}} \log P_\theta(x_t | x_{<t}) L=−t∈M∑logPθ(xt∣x<t)
其中 M\mathcal{M}M 是非工具token的位置集合。这意味着:
- 模型学习根据上下文(包括之前的工具返回值)来预测普通文本
- 但模型不被要求预测工具调用标记本身,也不被要求预测工具返回值
这种梯度隔离的妙处在于:工具调用标记和观察值被当作"给定条件"而非"预测目标"。模型不会被迫去"背诵"工具应该怎么调用,而是学会把工具输出当作上下文信息来利用。当模型在实际使用中生成工具调用时,它是在采样而非预测,这给了系统更大的灵活性。
如果画成图会是什么样子?想象一块黑板,左边写着原始文本,中间插入了一块可擦写的便签(工具调用和返回值)。模型学习时,眼睛只看黑板上的固定文字,但余光会读取便签上的信息。模型不学习如何写便签,但学会了便签上的信息如何帮助理解黑板内容。到了测试时,模型突然拿起笔,自己开始在黑板上贴便签。
这在训练与实际使用中意味着:Toolformer的自举机制让工具学习摆脱了对昂贵人工标注的依赖。通过困惑度筛选和损失掩码,普通语料被转化为弱监督数据。模型在训练阶段把工具输出当作"特权信息"(只有输入侧能看到),在推理阶段则自己生成这些特权信息。这种从"阅读注释"到"自己写注释"的过渡,是工具学习能够规模化的关键。
1.6 系统架构与工程实现
1.6.1.1 知识图谱
现在我们已经走完了从动机到形式化、从ReAct循环到自学机制的完整路径。在收尾之前,我们先看看工具学习这个领域涉及的核心概念如何彼此连接。
1.6.1.2 总体结构图
1.6.1.3 各模块设计图
1.6.1.4 协同设计图
1.6.1.5 接口对接图
1.6.1.6 完整三层架构总览图
1.7 全章闭环
现在我们已经走完了从知识边界到POMDP建模、从ReAct循环收敛到工具选择决策、从自举训练到完整系统架构的完整路径。让我们把闭环收紧。
纯大模型被困在参数空间里,它的输出分布完全由训练数据决定,无法接触实时世界。工具学习通过在词表空间中引入外部动作标记,把封闭的自回归生成改造成了开放的控制回路。这个回路被严格建模为部分可观察马尔可夫决策过程:模型在每一步选择"继续生成"或"调用工具",工具返回值作为新的观察注入上下文,循环往复直到收敛。
ReAct循环的收敛性由两个条件保证:信息增益必须每轮递减,且行动空间有限。这相当于给模型设定了一个"任务预算",迫使它在有限轮数内高效收集信息。工具选择的决策边界则由置信度阈值和信息增益最大化共同刻画:模型只在不确定时调用工具,且优先选择能够最大程度降低答案熵的工具。
在数据层面,Toolformer通过困惑度筛选和损失掩码,让模型从普通语料中自学工具调用。工具调用标记和返回值被当作特权上下文而非预测目标,这种梯度隔离使得模型学会"利用工具信息"而非"背诵工具语法"。
这在训练与实际使用中意味着:当我们部署一个大模型到真实应用场景时,不应该期待它记住所有知识。相反,我们应该给它配备一套精心设计的工具库,并训练它掌握三项核心能力:判断自己何时无知、选择哪个工具能够填补无知、以及把工具返回的观察无缝整合到推理链条中。工具学习不是让模型变聪明,而是让模型学会承认自己不够聪明,并知道去哪里找答案。这种从"全知幻觉"到"自知之明"的转变,正是大模型从聊天机器人走向可靠智能体的关键一跃。
822



被折叠的 条评论
为什么被折叠?



