ToolLoop: Closed-Loop Tool-Use Data Synthesis via Decomposed Generation and Dynamic Self-Feedback
Min Zeng, Yuzhou Liu, Zhenyu Cao, Hanxiu Chen, Heng Li, Caiquan Liu, Yafei Wen, Xiaoxin Chen
EMNLP 2026 Main Conference
cs.CL
2026-09-09
vivo用三阶段闭环合成11K工具调用数据,微调4B模型BFCL达86.40%,数据量仅为APIGen的18.3%。
训练模型调用外部 API,最缺的是「用户说了什么 → 该调哪个函数、参数怎么填」对齐得好的样本。现成数据少,主流做法是让大模型一次性生成完整样本,再用规则或模型做事后过滤:过了就留,不过就扔。
这条流水线有三个硬伤。候选工具一多,一步生成很难同时选对工具、填对参数、还保证调用之间没有依赖。过滤是二元门,难样本更容易被扔掉,留下的数据会偏向短查询、简单 schema。中间步骤没有监督,查询和最终调用对不上,要到最后才被发现。
vivo AI Lab 的 ToolLoop 把合成拆成三步,每一步当场校验、当场改,最多重试三次。
校验不是打一个总分。语义靠 Qwen-Max 当 judge,格式和类型走确定性规则,tool call 再用 AST 抓括号不匹配这类会直接跑崩的错误。反馈会写明问题,把失败输出当负例塞回提示词。三轮还过不了才丢。
候选函数池从 ToolBench 和 BFCL 抽了 5281 个可执行 API,用 Qwen3-Embedding-8B 做 K-means,K=26,每簇大约 200 个同域工具,再由模型从同一簇里采样候选。这样候选集合语义相关,也塞得进上下文。覆盖四类单轮场景:Simple、Multiple、Parallel、Parallel Multiple。
基座是 Qwen3-4B-Instruct-2507,用 swift 训两轮、16k 上下文,评测强制非推理模式,直接吐 tool call。最终留下 11024 条:Simple 4453(40.4%)、Parallel 3634(33.0%)、Multiple 1783(16.2%)、Parallel Multiple 1154(10.5%)。去掉与 BFCL 候选函数重叠后的 Isolate 版是 10K。
| 方法 | 数据量 | BFCL Overall |
| Qwen3-4B 基座 | 无 | 82.14% |
| APIGen-4B | 60K | 83.11% |
| ToolMind-4B | 55K | 83.53% |
| Qwen3-32B | 无 | 85.39% |
| ToolLoop-4B-Isolate | 10K | 86.07% |
| ToolLoop-4B | 11K | 86.40% |
4B 超过同表里的 Qwen3-32B(85.39%)和 Claude-Opus-4-5(84.19%)。非 live 91.29%,比 APIGen-4B 的 89.90% 高 1.39 点;live 81.50%,比 APIGen-4B 的 76.31% 和 ToolMind-4B 的 77.57% 都高。Multiple 96.50%,Parallel Multiple 94.50%;Isolate 的 Multiple 到了 97.00%,总体只掉 0.33 点。
消融更说明问题。去掉反馈的生数据把 overall 打到 79.97%,比基座还低 2.17 点。事后过滤回到 82.56%,几乎没超过基座。闭环修正才拉到 86.40%。
ACEBench 上 ToolLoop-4B 总体 72.1%,Atom 84.0%,Similar API 78.0%,数据量是 APIGen 的 18.3%。Single Turn 66.5%,低于 ToolMind-4B 的 69.5%;Profile 60.0%,所有微调模型都低于基座的 64.0%。
合成开销:11024 条大约 3341 万 token。第二步最难修,18.1% 至少重试一次;需要两到三次重试的比例分别是第一步 1.72%、第二步 8.05%、第三步 4.25%。三轮仍失败的 280 条里,192 条卡在语义,83 条卡在规则,5 条两边都挂。人工抽 100 条,Qwen-Max 与人对齐 94%。
对做 function calling 微调的人,这篇给了一个很具体的操作结论:样本内部一致性比堆数量更值钱。11K 对齐过的数据,能压过 55K 到 60K 的 generate-then-filter 数据,也能压过同系列 32B 在非推理设置下的分数。
可复用的部分是流程,不是权重。先钉函数组合,再倒推查询、正推调用,每步用「模型语义 + 规则 + AST」修,比一次性生成再过滤更不容易把难样本丢掉。Isolate 只掉 0.33 点,说明这套流程学到的是选工具和填参,不完全是背评测函数名。
这仍是渐进改进。没有新的训练算法,也没有可执行环境。价值在数据工程:把合成从「生成完再筛」改成「边生成边修」。
作者自己写了两点。合成没有真实环境回执,超时、畸形响应、调用链级联失败都没覆盖;真实工具使用经常要根据执行结果多轮改调用,现有静态评测测不到。语义 verifier 全程是 Qwen-Max,100 条 94% 对齐只是 sanity check,排不掉模型自身的系统性偏好。
评测面也偏窄。四类场景都是单轮;Live Parallel Multiple 只有 24 条,ToolLoop 79.17% 低于 APIGen 的 83.33%,差 1 条,作者自己说做不成类别结论。ACEBench 的 Profile 在微调后全面掉点,说明这批数据没建模用户偏好,硬训会伤个性化选工具。候选 API 本来就抽自 ToolBench 和 BFCL,Isolate 去掉了函数名重叠,域相近的泄漏仍可能在。代码和 11K 数据是否开源,论文里没给仓库。