Act Wisely: Cultivating Meta-Cognitive Tool Use in Agentic Multimodal Models

Paper: arXiv:2604.08545 Code: Accio-Lab/Metis Code reference: main @ 84fd45e7 (2026-04-10)

1. Motivation (研究动机)

这篇论文关注的不是“模型会不会调用工具”,而是“模型知不知道什么时候不该调用工具”。作者把这个问题称为 agentic multimodal models 的 meta-cognitive deficit;HDPO 的核心机制也可概括为 conditional advantage over correct trajectories:模型虽然已经能调用 Python、image search、text search、crop/zoom 等外部环境,但缺少对自身能力、视觉上下文充分性、外部工具必要性的校准能力。因此它们常出现 blind tool invocation:即使答案可直接从原图、内部知识或简单视觉理解得到,也会反射式地调用工具。

Figure 1 解读:这张图对比了现有 tool-use agent 的“工具调用率”和任务性能。论文要强调的现象是:高工具调用率不等于高准确率;相反,过度调用工具会带来串行 API 延迟、额外环境噪声和错误观察,可能把原本可靠的推理轨迹带偏。Metis 的目标是在保持甚至提升准确率的同时,把冗余工具调用压到接近零。

当前方法的核心瓶颈有三层:

  • 行为层面:许多 multimodal agent 把“有工具可用”误学成“默认调用工具”,没有判断 raw visual context 是否已经足够。
  • 优化层面:常见做法把答案准确率和工具惩罚写成一个 scalarized reward,例如 。如果 太大,模型会过度保守,在真正需要工具的困难样本上也不调用;如果 太小,工具效率信号会在 GRPO 的 advantage normalization 中被准确率方差洗掉。
  • 数据层面:已有 tool-augmented SFT 轨迹可能包含不可执行代码、幻觉工具反馈、或由弱模型标注导致的“过时工具依赖”。这些轨迹会把模型训练成依赖工具,而不是训练成会判断工具是否必要。

研究这个问题的价值在于:真实 agent 部署中,工具调用通常是串行、高延迟、可失败的外部交互;如果模型能学会 abstention,它不仅更快,也更鲁棒。论文的核心主张是:执行效率不是准确率的敌人;去掉噪声性、冗余性工具调用,反而能提升最终推理质量。

2. Idea (核心思想)

核心洞察:工具效率不应该作为一个和准确率抢梯度的标量惩罚,而应该是一个只在“答案已经正确”的轨迹内部比较的条件目标。 也就是说,先让模型学会答对,再在答对的轨迹之间学习谁更节省工具。

论文提出 Hierarchical Decoupled Policy Optimization (HDPO):把优化拆成两个正交通道。accuracy channel 对所有 rollout 做标准 GRPO,最大化答案正确性与格式合规;efficiency channel 只在正确 rollout 构成的 qualifying set 内做条件 advantage 估计,奖励更少工具调用。最后在 loss 层面组合两个 surrogate loss,而不是在 reward 层面先混合。

Figure 2 解读:上半部分表示 coupled reward:准确率和工具效率先被压成一个混合 reward,再归一化成一个 advantage,导致小的效率项被准确率方差淹没。下半部分表示 HDPO: 分别归一化,直到最终 loss 才通过 加权组合。因此“答对”和“少用工具”各自有清晰的 credit assignment。

和标准 GRPO 或带工具惩罚的 agent RL 相比,HDPO 的差异不是换一个惩罚权重,而是改变比较对象:标准 GRPO 比较所有 rollout 的混合分数;HDPO 的工具效率只比较同一 prompt 下已经答对的 rollout。这避免了一个错误但零工具调用的轨迹被奖励,也避免了不同问题之间工具需求不同导致的 cross-prompt baseline 污染。

3. Method (方法)

Overall framework: Metis agent + HDPO

Figure 3 解读:Metis 是一个多轮 multimodal reasoning agent。输入是图像与问题;模型先在 <reason> 中判断是否需要外部帮助,然后可以调用 Python code execution、text search、image search 等工具,也可以直接输出 <answer>。方法的关键不在“接入更多工具”,而在训练策略:通过 SFT 清理高质量工具轨迹,再用 HDPO 在 RL 阶段把正确性与工具节制分开优化。

直觉上,HDPO 有点像给 agent 设定一条学习顺序:早期模型经常答错,此时正确 rollout 很少,efficiency channel 基本不给梯度,训练主要推动“先答对”;当模型逐渐能答对同一 prompt 的多个 rollout 后,qualifying set 变大,efficiency channel 才开始比较这些正确解法中谁更少调用工具。这种 implicit curriculum 不需要手动调度 ,由条件 advantage 自动产生。

3.1 Coupled reward 为什么失败

设同一 prompt 下采样 个多轮轨迹 ,第 个轨迹包含 次工具交互。传统方式会把准确率和工具效率混成一个 reward: 再对同组 rollout 做标准化: 为 centered rewards,则混合 advantage 展开为: 很小时,一阶近似为: 这说明工具效率的梯度贡献会以 被压低,且 denominator 主要由 accuracy variance 主导。语义上也有歧义:一个错误但没调用工具的轨迹,可能和一个正确但调用很多工具的轨迹得到相近混合分数;这样 policy gradient 不知道到底该学“答对”还是“少动”。

3.2 Dual reward design

HDPO 先定义两个独立 reward,而不是先混合: 其中 来自 LLM judge 的答案正确性, 表示输出格式是否合规;论文和 released code 都使用 。accuracy advantage 对所有 个 rollout 标准化: 工具效率 reward 则明确条件化在正确答案上: 这里 时 reward 为 时为 ,随工具调用次数单调下降。关键是:错误轨迹无论是否少用工具,都不能获得效率奖励。

3.3 Conditional advantage estimation

HDPO 定义同一 prompt 内的正确轨迹集合: 工具 advantage 只在 内比较: 如果正确 rollout 少于 2 个,则没有有意义的“正确解法之间效率比较”,工具 advantage 设为 0。这样避免把不同 prompt 的工具需求强行放到同一个 baseline 下,也避免奖励错误但“动作少”的轨迹。

3.4 Hierarchical policy update

最终 loss 在 loss 层面组合两个 clipped surrogate: Released code 中,examples/train/train_metis.sh 设置 algorithm.adv_estimator=hdpoactor_rollout_ref.actor.w_acc=1.0actor_rollout_ref.actor.w_tool=$W_TOOL,默认 W_TOOL=0.15verl_tool/workers/hdpo_actor.py 分别用 advantagestool_advantages 计算 loss_accloss_tool,再执行 pg_loss = w_acc * loss_acc + w_tool * loss_tool

论文公式与 released code 实现差异:核心公式基本一致;但 verl_tool/trainer/ppo/hdpo_algos.py 的注释写着 qualifying sample 是 “correct answer AND used tools”,而实际实现是对 tool_reward_tensor.sum(dim=-1)>0 的样本建组。由于 MetisRewardManager 对正确且 的轨迹赋 ,实际代码仍会把“正确且零工具”的轨迹纳入工具效率比较,这与论文中 的定义一致;差异主要是代码注释表述不严谨。

3.5 Data curation and system prompt

SFT 数据来自 DeepEyesV2、V-Interaction、Thyme 等公开 tool-augmented multimodal trajectories,并额外加入 OpenMMReasoner 的 tool-free reasoning 数据以保留内部推理能力。清洗分三步:执行代码并删除非可执行/幻觉反馈轨迹;用 Qwen3-VL-8B direct reasoning 过滤 pass@8=1 的样本,避免把已经能直接答对的问题继续训练成“必须用工具”;用 Gemini-3.1-Pro 从 visual relevance、reasoning coherence、tool-use rationale 等维度过滤低质量轨迹,显式惩罚 blind tool invocation。

RL prompt set 来自 V-Interaction、Thyme、SenseNova-MARS、DeepEyesV2。作者用 rollout 做 difficulty calibration,只保留 的样本,保证同一 prompt 内既有成功也有失败,能产生非零方差 advantage。最终 RL 训练集约 5K prompts,类型比例为 perception 45%、search-oriented 36%、math/general reasoning 19%。

系统提示明确要求模型先在 <reason> 中判断,再选择直接回答或调用 <tool_call>;可用工具包括 Python code execution、text search、image search。提示中还强调 “Use tools ONLY when they provide clear value that reasoning alone cannot”,这与 HDPO 的训练目标一致:工具是精密仪器,不是默认反射。

3.6 Pseudocode grounded in released code

import torch
import torch.nn.functional as F
 
 
def compute_metis_rewards(answer_score, format_score, num_turns):
    """Based on verl_tool/workers/reward_manager/metis.py."""
    accuracy_reward = 0.9 * answer_score + 0.1 * format_score
    if answer_score > 0:
        tool_reward = 1.0 / (num_turns + 1)
    else:
        tool_reward = 0.0
    return accuracy_reward, tool_reward
 
 
def conditional_tool_advantage(tool_rewards, prompt_uid, response_mask, eps=1e-6):
    """Based on verl_tool/trainer/ppo/hdpo_algos.py."""
    # tool_rewards: [batch], already 0 for incorrect trajectories
    advantages = torch.zeros_like(tool_rewards)
    for uid in torch.unique(prompt_uid):
        group = (prompt_uid == uid)
        qualifying = group & (tool_rewards > 0)
        if qualifying.sum() >= 2:
            scores = tool_rewards[qualifying]
            normed = (scores - scores.mean()) / (scores.std() + eps)
            advantages[qualifying] = normed
    return advantages[:, None] * response_mask
 
def hdpo_advantages(acc_token_rewards, tool_token_rewards, prompt_uid, response_mask):
    """Accuracy GRPO over all samples; tool GRPO only over correct samples."""
    acc_scores = acc_token_rewards.sum(dim=-1)
    tool_scores = tool_token_rewards.sum(dim=-1)
    acc_adv = torch.zeros_like(acc_scores)
    for uid in torch.unique(prompt_uid):
        group = (prompt_uid == uid)
        scores = acc_scores[group]
        acc_adv[group] = (scores - scores.mean()) / (scores.std() + 1e-6)
    acc_adv = acc_adv[:, None] * response_mask
    tool_adv = conditional_tool_advantage(tool_scores, prompt_uid, response_mask)
    return {"acc_advantages": acc_adv, "tool_advantages": tool_adv}
 
 
def hdpo_policy_loss(policy_loss_fn, old_logp, logp, response_mask, acc_adv, tool_adv,
                     w_acc=1.0, w_tool=0.15):
    """Based on verl_tool/workers/hdpo_actor.py."""
    loss_acc = policy_loss_fn(old_logp=old_logp, log_prob=logp,
                              advantages=acc_adv, response_mask=response_mask)
    tool_has_signal = (tool_adv != 0).any(dim=-1, keepdim=True)
    tool_mask = response_mask * tool_has_signal.float()
    if tool_mask.sum() == 0:
        tool_mask = response_mask
    loss_tool = policy_loss_fn(old_logp=old_logp, log_prob=logp,
                               advantages=tool_adv, response_mask=tool_mask)
    return w_acc * loss_acc + w_tool * loss_tool

Code reference: main @ 84fd45e7 (2026-04-10) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
Metis RL launch/configexamples/train/train_metis.shalgorithm.adv_estimator=hdpo, W_TOOL, rollout/training hyperparameters
Accuracy/tool rewardverl_tool/workers/reward_manager/metis.pyformat_reward, answer_reward, MetisRewardManager.__call__
Conditional advantageverl_tool/trainer/ppo/hdpo_algos.pycompute_grpo_conditional_advantage, compute_hdpo_advantage, hdpo_compute_advantage
Dual-loss updateverl_tool/workers/hdpo_actor.pyHDPODataParallelPPOActor.update_policy
HDPO worker wiringverl_tool/workers/hdpo_fsdp_worker.py and verl_tool/trainer/main_ppo.pyHDPOActorRolloutRefWorker, HDPOAsyncActorRolloutRefWorker
Tool environmentverl_tool/servers/tools/metis.py, metis_code.py, examples/train/start_tool_server.shPython/text-search/image-search handlers and tool-server startup

4. Experimental Setup (实验设置)

Training datasets and scale

  • SFT:DeepEyesV2、V-Interaction、Thyme 的 tool-augmented multimodal trajectories;另加入 OpenMMReasoner 的 tool-free reasoning 数据。论文未详细说明 SFT 总样本数。
  • RL:V-Interaction、Thyme、SenseNova-MARS、DeepEyesV2 的 prompts,经 image/question consistency 检查与 过滤后保留约 5K high-quality prompts;比例为 perception 45%、search-oriented 36%、math/general reasoning 19%。
  • Evaluation:perception/document benchmarks 包括 V*Bench、HRBench-4K/8K、TreeBench、MME-RealWorld、SEEDBench2-Plus、CharXiv(DQ/RQ);math/logical benchmarks 包括 MathVista、MathVerse、WeMath、DynaMath、LogicVista。论文没有逐一列出这些 benchmark 的样本规模。

Baselines and metrics

基线分三类:open-source models without tool use(LLaVA-OneVision、InternVL3-8B、Qwen2.5-VL-7B/32B-Instruct、Qwen3-VL-8B-Instruct),text-only reasoning models(MM-Eureka、ThinkLite-VL、VL-Rethinker、VLAA-Thinker),agentic multimodal models(Pixel-Reasoner、DeepEyes、Thyme、DeepEyesV2、Mini-o3、SenseNova-MARS-8B、Skywork-R1V4-30B-A3B)。

主要指标是各 benchmark 的 accuracy/score(表中以百分数报告),以及 Figure 1 中用于刻画执行经济性的 tool invocation rate。tool invocation rate 越低表示 agent 越能在不需要外部帮助时直接回答。

Training config

论文报告使用 Qwen3-VL-8B-Instruct 作为 backbone,先 SFT 再 HDPO RL;实验硬件为 8 NVIDIA Blackwell B200 GPUs。SFT 阶段论文给出:2 epochs、AdamW、cosine LR decay、peak LR 、global batch size 128。released repo 未提供专门的 Metis SFT launch script,因此这些 SFT 数字按论文记录。

RL 阶段的 code-grounded 配置来自 examples/train/train_metis.sh

  • Parallelism / batchn_gpus_per_node=8n=16 rollouts per prompt;batch_size=16*num_nodes*n_gpus_per_node,单节点即 128;ppo_mini_batch_size=8*num_nodes*n_gpus_per_node,单节点即 64。
  • Lengths / turnsmax_prompt_length=24576max_response_length=16384max_action_length=16384max_obs_length=8192actor_rollout_ref.agent.max_turns=10
  • Optimizationactor_rollout_ref.actor.optim.lr=1e-6algorithm.kl_ctrl.kl_coef=0actor_rollout_ref.actor.kl_loss_coef=0.0w_acc=1.0,default w_tool=0.15
  • Rollout/tool system:vLLM rollout,temperature=1.0top_p=1.0top_k=-1actor_rollout_ref.rollout.n=$nmax_concurrent_trajectories=256,tool server from examples/train/start_tool_server.sh

5. Experimental Results (实验结果)

Main benchmark results

Perception/document understanding 上,Metis 的主要结果如下:

ModelV* BenchHR4KHR8KTreeBenchMME RealWorldSEED2 PLUSCharXiv(DQ)CharXiv(RQ)
Qwen3-VL-8B-Instruct86.478.974.640.761.971.083.046.3
DeepEyesV281.877.973.842.564.970.578.648.9
SenseNova-MARS-8B92.283.178.4-67.9---
Skywork-R1V4-30B-A3B88.082.879.8-71.4---
Metis91.183.582.045.270.372.583.454.1

Math/logical reasoning 上,Metis 的结果如下:

ModelMathVistaMathVerseWeMathDynaMathLogicVistaAvg.
Qwen3-VL-8B-Instruct76.361.338.865.554.959.4
DeepEyes70.147.338.955.047.751.8
DeepEyesV271.952.738.157.248.753.7
Metis78.065.965.269.256.266.9

最显著的是 WeMath:Metis 从 backbone 的 38.8 提升到 65.2,绝对提升 +26.4;这支持作者的论点:工具不是越多越好,但当任务确实需要计算或局部视觉放大时,策略性工具调用能显著提升复杂推理。

Ablation: decoupling and

MethodV* BenchHRBench4KHRBench8KCharXiv(RQ)MathVista
Qwen3-VL-8B-Instruct86.478.974.646.376.3
+ standard GRPO ()88.781.079.251.076.9
+ HDPO ()88.083.581.052.777.4
+ HDPO ()91.183.582.054.178.0
+ HDPO ()87.482.580.551.577.2

相对 standard GRPO, 的 HDPO 在 V* Bench、HRBench8K、CharXiv(RQ) 上分别提升 +2.4、+2.8、+3.1。 说明效率信号偏弱; 则开始损害所有 benchmark,说明过度强调工具节制会抑制必要探索。最佳点呈 inverted-U,论文选择 0.15 作为默认。

Qualitative tool arbitration

Figure 4 解读:该例展示“直接从视觉上下文回答”。问题可以通过图像内容和常识直接解决,Metis 没有调用工具。这是 HDPO 希望学到的 abstention:当内部能力和原始视觉证据足够时,直接回答比调用工具更快、更少噪声。

Figure 5 解读:该例展示“目标明确的 code execution”。问题要求比较某个子图局部曲线,原图尺度下不易看清;Metis 调用 Python 对相关区域 crop/zoom,再据此回答。这里工具调用不是默认动作,而是因为原始视觉分辨率不足而被触发。

Figure 6 解读:附录的直接视觉阅读案例进一步说明,若屏幕文字在原图中已经清晰可读,Metis 会直接抽取答案,不调用 code/search。这验证了模型并非“不会用工具”,而是学会了在证据充分时不使用工具。

Figure 7 解读:该例需要识别艺术品并查询完成年份,视觉特征本身不足以可靠得出事实答案,因此 Metis 触发 image search。它体现的是 epistemic uncertainty calibration:模型知道“我需要外部视觉检索证据”。

Figure 8 解读:该例中地标/建筑物或许可以从图像识别出来,但询问的是 cella width 这类无法由图像直接推断的事实数值,因此 Metis 使用 text search。这和 Figure 7 构成互补:一个是视觉识别缺口,一个是事实知识缺口。

Limitations and conclusion

论文没有给出很长的 limitations 列表,只在结论中指出未来工作会把 meta-cognitive framework 扩展到更开放、长时域环境。结合方法本身,可以看到几个实际边界:HDPO 依赖可靠的 answer judge 与格式 reward;工具效率只在正确 rollout 内比较,因此需要足够的 rollout 数和合适难度样本;对于真正需要多步检索/长期规划的开放环境, 的简单倒数奖励可能不足以表达复杂成本结构。

总体结论是:Metis/HDPO 证明了“少调用工具”不是牺牲能力,而是在训练目标正确设计时可以成为提升准确率的催化剂。它把 tool-use agent 的目标从“会执行工具”推进到“知道何时 abstain”。