OpenSearch-VL: An Open Recipe for Frontier Multimodal Search Agents
Paper: arXiv:2605.05185 Code: shawn0728/OpenSearch-VL Code reference:
main@236e0e07(2026-05-19)
1. Motivation(研究动机)
1.1 这篇论文要解决什么问题?
论文关注的是“多模态搜索代理”(multimodal search agent),不是普通 VQA,也不是只把网页检索结果拼给 VLM 的 RAG。 目标场景是知识密集型视觉问答:输入包含图像和问题,答案往往需要先理解图像实体,再跨网页、百科、搜索结果和图像局部证据进行多跳验证。 典型例子不是“图片里是什么”,而是“图片里的这座建筑所在城市的某个历史事件是什么”这类视觉锚点加外部知识链。 这类任务的困难点在于,视觉感知错误、搜索 query 错误、网页证据误读和最终答案格式错误会在一条长 trajectory 内相互放大。 直接推理模型可以依赖参数知识,但在长尾实体、实时网页、局部图像文本和跨语言实体上很容易过拟合或幻觉。 文本 RAG 可以补充外部知识,但如果模型没有能力主动裁剪、增强、OCR、图搜和改写 query,它仍然不知道应该检索什么。 现有 web-search agent 的工具集大多以文本检索为中心,对图像局部、低清文字、透视畸变和图像反搜支持不足。 现有视觉代理工作往往只给出模型权重或 demo,不给出完整数据构造、轨迹合成、SFT、RL 和评测代码。 因此 OpenSearch-VL 的核心诉求是给出一套“可复现的开放配方”,让多模态搜索代理从数据到 RL 训练都有公开实现。
1.2 为什么普通 VLM + 检索不够?
视觉输入通常只提供一个 anchor,例如人、建筑、艺术品、地标、商品或截图。 如果 anchor 没有被正确识别,后续搜索 query 会从第一步开始偏离。 如果 anchor 被识别但网页证据不可靠,模型需要继续搜索和交叉验证,而不是接受第一个搜索摘要。 如果图片里包含小字、表格、地图或公告,模型需要先 crop、OCR、布局解析或超分辨率,再把局部证据接入搜索链。 如果问题要求多跳推理,模型需要把前一轮工具观察转化为下一轮 query,而不是一次性生成答案。 这些行为都要求模型学习“何时用什么工具”和“如何根据 observation 修正后续行为”。 论文把这一点表述为 real tool environment 中的多轮 ReAct 轨迹,而非静态检索增强。 这也解释了为什么训练数据不能只用单轮 QA 对:模型需要看到工具调用、观察文本、新图像和最终答案之间的结构化对齐。
1.3 旧方法的三类复现瓶颈
第一类瓶颈是数据闭源:很多代理论文只报告最终 benchmark 分数,不公开问题构造、过滤器、轨迹合成和 rejection sampling 流程。 第二类瓶颈是工具环境不完整:训练时如果只模拟文本搜索,部署时再接入视觉工具,策略会出现训练-推理不一致。 第三类瓶颈是 RL 对坏轨迹过度惩罚:一条 trajectory 后半段发生连续工具错误时,简单 hard mask 会浪费前半段有效推理。 论文特别强调 fatal trajectory 并不等于全程无价值。 一个代理可能先正确识别图像、找到有效网页、提出合理中间结论,但后续某个 tool call JSON 错误导致环境报错。 如果训练把整条 trajectory 丢掉,模型学不到前缀里正确的搜索策略。 如果训练把整条 trajectory 当作普通负样本,模型又会被迫压低前缀中本来合理的 token。 OpenSearch-VL 的 fatal-aware GRPO 就是针对这个信用分配问题设计的。
1.4 为什么需要“开放配方”而不是只发模型?
论文标题中的 Open Recipe 不是营销词,而是它的主要贡献边界。 开源仓库给出三部分:SFT、RL 和 opensearch_vl inference/evaluation。 SFT 部分对应 LLaMA-Factory 风格的全参微调配置。 RL 部分对应基于 verl/RLLM 的 multi-turn workflow、reward、mask 和 trainer。 推理部分对应真实工具 dispatcher、trajectory serialization 和 benchmark rollout/eval。 对于研究者,开放配方的价值在于可以替换工具、替换 judge、替换数据源并观察是哪一环带来收益。 对于工程复现,开放配方的价值在于不需要从论文伪代码猜测 actor rollout、token mask、工具异常和 batch 过滤如何实现。 对于后续工作,OpenSearch-VL 提供了一个 multimodal search-agent baseline,可用于比较新的工具、奖励、数据过滤和长链路 RL 算法。
1.5 与相邻方向的区别
与通用 VLM 不同,OpenSearch-VL 的能力重点不是单次图文理解,而是搜索、观察、再搜索的闭环。 与文本 web agent 不同,它的工具空间包含图像局部处理和视觉检索。 与普通 multimodal RAG 不同,它不是先检索再回答,而是让模型在多轮中决定检索路径。 与 Vision-DeepResearch 一类 hard-mask 训练不同,它保留 fatal trajectory 的有效前缀,并通过 one-sided clamping 避免负优势压制前缀。 与纯 SFT agent 不同,它在 SFT 初始化后继续用真实环境采样的 rollouts 做 GRPO。 与只发 checkpoint 的工作不同,它把 data pipeline、training pipeline、inference pipeline 和 evaluation protocol 放到同一 repo。
1.6 读这篇论文时应抓住的主线
主线一:数据如何构造得“必须使用工具”,而不是被 VLM 靠内部知识直接答出。 主线二:工具环境如何覆盖图像、文本和网页证据,而不是只做关键词搜索。 主线三:RL 如何在长链路工具错误存在时保留有效训练信号。 主线四:实验收益是否来自 agentic loop、数据合成、fatal-aware mask 还是模型规模。 主线五:代码实现是否真的支持论文里的 token mask、fatal detection 和 tool-produced images 回灌。
2. Idea(核心思想)
2.1 一句话核心贡献
OpenSearch-VL 的核心思想是:用可控的数据管线生成“必须多轮用工具”的视觉问答,再在真实多模态工具环境中先 SFT 学会轨迹格式,后用 fatal-aware GRPO 学会更好的搜索策略。 它不是发明一个新 VLM backbone,而是把数据、工具、reward、mask 和 evaluation 组合成一个可复现 agentic training recipe。 论文真正新的地方在于把多模态工具链上的失败轨迹拆成“可学习前缀”和“应屏蔽后缀”,而不是整条丢弃或整条惩罚。
2.2 数据侧直觉
如果训练集里的问题可以靠参数知识直接回答,代理就不会学会主动搜索。 如果问题只需要一次 image search,代理也不会学会多跳 query 改写和证据交叉验证。 所以论文从 Wikipedia hyperlink graph 采样多跳路径,把源实体作为视觉 anchor,并用自动过滤排除太容易的样本。 这种设计让初始图片只提供起点,答案则位于路径后段或外部证据中。 模型必须先识别图像锚点,再把锚点转成文本 query,再沿着实体关系搜索到答案。 论文还混入 LiveVQA、FVQA、WebQA 等数据,避免只覆盖百科路径上的人工模式。 对视觉工具训练,论文构造了 degradation/enhancement 子集,让模型意识到 crop、OCR、超分和透视矫正有时是必要步骤。 直觉上,这是把“看图回答”转成“看图寻找问题入口,再通过工具补全证据链”。
2.3 工具侧直觉
一个 frontier multimodal search agent 不应该只有 web_search。 它需要 image_search 来从视觉 anchor 反查实体。 它需要 text_search 或 web search 来扩展事实链。 它需要 crop 来把小目标从复杂图像中隔离出来。 它需要 layout_parsing 或 OCR 来解析海报、表格、截图、文档和标牌。 它需要 perspective_correct 来处理斜拍文本。 它需要 super_resolution、sharpen 等增强工具来处理低清局部。 这些工具不是后处理插件,而是写进系统 prompt、轨迹和 RL 环境的动作空间。 因此策略学习的对象是“什么时候调用工具、传什么参数、如何消费 observation”,而不是单纯提高视觉 encoder。
2.4 RL 侧直觉
多轮工具调用的 reward 天然稀疏:最终答案正确与否只能告诉模型整条链路是否成功。 但只用过程 reward 也有风险,因为模型可能学会看似勤奋的搜索而不关心最终答案。 OpenSearch-VL 采用组合 reward:格式 reward 约束轨迹结构,answer reward 约束终点正确性,query/process reward 鼓励有效搜索。 论文给出的组合形式是 r(τ)=r_fmt(τ)·[α r_acc(τ)+(1−α) r_query(τ)],其中 α=0.8。 这个乘法结构意味着格式错误会直接压低整条 trajectory 的有效 reward。 r_acc 负责结果,r_query 负责过程,r_fmt 负责轨迹语法。 直觉上,模型既不能只会格式,也不能只会搜索,更不能只会猜答案。
2.5 fatal-aware 的核心 insight
工具调用环境中最常见的坏轨迹不是“全程错误”,而是“前缀合理,后缀崩掉”。 fatal-aware masking 先找到连续工具执行错误开始的位置。 论文定义 fatal step index f_i 为第一次出现 K=3 个连续工具执行错误的起点;如果没有 fatal cascade,则 f_i=L_i+1。 token mask 只保留 s(t)<f_i 的生成 token,其中 s(t) 是 token 所属 step。 这样模型仍然从 fatal 前的有效搜索行为中学习。 但只做 mask 还不够,因为 fatal trajectory 仍参与 group normalization。 如果 fatal trajectory 的标准化 reward 低于组均值,负 advantage 会压制有效前缀。 one-sided clamping 对 fatal trajectory 使用 max(\tilde r_i,0),使其不会给可学习前缀施加负梯度。 这就是论文相对于 hard masking 的关键算法设计。
2.6 为什么这个 idea 合理?
它符合工具代理的错误结构:工具异常通常是局部事件,而不是整条历史都错。 它符合 GRPO 的相对比较机制:同一 prompt 下多条 rollout 共享 group statistics,但 fatal 前缀不该被负优势抑制。 它符合 agentic exploration 的需求:如果所有长链路失败都被强惩罚,策略会学会少用工具、少探索、早答题。 它也符合工程复现需求:fatal step 可以从真实环境错误日志和 step 序列中检测,而不依赖人工标注。 所以这篇论文不是简单把 GRPO 套到 VQA,而是专门处理 multi-turn multimodal tool-use 的训练病灶。
3. Method(方法)
3.1 总体框架

Figure 1 解读:数据管线先构造工具需求强的 VQA,再合成专家轨迹;重点不是扩大 QA 数量,而是控制样本必须经过视觉锚点、外部检索和多轮验证。
方法由三条管线组成:数据管线、训练管线和推理评测管线。 数据管线负责产生 high-quality VQA 和 expert trajectories。 训练管线先执行 SFT,再执行 fatal-aware GRPO。 推理评测管线把模型接入相同工具环境,输出每个样本的 trajectory JSON。 论文把工具环境记为 𝔈,动作空间记为工具集合 𝒯。 每条 trajectory 包含历史 h_l、动作 a_l、工具 observation o_l 和最终 answer。 这种形式与 ReAct 一致,但 observation 可以包含文本和新图像。 代码中推理端由 opensearch_vl/opensearch_infer/pipeline.py 管理多轮 loop。 代码中训练端由 RL/rllm/vision_deepresearch_async_workflow/deepresearch_workflow.py 和 RLLM engine/trainer 管理 rollout、reward 和 mask。
3.2 高质量 VQA 构造
数据构造第一步从 Wikipedia hyperlink graph 采样多跳路径。路径起点实体 v0 被作为视觉 anchor。问题中的 source entity 会被替换成视觉指代,例如“图中的人”或“图片里的建筑”。这样问题无法只靠文本题面直接定位答案。路径后段关系提供需要搜索的中间事实。论文使用 entity rewriting 和 answer obfuscation 减少模板化捷径。图像从 Wikimedia Commons 或 Wikipedia infobox 检索。候选图片用 CLIP similarity 与实体描述过滤。这一步确保图片确实能指向 anchor,而不是无关配图。
自动检查包括 masking、uniqueness 和 visual-grounding validity。如果同一个问题存在多个兼容答案,样本会被过滤。如果视觉 anchor 太接近答案实体,样本也会被过滤,以减少单跳 shortcut。论文还合并 LiveVQA、FVQA、WebQA 等来源,以覆盖实时事实、常识事实和 open-web 多跳。这些来源的共同作用是扩大分布,而不是只训练百科风格问题。随后使用 frozen Qwen3-VL-32B 做两阶段难度过滤。第一阶段丢弃不使用工具也能答对的样本。第二阶段丢弃一次 ImageSearch 就能答对的样本。剩余样本更可能需要多轮搜索、视觉工具和外部证据。
3.3 视觉增强与工具需求样本
论文的增强子集关注 think-with-image 行为。 这类样本通过图像退化和工具恢复来制造必要的视觉处理步骤。 典型退化包括低清、模糊、局部小字、透视或布局复杂。 代理不能直接从全图读出答案,而需要调用 crop、OCR、super-resolution 或 perspective correction。 这种设计让工具使用不只是网页检索,也包含图像预处理。 代码工具 schema 中 crop 明确要求目标区域小于图像 30% 或有多个区域需要分析。 layout_parsing 面向结构化文本、表格和复杂文档。 image_search 用于图像或局部图像反搜。 text_search 用于关键词和实体检索。 super_resolution、sharpen 和 perspective_correct 用于提升局部可读性。 因此训练轨迹中的工具选择可以覆盖从视觉定位到网页证据收集的完整链路。

Figure 示例解读:这类样本要求模型先把视觉目标转成可搜索实体,再通过外部证据链得到最终事实;它体现了“视觉锚点 + 文本多跳”的数据构造目标。
3.4 多轮专家轨迹合成
论文对通过过滤的 (I,q,a) 样本合成 expert trajectories。 Expert model 是 Claude Opus 4.6。 每个 instance 采样 K=5 条独立 rollout。 每条 rollout 在真实工具环境 𝔈 中运行,而不是离线构造伪 observation。 轨迹格式是多轮 ReAct,模型可以自由调用 𝒯 中任一工具。 第一阶段 rejection sampling 用 GPT-4o judge 判定最终答案是否与 ground truth 一致。 第二阶段用 GPT-5.4 process-level judge 评估工具使用、逻辑一致性和是否存在无效重复。 过程 judge 与 RL 中的 r_query 使用同一类四维 rubric。 最终得到 36,592 条高质量专家轨迹。 这些轨迹平均包含 6.3 次 tool invocation。 这些专家轨迹构成 SFT 语料。 关键点是:SFT 学到的不是答案映射,而是多轮工具语法、观察消费和证据链组织。
3.5 SFT 阶段
SFT 目标是把基础 Qwen3-VL 变成会遵循 agent prompt 和工具格式的模型。公开配置位于 SFT/examples/agentic_full/。三个 Qwen3-VL 配置分别覆盖 8B、30B-A3B 和 32B。qwen3_vl_full_sft_8b_ray.yaml 使用 Qwen/Qwen3-VL-8B-Instruct。qwen3_vl_full_sft_30_3b_ray.yaml 使用 Qwen/Qwen3-VL-30B-A3B-Instruct。qwen3_vl_full_sft_32b_ray.yaml 使用 Qwen/Qwen3-VL-32B-Instruct。
这些配置采用 full finetuning。Deepspeed 配置为 examples/deepspeed/ds_z3_config.json。数据集字段包含 new_fvqa_agent_sft、palace_agent_sft、webqa_agent_sft、livevqa_agent_sft、wikiart_agent_sft、wiki_zh_agent_sft 和 wiki_en_agent_sft。模板为 qwen3_vl。cutoff_len 为 32,000。per_device_train_batch_size 为 1。gradient_accumulation_steps 为 1。
learning_rate 为 2.0e-5。num_train_epochs 为 8。lr_scheduler_type 为 cosine。bf16 为 true。这些数值来自公开 SFT YAML,而不是 README 默认值。
3.6 RL 阶段:multi-turn fatal-aware GRPO
Figure 2 解读:RL 从 SFT 模型出发,在真实工具环境中为同一 prompt 采样多条 trajectory,并同时使用最终答案、搜索过程和格式检查作为 reward;fatal-aware mask 负责保留可学习前缀。
RL 训练基于 GRPO。 对每个 prompt (I0,q) 采样一组 G 条多轮 rollout。 每条 rollout 与环境 𝔈 交互,因此 observation 由真实工具执行产生。 论文把 rollout 写作 τ_i ~ π_{θ_old}(·|I0,q) ⊗ 𝔈。 Reward 是 trajectory-level,而不是逐 token 标注。 组合 reward 为 r(τ)=r_fmt(τ)·[α r_acc(τ)+(1−α) r_query(τ)]。 权重 α=0.8。 r_acc 由 GPT-4o judge 比较最终答案与参考答案。 r_query 由 process-level judge 评估搜索路径质量。 r_fmt 是确定性格式检查,用于约束 <think>、<tool_call>、<observation> 和最终 answer 的结构。 乘上 r_fmt 的设计会惩罚格式崩溃,即使最终答案看似正确。 这对真实工具环境很重要,因为格式错误会导致工具无法解析。
3.7 fatal step index 与 token mask
fatal-aware 部分先定义 fatal step index。 对 trajectory τ_i,f_i 是第一次出现 K=3 个连续工具执行错误的起点。 如果没有连续错误,则 f_i=L_i+1。 token mask 只保留 s(t)<f_i 的生成 token。 论文中的 mask 形式是 M(y_{i,t}) = M_gen(y_{i,t}) · 𝟙[s(t)<f_i]。 M_gen 是原始 generation mask。 s(t) 把 token index 映射到第几个 agent step。 r_fmt 和 r_query 也只在 valid prefix 上计算。 这样 fatal 之后的结构崩溃不会污染 process reward。 但 fatal 之前的有效识别、搜索和证据整合仍然可以训练。 这与 hard mask 丢弃全轨迹不同。 它也与 blind training 不同,因为后缀 token 已经被屏蔽。
3.8 one-sided advantage clamping
GRPO 会对同一 prompt 的多条 rollout 做 group normalization。 标准化 reward 记为 \tilde r_i=(r(τ_i)-μ_G)/(σ_G+δ)。 所有 trajectory 都参与 μ_G 和 σ_G,包括 fatal trajectory。 这样组内 baseline 不会只由非 fatal 样本决定。 问题在于 fatal trajectory 常低于均值。 如果把负 \tilde r_i 直接用于 fatal 前缀,策略会降低本来有效的前缀 token 概率。 论文的 clamping 是:非 fatal trajectory 使用 \tilde r_i;fatal trajectory 使用 max(\tilde r_i,0)。 直观效果是 fatal 前缀最多得到零或正向学习信号,不会被负优势压制。 如果 fatal 从第 0 步开始,代码会退化成 hard mask,因为没有可学习前缀。 这就是“保守保护有效搜索前缀”的算法核心。
3.9 公开代码中的实现对应
Code reference:
main@236e0e07(2026-05-19)
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| 真实多轮工具 rollout | opensearch_vl/opensearch_infer/pipeline.py | process_single_case |
| 工具 schema 与解析 | opensearch_vl/opensearch_infer/tools.py | get_tools_definition, extract_tool_call, execute_tool |
| RL workflow / reward / fatal metadata | RL/rllm/vision_deepresearch_async_workflow/deepresearch_workflow.py | workflow rollout and reward handling |
| fatal token mask | RL/rllm/rllm/engine/agent_workflow_engine.py | _apply_fatal_step_mask, transform_results_for_verl |
| GRPO trainer / advantage clamp | RL/rllm/rllm/trainer/verl/agent_workflow_trainer.py | AgentWorkflowPPOTrainer |
| SFT 配置 | SFT/examples/agentic_full/*.yaml | Qwen3-VL full SFT configs |
| RL 启动配置 | RL/rllm/vision_deepresearch_async_workflow/run/qwen3-vl-*-multi-node.sh | 8B / 30B-A3B / 32B scripts |
| 推理入口 | opensearch_vl/run_infer.py | CLI backend selection and rollout |
| 评测入口 | opensearch_vl/run_eval.sh | benchmark evaluation wrapper |
3.10 代码级伪代码:推理 loop
# based on opensearch_vl/opensearch_infer/pipeline.py and tools.py
def process_single_case(case):
images = bootstrap_initial_images(case)
prompt = tools_definition + user_question
trajectory = []
for turn in range(max_turns):
response = model.generate(prompt, images)
trajectory.append({"model_output": response})
if has_response_tag(response):
break
tool_call = extract_tool_call(response)
if not tool_call:
break
tool_message, new_images = execute_tool(tool_call, image_registry)
images.extend(new_images)
prompt += observation(tool_message, new_images)
trajectory[-1]["tool_output"] = tool_message
write_trajectory_json(trajectory)
return trajectory这个伪代码体现了公开代码的一个重要点:工具产生的新图像会回灌给模型。 本轮核验的 main@236e0e07 与原笔记锚点 8a9fc7d4 在关键代码路径上没有实现差异(diff 仅涉及 README),而 8a9fc7d4 的 commit message 是 “Feed tool-produced images back to the model in RL training”。 因此 crop、超分、透视矫正等工具不是只返回文本;它们可以产生新的 image reference。 这对多模态 search agent 很关键,因为下一轮模型需要直接看处理后的图像。
3.11 代码级伪代码:fatal-aware mask 与 clamp
# based on deepresearch_workflow.py, agent_workflow_engine.py, agent_workflow_trainer.py
def handle_rollout(trajectory):
fatal_step_index = find_first_k_consecutive_tool_errors(trajectory, k=3)
is_fatal = fatal_step_index is not None
reward = format_reward * (0.8 * answer_reward + 0.2 * query_reward)
if is_fatal:
response_mask = zero_tokens_after_step(response_mask, fatal_step_index)
return reward, response_mask, is_fatal
def compute_advantage(group_rewards, is_fatal):
normalized = (group_rewards - mean(group_rewards)) / (std(group_rewards) + delta)
for i in range(len(normalized)):
if is_fatal[i]:
normalized[i] = max(normalized[i], 0)
return normalized第一段对应 workflow/engine 中的 fatal metadata 和 token mask。 第二段对应 trainer 中的 one-sided advantage clamp。 代码实现与论文的算法意图一致:fatal trajectory 参与组统计,但 fatal 前缀不承受负优势。 如果模型在前几步已经崩溃,fatal_step_index==0 时没有可保存的有效前缀。 如果模型在中后段崩溃,前缀中的有效搜索可以继续训练。
3.12 RL 训练脚本中的关键配置
公开 RL 脚本位于 RL/rllm/vision_deepresearch_async_workflow/run/。8B 脚本是 qwen3-vl-8b-multi-node.sh。30B-A3B 脚本是 qwen3-vl-30b-3b-multi-node.sh。32B 脚本是 qwen3-vl-32b-multi-node.sh。三个脚本均设置 NNODES=8。三个脚本均设置 trainer.n_gpus_per_node=8。因此 8B 和 30B-A3B 默认使用 64 GPU,32B 默认也使用 64 GPU。README 中复现实验表进一步说明 32B 配置可使用 16×8 H100/H800。
8B 的 n_resp_per_prompt=8。30B-A3B 的 n_resp_per_prompt=16。32B 的 n_resp_per_prompt=16。三个脚本的 max_prompt_length=4096。三个脚本的 max_response_length=70000。三个脚本的 rollout temperature 为 0.7。三个脚本的 validation top-p 为 0.95。三个脚本 actor optimizer learning rate 为 1e-6。8B 和 32B 的 actor_ppo_max_token_len_per_gpu=74576。
30B-A3B 的 actor_ppo_max_token_len_per_gpu=70000。8B/32B 的 trainer.total_epochs=100。30B-A3B 的 trainer.total_epochs=5。这些数字来自实际 launch scripts,不是 base config 默认值。
3.13 推理工具集合
crop:对图像指定区域裁剪,减少背景噪声并提高 OCR/识别准确率。 layout_parsing:解析文档、表格、截图和复杂版面。 image_search:以图像或局部图像作为 query 进行反向图像检索。 text_search:以文本 query 检索网页或本地索引。 perspective_correct:对斜拍或透视畸变区域进行校正。 super_resolution:提升低清局部图像的分辨率。 sharpen:增强模糊文本或细节。 tools.py 还支持 fallback tag parsing,例如 <image_search>、<local_search>、<ocr> 等别名。 这些解析逻辑降低了模型输出格式轻微变体导致工具完全不可用的概率。 但最终训练仍通过 format reward 强化规范结构。
3.14 方法小结
OpenSearch-VL 的方法不是单个模块,而是一条闭环:数据构造让问题需要工具,SFT 让模型会用工具,RL 让模型探索更好工具策略,fatal-aware 机制让坏轨迹仍保留可学习部分。 这条闭环的关键假设是:多模态搜索代理的主要瓶颈不是看不懂图片,而是不会稳定地把图片、搜索、观察和答案组织成长期行动序列。 代码实现基本覆盖论文方法中的核心对象,包括工具 dispatcher、trajectory JSON、fatal mask、advantage clamp 和三个尺度的训练脚本。
4. Experimental Setup(实验设置)
4.1 模型与尺度
OpenSearch-VL 基于三个 Qwen3-VL 变体训练。 8B 模型基于 Qwen/Qwen3-VL-8B-Instruct。 30B-A3B 模型基于 Qwen/Qwen3-VL-30B-A3B-Instruct。 32B 模型基于 Qwen/Qwen3-VL-32B-Instruct。 论文比较 direct reasoning、RAG workflow 和 agentic workflow 三类 baseline。 Direct reasoning 表示模型不调用工具,直接从图像和问题生成答案。 RAG workflow 表示给模型检索增强信息,但没有完整的多轮工具决策。 Agentic workflow 表示模型可以多轮调用工具并根据 observation 继续行动。 这种分组有助于分辨收益来自搜索信息、工具行动还是训练策略。
4.2 Benchmark 与指标
主实验使用七个知识密集型多模态 QA / web-search benchmark。 七个 benchmark 是 SimpleVQA、VDR、MMSearch、LiveVQA、BrowseComp-VL、FVQA 和 InfoSeek。 它们覆盖视觉实体识别、网页证据检索、多跳推理和长尾知识问答。 指标是 Pass@1。 正确性由 GPT-4o judge 判定。 Judge protocol 与 VDR-Bench 保持一致,以减少不同答案风格带来的不公平。 论文在附录中给出完整 judge prompt。 评估重点不是生成风格,而是最终答案与 reference 的事实一致性。
4.3 数据规模与拆分
SFT 数据来自 36,592 条高质量 expert trajectories。 每条 SFT trajectory 平均包含 6.3 次 tool invocation。 RL 数据从 staged filtering 和 enhancement 后的 VQA pool 中随机采样 8K examples。 RL examples 与用于合成 SFT trajectories 的 VQA instances 不重叠。 这个拆分避免 RL 只记住 SFT 轨迹。 论文的实验重点是检验策略探索是否能超过 imitation initialization。
4.4 训练资源与公开脚本
GitHub README 的复现表给出三个 RL variant 的集群规模。 OpenSearch-VL-8B 使用 qwen3-vl-8b-multi-node.sh,集群为 8×8 H100/H800。 OpenSearch-VL-30B-A3B 使用 qwen3-vl-30b-3b-multi-node.sh,集群为 8×8 H100/H800。 OpenSearch-VL-32B 使用 qwen3-vl-32b-multi-node.sh,集群为 16×8 H100/H800。 脚本本身的 NNODES 当前为 8;README 对 32B 的复现说明更高,复现时需以实际集群配置为准。 训练脚本启用 algorithm.adv_estimator=grpo。 训练脚本设置 algorithm.kl_ctrl.kl_coef=0.0。 actor optimizer LR 为 1e-6。 rollout backend 使用脚本变量配置。 trainer project name 为 vision-deepresearch。 这些配置说明论文主线确实是 search-augmented GRPO,而不是 PPO+critic 或普通 SFT。
4.5 推理与评测实现
推理入口是 opensearch_vl/run_infer.py。 Shell 包装脚本是 opensearch_vl/run_infer.sh。 run_infer.sh 要求设置 DATA_PATH 指向 FVQA-style parquet。 MODEL 默认是 8b。 GPUS 默认是 0。 可以通过 CHECKPOINT 指向本地 OpenSearch-VL checkpoint。 README 中列出四种后端:8b、32b、30b-a3b 和 claude。 多 GPU 时使用 device_map="auto"。 单 GPU 时使用单卡 device map。 30B-A3B 推理会自动应用 MoE scatter dtype patch。 每个样本会输出一份 trajectory JSON。 评测脚本读取 trajectory 中的最终 response 并调用 judge。
4.6 实验设置的可复现注意点
论文主实验的 exact data artifacts 是否完全发布,需要以 GitHub/HuggingFace 当前状态为准。 公开 repo 已包含 SFT/RL/推理/评测代码。 GitHub 当前 default branch 为 main,本笔记核验 commit 为 236e0e07。 当前 repo license 为 Apache-2.0。 由于工具包含外部搜索、图像检索和 judge API,复现需要配置相应环境变量和服务凭证。 对比实验中的 proprietary baselines 依赖外部模型 API,完全复现可能受 API 版本和成本影响。 论文未详细说明所有网页搜索后端的实时索引状态,因此结果可能受评测日期影响。
5. Experimental Results(实验结果与证据)
5.1 主结果:agentic workflow 明显优于 direct/RAG
Table 2 报告七个 benchmark 的 Pass@1。 OpenSearch-VL-8B 平均分为 56.6。 OpenSearch-VL-30B-A3B 平均分为 61.6。 OpenSearch-VL-32B 平均分为 63.7。 8B 版本超过此前强 open 8B agent SenseNova-MARS-8B,平均提升 3.9 分。 30B-A3B 版本相对 Qwen3-VL agentic baseline 的平均分从 47.8 提升到 61.6,提升 13.8 分。 32B 版本超过 Gemini-2.5-Pro direct reasoning 的平均 46.0,也超过 Claude-4-Sonnet direct reasoning 的平均 33.1。 这说明收益不是只来自更大 backbone,而是来自 agentic workflow 和训练 recipe。
5.2 Table 2 关键数值
| Model | SimpleVQA | VDR | MMSearch | LiveVQA | BrowseComp-VL | FVQA | InfoSeek | Avg |
|---|---|---|---|---|---|---|---|---|
| Qwen3-VL-8B Agentic | 52.0 | 17.0 | 37.4 | 50.6 | 27.9 | 58.7 | 50.3 | 42.0 |
| SenseNova-MARS-8B | 61.7 | 19.4 | 67.4 | 56.2 | 35.1 | 67.1 | 61.7 | 52.7 |
| OpenSearch-VL-8B | 71.6 | 20.8 | 64.5 | 59.6 | 37.6 | 71.5 | 70.2 | 56.6 |
| Qwen3-VL-30B-A3B Agentic | 55.1 | 20.2 | 44.2 | 62.0 | 34.1 | 63.0 | 56.2 | 47.8 |
| OpenSearch-VL-30B-A3B | 74.9 | 33.5 | 68.7 | 67.4 | 41.1 | 73.2 | 72.4 | 61.6 |
| Qwen3-VL-32B Agentic | 58.7 | 23.1 | 53.9 | 45.5 | 35.1 | 61.2 | 58.5 | 48.0 |
| OpenSearch-VL-32B | 76.2 | 33.8 | 72.3 | 70.5 | 43.8 | 74.7 | 74.8 | 63.7 |
8B 的最大强项是 SimpleVQA、FVQA 和 InfoSeek,说明视觉实体识别与事实查找收益明显。 30B-A3B 在 VDR 和 MMSearch 上相对 Qwen3-VL baseline 的提升很大,说明 agentic search 对检索密集任务有效。 32B 在平均分上最高,说明 recipe 可以随模型规模扩展。 BrowseComp-VL 的绝对分仍低于 50,说明复杂网页浏览和长链路推理仍是瓶颈。
5.3 Ablation:fatal-aware GRPO 的贡献
Figure 解读:full fatal-aware GRPO 同时维持更高工具使用轮数和更高 batch accuracy,说明它不是靠减少探索来提高稳定性,而是让模型在更长 trajectory 中学习有效搜索。
Ablation 使用 Qwen3-VL-8B。 SFT baseline 平均分为 64.6。 Vanilla search-augmented GRPO 提升到 67.6。 Vision-DeepResearch 风格 hard-mask baseline 为 67.7,几乎只比 vanilla 高 0.1。 只加 fatal masking 达到 69.1。 完整方法加入 one-sided advantage clamping 后达到 71.8。 完整方法比 vanilla GRPO 高 4.2 分。 完整方法比 hard-mask baseline 高 4.1 分。 完整方法在每个 benchmark 上都是最好。 这直接支持论文的核心算法主张:保留 fatal 前缀比整条丢弃更有效。
5.4 fatal clamping 的可视化证据
Figure 解读:aggregate 曲线展示 fatal-aware 训练不是简单降低错误率,而是在错误存在时避免有用前缀被负梯度压制。
Figure 解读:case 图展示了 trajectory 层面的 clamping 直觉:fatal 后缀应被截断,fatal 前缀如果包含有效 search/reasoning,不应被当作负样本压制。
这组图与 §3.8 的算法公式对应。 Hard mask 的问题是过于保守:它避免了坏后缀,但同时丢掉好前缀。 Blind training 的问题是过于激进:它使用整条 trajectory,坏后缀会污染梯度。 Fatal-aware masking 是第一步折中:只截断坏后缀。 One-sided clamping 是第二步折中:避免 fatal 前缀承受负 advantage。 论文的 ablation 表明第二步不是可有可无,因为 fatal masking alone 低于 full method。
5.5 数据管线消融
论文还消融了数据合成 pipeline。 如果去掉 staged filtering,训练集会包含大量无需工具或单步工具即可解的问题。 这会让模型更容易学习短路径或直接回答。 如果去掉 enhanced subset,模型对低清、局部文字和图像处理工具的使用会变弱。 如果去掉 trajectory rejection sampling,SFT 会混入答案错误或过程低质量轨迹。 这些消融共同说明:agentic RL 的效果依赖前置数据质量。 仅把 GRPO 套到弱数据上,不能保证学到可靠 search behavior。 因此 OpenSearch-VL 的贡献必须理解为 data + SFT + RL 的组合,而不是单一 reward trick。
5.6 定性案例

Figure 解读:定性案例强调模型需要从图像证据出发,多轮使用搜索和视觉工具,并在 observation 中逐步缩小候选答案。
成功案例通常包含三步:定位视觉 anchor、形成可检索 query、交叉验证网页或图像结果。 失败案例通常出现在 anchor 错误、query 过宽、工具返回噪声或模型过早终止。 论文的 qualitative evidence 支持这样一个判断:OpenSearch-VL 的收益来自更好的搜索过程,而不是只靠更强 final-answer judge。 从工程角度看,trajectory JSON 是分析成功/失败案例的关键 artifact。 它可以暴露每轮 model output、tool call、tool output 和 final response。
5.7 与代码版本相关的证据
当前公开代码仓库 main 最新核验 commit 是 236e0e07ded730e66cf6e85ad39d5a34e403dbca。 该 commit 日期是 2026-05-19。 该 commit message 是 “revise the readme file”。 与原笔记锚点 8a9fc7d4 相比,已核验关键代码路径没有实现差异,diff 只涉及 README。 tools.py 的 schema 覆盖 crop、layout parsing、image search、text_search、perspective correction、super resolution 和 sharpen。 pipeline.py 会记录 trajectory 并把 observation 追加到后续对话。 agent_workflow_engine.py 中存在 _apply_fatal_step_mask。 agent_workflow_trainer.py 中存在 fatal trajectory 的 one-sided advantage clamp。 这些实现点使论文方法不只是 PDF 描述,而能在 repo 中找到对应代码。
5.8 局限与风险
论文依赖 GPT-4o、GPT-5.4、Claude Opus 4.6 等 proprietary models 作为 judge 或 expert,完全复现实验会依赖外部 API。 数据合成使用 Wikipedia、Wikimedia、网页搜索和多源 VQA,数据版本与在线检索状态可能随时间变化。 工具环境包含图像检索、网页搜索和图像增强,部署质量会受具体后端影响。 BrowseComp-VL 等长链路任务仍然分数不高,说明当前 agentic loop 还不能稳定处理复杂网页浏览。 Fatal-aware clamping 保护有效前缀,但它也可能让某些低质量 fatal prefix 逃过负惩罚;效果依赖 fatal detector 和 process reward 的精度。 Judge-based reward 可能引入偏差,尤其在答案可表达为多种别名或跨语言实体时。 论文未详细说明所有线上工具后端的索引更新时间和缓存策略,因此跨时间复现需要固定工具环境。 公开 repo 当前仍需要用户自行准备环境变量、模型 checkpoint、数据路径和评测 API。
5.9 Takeaways
最重要的 empirical takeaway 是:agentic workflow 相比 direct/RAG 在多模态知识密集 QA 上有显著收益。 最重要的 algorithmic takeaway 是:fatal trajectory 中的有效前缀应该被保留,而不是被 hard mask 丢弃或被负 advantage 惩罚。 最重要的 engineering takeaway 是:工具输出的新图像必须回到模型上下文,否则视觉工具只能返回文本摘要,无法形成真正的多模态闭环。 最重要的 reproduction takeaway 是:训练配置、工具 dispatcher、reward/mask 和 evaluation 都需要一起复现,单独复现模型权重不足以复现论文结果。