DR-Venus: Towards Frontier Edge-Scale Deep Research Agents with Only 10K Open Data

Paper: arXiv:2604.19859 Code: inclusionAI/DR-Venus Code reference: master @ 60131410 (2026-05-08)

1. Motivation (研究动机)

当前 Deep Research Agent 的主要矛盾不是“是否能调用搜索工具”,而是:要在真实部署中让小模型稳定完成长链路检索、浏览、证据整合和最终作答,同时还不能依赖昂贵闭源数据或超大模型算力。论文把目标明确限定在 edge-scale 4B 级 deep research agent:它要能在 search / browse 工具环境里完成最多 200 步的长程交互,并在 BrowseComp、BrowseComp-ZH、GAIA、xBench-DeepSearch、DeepSearchQA 等 benchmark 上接近或超过已有小模型 agent。

已有方法的瓶颈有三类。第一,训练数据少且噪声重:REDSearcher 这类开放轨迹虽然有 10K 级规模,但原始轨迹包含冗余 browse/search、非部署环境支持的工具调用、格式不一致和错误答案轨迹;小模型比大模型更容易被这些噪声带偏。第二,普通 SFT 对长轨迹利用不足:如果把短轨迹和 100+ turns 的长轨迹同权采样,模型学到的是基本工具格式,而不是 sustained planning、多步 evidence aggregation。第三,RL 的 outcome reward 太稀疏:长程 research 常常到最后才知道答案对错,trajectory-level GRPO 很难告诉模型“哪一个中间 browse/search turn 真正推进了信息获取”。

这篇工作的价值在于证明:即使只有约 10K open data,只要把数据清洗、长轨迹重采样和 turn-level reward 设计做好,4B 模型也能形成很强的 deep research 能力。这直接服务于低成本、低延迟、隐私更友好的本地/边缘部署场景,而不是只追逐 30B/70B 或闭源 frontier 模型。

2. Idea (核心思想)

核心 insight 是:小模型 deep research agent 的瓶颈首先是有效监督密度,而不只是参数规模。DR-Venus 用两阶段配方把有限开放数据“榨干”:先用严格清洗 + long-horizon resampling 做 agentic SFT,建立稳定的 tool-use / answer format / trajectory imitation;再用 IGPO 把“当前 turn 是否增加了 ground-truth answer 的概率”转成 dense turn-level reward,使 RL 能在 200-turn 级任务中做更细的 credit assignment。

关键创新可以概括为:SFT 阶段不是直接吃 10,001 条 raw REDSearcher trajectories,而是对齐部署环境、剪掉不允许工具、去重、过滤正确答案,并把 51–100 turns / >100 turns 的轨迹分别按 2× / 5× 上采样;RL 阶段不是只在最终答案上给 sparse reward,而是在 browse/visit 等信息获取节点上计算 information gain,并结合 format penalty、separate normalization、IG-Scale 和 discounted accumulation,把每个 turn 的局部收益传播到该 turn 的所有生成 token。

和 REDSearcher-30B-A3B、OpenResearcher-30B-A3B 等大模型训练 agent 相比,DR-Venus 的主要差异不是提出更复杂的 agent runtime,而是把数据利用率和 reward 密度作为小模型 scaling 的中心问题;和普通 GRPO 相比,IGPO 不把一整条 trajectory 的好坏粗暴分摊到所有 token,而是尽量让每个 tool-use turn 获得与其信息增益匹配的奖励。

3. Method (方法)

3.1 Overall framework:两阶段训练 + 同协议推理

Figure 0 解读:这张图来自官方 released repo,用于补足论文正文中没有单独 architecture diagram 的部分。整体 pipeline 分成 SFT、RL、Inference 三段:SFT 负责把 REDSearcher raw trajectories 变成同一 search + visit 工具协议下的 cleaned/resampled trajectories;RL 从 SFT checkpoint 出发,用 IGPO-style information gain reward 优化长程工具使用;Inference 则复用同一套系统提示和工具格式,让训练时学到的格式约束不会在部署时失配。

DR-Venus 将 deep research 形式化为一个带外部环境 的 policy 。给定 query ,初始历史是 ;第 个 turn 生成 ,其中 是 reasoning trace, 是 search、browse/visit 或 answer 动作: 如果 是工具动作,环境返回 observation ,历史更新为 ;如果 是 answer,trajectory 在 结束: 直觉上,SFT 教模型“怎么按协议行动”,RL 教模型“哪些中间行动真正有用”。这两者缺一不可:没有 SFT,4B 模型很难稳定地产生 <think><tool_call><answer> 这类结构;没有 dense RL,模型虽然会用工具,但会出现 redundant reasoning、无效 browse、格式错误和长程执行不稳定。

3.2 Agentic SFT:清洗、过滤、重采样,而不是直接 imitation

SFT 数据来自 10,001 条 REDSearcher raw trajectories。论文和 released code 中的 SFT/data_clean/prepare_trajectories.py 都显示,清洗逻辑围绕 deployment protocol 做四步:

  1. Environment alignment:把轨迹转成和在线推理一致的 message schema、system prompt、tool-call arguments、tool-response format。论文称 10,001 条 raw trajectories 在此阶段都成功转换。
  2. Disallowed-tool pruning + duplicate removal:部署环境只暴露 search 和 browse;released code 中实际工具名是 searchvisit。因此,其他工具 turn 与配对 tool-response 会被移除。论文报告该步影响 1,064 条轨迹,移除 3,378 个 disallowed tool calls,主要来自 Python-Interpreter;重复 search/browse 调用出现在 6,821 条轨迹中,共移除 15,728 个重复 interaction,且多数是 duplicate browse events。
  3. Correctness filtering:用 Qwen3-235B-A22B-Instruct-2507 作为 judge,保留最终答案正确的轨迹。10,000 条 valid trajectories 经过 correctness filtering 后保留 9,365 条,保留率 93.65%。
  4. Turn-aware resampling:按照轨迹长度给 SFT 采样权重:0–50 turns 为 1×,51–100 turns 为 2×,>100 turns 为 5×。最终训练实例从 9,365 增至 18,745;>50 turns 占比从 60.28% 提升到 80.15%,>100 turns 占比从 13.29% 提升到 33.21%。

SFT loss 只作用在 assistant-generated tokens,包括 reasoning traces、tool invocations 和 final answer;环境 observation tokens 被 mask 掉: 其中 是 serialized trajectory 中由 agent 生成的位置,排除外部环境返回的 。这点很关键:模型不应该被训练去“生成网页返回内容”,而应该学习在看到 observation 后继续推理、调用工具或作答。

def clean_and_resample_redsearcher(rows, allowed_tools=("search", "visit")):
    cleaned = []
    stats = Counter()
    for row in rows:
        messages = normalize_row_to_dr_venus_schema(row)
        if messages is None:
            stats["drop_schema"] += 1
            continue
 
        messages, pruned = prune_disallowed_tool_turns(messages, set(allowed_tools))
        stats["pruned_tool_turns"] += len(pruned)
 
        messages, duplicates = remove_duplicate_tool_calls(messages)
        stats["duplicate_tool_turns"] += len(duplicates)
 
        ok, reason = validate_messages(messages)  # checks <think>, <tool_call>, <answer>
        if not ok:
            stats[f"drop_{reason}"] += 1
            continue
 
        turns = max(len(messages) - 1, 0) // 2
        row = {**row, "messages": messages, "_turns": turns}
        cleaned.append(row)
 
    resampled = []
    for row in cleaned:
        turns = row["_turns"]
        multiplier = 1 if turns <= 50 else 2 if turns <= 100 else 5
        for _ in range(multiplier):
            resampled.append({**row, "_resample_multiplier": multiplier})
    return resampled, stats

3.3 Agentic RL:用 IGPO 提高 turn-level credit assignment

SFT 后的模型仍然会出现 formatting errors、redundant reasoning 和 inefficient tool use。DR-Venus 的 RL 阶段采用 IGPO:对每个 query 采样 条 rollouts,并在每个 rollout 的中间 turn 上估计 information gain。给定 ground-truth token sequence ,在第 个 turn 历史 下,模型对标准化 ground-truth answer 的平均 log-probability 为: 于是 turn-level IG reward 是当前 turn 前后 ground-truth log-prob 的增量: released code 中 RL/scrl/llm_agent/prealigned_vectorized.py 的默认 INFO_GAIN_TYPE="log_prob_diff" 与该公式一致:第一轮记录 gt_values[global_idx]=mean_log_prob,后续 turn 用 cur_value - gt_values[global_idx] 得到 info_gain,再更新 baseline。代码还支持 prob_diff,但 RL/train_igpo.sh 的 paper-repro setting 使用 log_prob_diff

def compute_turn_information_gain(mean_log_probs_by_turn, active_turns):
    gt_value = {}
    info_gain_rewards = defaultdict(list)
    for turn_idx, turn_values in enumerate(mean_log_probs_by_turn):
        for sample_id in active_turns[turn_idx]:
            mean_log_prob = turn_values[sample_id]
            if not torch.isfinite(mean_log_prob):
                info_gain_rewards[sample_id].append(0.0)
                continue
            if turn_idx == 0 or sample_id not in gt_value:
                gt_value[sample_id] = mean_log_prob
                continue
            ig = mean_log_prob - gt_value[sample_id]
            info_gain_rewards[sample_id].append(float(ig))
            gt_value[sample_id] = mean_log_prob
    return info_gain_rewards

Browse-aware IG assignment

论文区分 search 和 browse:search 更像 exploratory snippets,browse/visit 更接近具体证据读取。因此 DR-Venus 可只在 browse turn 上计算 IG,并把该 reward 分配给该 browse turn 及其前一个 browse 之后的所有 search turns。released code 的命名差异是:论文正文多写 browse,appendix system prompt 和 repo 中使用工具名 visitRL/train_igpo.sh 设置 IG_TOOL_FILTER="visit",含义就是只在网页访问/浏览工具上计算 IG。

论文公式与 released code 实现差异:论文正文称工具是 search + browse,但 Appendix A 和 released code 使用 search + visit;这是命名差异而非能力差异,visit 对应论文中的 browse/page-reading action。笔记中的 code mapping 以 released code 的 visit 为准。

Turn-level format penalty

普通 trajectory-level format penalty 会因为一个 turn 出错而惩罚整条 200-turn 轨迹。DR-Venus 改成 turn-level:如果 turn 格式合法,保留原 reward;否则替换为固定负惩罚: RL/train_igpo.shUSE_FORMAT_PENALTY=trueFORMAT_PENALTY_SCALE=1.0,对应论文的 。这让 reward 不再把“某个坏 turn”扩散成“整条轨迹都坏”。

3.4 Reward normalization、IG-Scale 与 discounted accumulation

IG reward 和 final outcome reward 的尺度不同,因此论文先在 rollout group 内分开标准化。令 分别为格式调整后的 turn IG reward 和 terminal outcome reward: 对于 ultra-long-horizon 任务,final outcome 可能大量为 0,IG 反而主导优化。论文的 IG-Scale 用 batch-level magnitude 重缩放 IG: 最后用 discounted return 把未来 turn 的收益传播回当前 turn: 其中 RL/train_igpo.sh 设置 algorithm.gamma=0.95。released code 中 RL/verl/trainer/ppo/info_gain_advantage.pyscaled_separate 分支对应论文 IG-Scale:先分别对 final F1/outcome mask 和 IG mask 做 group stats,再用 f1_abs_mean / ig_abs_mean 得到 ig_scale 并 clamp 到 10,最后 _compute_turn_level_advantage 按 turn boundary 做反向折扣累计,并 broadcast 到该 turn 的 token span。

def compute_grpo_info_gain_advantage(token_rewards, response_mask, group_index, gamma=0.95):
    last_pos = last_valid_token_position(response_mask)
    f1_mask = token_position_equals(last_pos) & response_mask.bool()
    ig_mask = response_mask.bool() & (~f1_mask) & (token_rewards != 0)
 
    f1_mean, f1_std = group_stats(token_rewards, f1_mask, group_index)
    ig_mean, ig_std = group_stats(token_rewards, ig_mask, group_index)
    norm_f1 = (token_rewards - f1_mean[group_index]) / (f1_std[group_index] + 1e-6)
    norm_ig = (token_rewards - ig_mean[group_index]) / (ig_std[group_index] + 1e-6)
 
    f1_abs = norm_f1[f1_mask].abs().mean().clamp(min=0.3)
    ig_abs = norm_ig[ig_mask].abs().mean().clamp(min=1e-6)
    ig_scale = (f1_abs / ig_abs).clamp(max=10.0)
 
    normalized = torch.zeros_like(token_rewards)
    normalized[f1_mask] = norm_f1[f1_mask]
    normalized[ig_mask] = norm_ig[ig_mask] * ig_scale
 
    turn_boundary = f1_mask | ig_mask
    returns = discounted_accumulate_by_turn(normalized, turn_boundary, gamma=gamma)
    return returns * response_mask

3.5 IGPO objective 与 inference loop

IGPO 保留 GRPO-style clipped objective,但 advantage/reward 不再是单个 trajectory outcome,而是 token 对应 turn 的 推理时,Inference/web_demo.pyResearchProblemSolver 循环解析 <think><tool_call><answer>;当模型输出 searchvisit 时,工具结果被包进 <tool_response>...</tool_response> 再追加到 message history;超过 max steps 或 context length 时,系统要求模型直接给 <answer>。这和 SFT 数据清洗阶段的 message schema 是同一协议。

def deep_research_inference_loop(model, tokenizer, question, max_steps=200):
    messages = [{"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": question}]
    for step in range(max_steps):
        text = model.generate(messages, stop=["<tool_response>"])
        status, reason, payload = parse_llm_response(text, step)
        if status == ANSWER_OK:
            return extract_answer(payload)
        if status != TOOL_CALL_OK:
            messages.append({"role": "user", "content": format_error_tool_response(reason)})
            continue
        tool_name, args = payload["name"], payload["arguments"]
        if tool_name == "search":
            result = serper_search(args["query"])
        elif tool_name == "visit":
            result = jina_visit(args["url"], goal=args["goal"])
        messages.append({"role": "assistant", "content": text})
        messages.append({"role": "user", "content": f"<tool_response>\n{result}\n</tool_response>"})
    return force_final_answer(messages)

3.6 Code-to-paper mapping

Code reference: master @ 60131410 (2026-05-08) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
SFT trajectory schema alignmentSFT/data_clean/prepare_trajectories.pynormalize_raw_messages, normalize_clean_messages, normalize_row
Disallowed-tool pruningSFT/data_clean/prepare_trajectories.pyprune_disallowed_tool_turns; DEFAULT_ALLOWED_TOOLS=("search","visit")
Duplicate search/visit removalSFT/data_clean/prepare_trajectories.pyremove_duplicate_tool_calls, canonical_signature
Turn-aware resamplingSFT/data_clean/prepare_trajectories.pycompute_turns, compute_multiplier, main resampling loop
SFT launch configSFT/sft_shells/run.sh, SFT/train_sft.shwrapper overrides DATA_MAX_LENGTH=200000, SP_SIZE=8, then calls FSDP SFT trainer
IG reward computationRL/scrl/llm_agent/prealigned_vectorized.pyvectorized log_prob_diff: info_gain = cur_value - gt_values[global_idx]
IGPO advantage / IG-ScaleRL/verl/trainer/ppo/info_gain_advantage.pycompute_grpo_info_gain_advantage, _compute_turn_level_advantage, scaled_separate branch
RL launch configRL/train_igpo.shUSE_INFO_GAIN=true, IG_TOOL_FILTER="visit", agent_grpo.n=8, max_turns=200
Outcome reward routingRL/verl/workers/reward_manager/naive_batch.py, RL/verl/utils/reward_score/__init__.py, format_and_f1.pybatch reward manager, LLM/F1 routing, <answer> extraction
Search/visit inference protocolInference/web_demo.py, RL/configs/dr_agent_loop.yaml, RL/scrl/llm_agent/dr_agent_loop.pyResearchProblemSolver, DRAgentLoop, tool response formatting

4. Experimental Setup (实验设置)

Training data

  • SFT data:10,001 条 raw REDSearcher trajectories,经环境对齐、工具剪枝/去重、正确性过滤和 turn-aware resampling。清洗后 10,000 条 valid,正确性过滤后 9,365 条,resampling 后 18,745 个训练实例。
  • RL data:从 REDSearcher data source curated 的 1K query-answer pairs,论文脚注给出 Zchu/REDSearcher_RL_1K
  • Open-data constraint:SFT 和 RL 都只使用 open data;SFT 学 trajectory imitation,RL 用 curated QA supervision 做 optimization。

Benchmarks and metrics

评测覆盖六个 deep research / web browsing / multi-step information-seeking benchmark:BrowseComp、BrowseComp-ZH、GAIA (Text-Only)、xBench-DS-2505、xBench-DS-2510、DeepSearchQA。主要 metric 是 accuracy / benchmark score;对样本数少于 300 的数据集,论文报告三次独立评测均值,其余数据集报告单次评测结果。Pass@K 分析用于衡量 test-time 多样本采样下的 capability ceiling,而不是只看 Pass@1。

Baselines

  • Foundation models with tools:GLM-4.7、MiniMax-M2.1、DeepSeek-V3.2、Kimi-K2.5、Claude-4.5-Opus、OpenAI-o3、GPT-5 High、Gemini-3-Pro。
  • ≥30B trained agents:DeepDive-32B、SMTL-30B-300、WebSailor-V2-30B、Tongyi-DR-30B、DeepMiner-32B-RL、OpenSeeker-v1-30B-SFT、OpenResearcher-30B-A3B、REDSearcher-30B-A3B。
  • ≤9B trained agents:DeepDive-9B、WebSailor-7B、OffSeeker-8B、WebExplorer-8B-RL、AgentCPM-Explore-4B。
  • 论文明确不和依赖额外 context management 或 test-time scaling 的 RE-TRAC-4B、Marco-DR-8B、MiroThinker-v1.0 直接比较,以保持 standard evaluation setting。

Training and inference config

训练 backbone 是 Qwen3-4B-Thinking-2507。论文报告 SFT 使用 8×A100、verl FSDP trainer、maximum training length 200K tokens、global batch size 32、per-GPU micro-batch size 1、learning rate 、1 epoch、multi-turn supervision、right truncation、gradient checkpointing、sequence parallelism size 8。released code 中对应的实际入口是 SFT/sft_shells/run.sh,它覆盖 DATA_MAX_LENGTH=200000TRAIN_BATCH_SIZE=32MICRO_BATCH_SIZE_PER_GPU=1SP_SIZE=8,再调用 SFT/train_sft.sh;注意 SFT/train_sft.sh 自身默认 DATA_MAX_LENGTH=32768,不能拿那个默认值当论文配置。

RL 使用 16×A100、verl vLLM engine + FSDP trainer、training batch size 16、rollout context up to 256K、每 turn 最大生成 8,192 tokens、group size 8、temperature 1.0。released code RL/train_igpo.sh 的关键 reproduction knobs 是:MAX_MODEL_LEN=261000MAX_PROMPT_LEN=246000MAX_RESPONSE_LEN=8192agent_grpo.n=8max_turns=200algorithm.gamma=0.95algorithm.kl_ctrl.kl_coef=0.001actor_rollout_ref.actor.optim.lr=1e-6IG_TOOL_FILTER="visit"INFO_GAIN_NORM_MODE="scaled_separate"USE_FORMAT_PENALTY=trueFORMAT_PENALTY_SCALE=1.0。推理时最多 200 个 interaction steps,decoding 使用 temperature 1.0、top-p 0.95、top-k 20、presence penalty 1.1、最大 token budget 256K。

工具服务器遵循 search + browse/visit 协议:search 由 Serper/Google Search API 返回 top-10 搜索结果,browse/visit 基于 Jina reader 读取网页,并用 Qwen3-30B-A3B-Instruct-2507 做内容 summarization。

5. Experimental Results (实验结果)

Main results on six benchmarks

Figure 1 解读:图中突出的是 DR-Venus-4B 在 BrowseComp / BrowseComp-ZH 上相对同规模开源 agent 的位置。SFT 版本已经超过 AgentCPM-Explore-4B;IGPO RL 后在两个语言环境上进一步提升,说明 dense turn-level reward 主要改善执行可靠性,而不是只靠更大模型容量。

ModelBrowseCompBrowseComp-ZHGAIA Text-OnlyxBench-DS-2505xBench-DS-2510DeepSearchQA
AgentCPM-Explore-4B24.129.163.970.034.032.8
DR-Venus-4B-SFT26.835.765.469.035.337.7
DR-Venus-4B-RL29.137.764.474.740.739.6
WebExplorer-8B-RL15.732.050.053.723.017.8
Tongyi-DR-30B43.446.770.975.055.0
REDSearcher-30B-A3B42.149.880.1
GPT-5 High54.965.076.477.875.079.0

最重要的结论是:DR-Venus-4B-SFT 已经在六个 benchmark 中普遍超过先前 4B–9B agentic systems;RL 版本在 BrowseComp (+2.3)、BrowseComp-ZH (+2.0)、xBench-DS-2505 (+5.7)、xBench-DS-2510 (+5.4)、DeepSearchQA (+1.9) 上继续提升,但 GAIA 从 65.4 降到 64.4。这说明 IGPO 并非所有 benchmark 都单调增益,但整体显著增强了 long-horizon web research 的执行稳定性。尤其是 xBench-DS-2505 上 DR-Venus-4B-RL 达到 74.7,接近 Tongyi-DR-30B 的 75.0。

Ablation: resampling, GRPO vs IGPO

ModelTrainingBrowseCompBrowseComp-ZH
REDSearcher-30B-A3B (SFT)SFT34.726.8
DR-Venus-4B-SFT (w/o Resampling)SFT22.833.9
DR-Venus-4B-SFT (w/ Resampling, Ours)SFT26.8 (+4.0)35.7 (+1.8)
DR-Venus-4B-RL (w/ GRPO)SFT+RL25.3 (-1.5)35.6 (-0.1)
DR-Venus-4B-RL (w/ IGPO, Ours)SFT+RL29.1 (+2.3)37.7 (+2.0)

这张 ablation 证明两个点。第一,turn-aware resampling 对有限 open data 很重要:仅在长轨迹上增加采样权重,就让 BrowseComp 从 22.8 到 26.8,BrowseComp-ZH 从 33.9 到 35.7。第二,普通 GRPO 在这种长程 research setting 中不稳:BrowseComp 反而从 26.8 降到 25.3,BrowseComp-ZH 几乎不变;IGPO 则在两个 benchmark 都有正增益。原因和方法部分一致:GRPO 的 sparse outcome reward 很难处理 200-turn 级 credit assignment,而 IGPO 的 turn-level IG reward 给了更密的监督。

Capability boundary: Pass@K

Figure 2a–2b 解读:左图是 BrowseComp,右图是 BrowseComp-ZH。BrowseComp 上 RL 在所有 上都高于 SFT,Pass@1 从 26.8 到 29.1,Pass@16 从 61.7 到 63.7,说明 RL 不只改善单次采样,也略微抬高了 capability boundary。BrowseComp-ZH 上最大增益集中在小 :Pass@1 从 35.7 到 37.7,Pass@2 从 52.9 到 53.3;但大 时 SFT 本身已经很强,Pass@8 达到 74.0、Pass@16 达到 78.5,RL 版本在大 反而略低(文中解释可能与 RL data 全英文造成的 distribution mismatch 有关)。

Pass@K 分析的意义是:如果只看 Pass@1,会低估 4B deep research agent 的潜在能力。特别是在 BrowseComp-ZH,DR-Venus-4B-SFT 的 Pass@16=78.5,超过 Tongyi-DR-30B 的 46.7,也超过 GPT-5 High 的 65.0。这支持论文的 deployment claim:小模型通过 test-time scaling 可以达到很高上限,但 RL 更偏向让强轨迹在低采样预算下更可靠地出现。

Tool-use analysis: correct trajectories browse more

Figure 3 解读:这张图比较 SFT/RL 下 correct、wrong、overall trajectories 的 browse ratio。总体规律是 correct trajectories 的 browse ratio 通常高于 wrong trajectories,说明 deep research 成功不只是“多 search”,而是需要进入网页做更深证据检查。RL 后 overall browse ratio 从 17.49% 提升到 22.46%,correct trajectories 的 browse ratio 从 23.71% 提升到 28.96%;在 xBench-DS-2510 上,SFT 出现 wrong trajectories browse more 的反常模式(15.57% vs. 14.51%),RL 后反转为 correct trajectories browse more(22.99% vs. 17.50%)。

这个结果说明 IGPO 不是简单鼓励“浏览越多越好”,而是更好地把工具使用与正确答案对齐。对 Search & RAG Agent 来说,这比单纯提高 retrieval recall 更关键:模型必须学会何时从搜索摘要转入页面阅读,以及如何把页面证据整合进最终答案。

Limitations and caveats

论文没有展开独立的 limitations section,但正文给出几个实际 caveat。第一,RL data 当前全英文,这可能解释 BrowseComp-ZH 在大 下 RL 不如 SFT 的现象;跨语言 deep research RL 仍需要更均衡数据。第二,DR-Venus 仍明显低于 frontier foundation models:例如 GPT-5 High 在 xBench-DS-2510 是 75.0,DR-Venus-4B-RL 是 40.7;Kimi-K2.5 在 DeepSearchQA 是 77.1,DR-Venus-4B-RL 是 39.6。第三,训练和推理依赖外部 Serper/Jina/Qwen summarizer/Judge 服务;这会影响 reproducibility、成本和隐私边界。第四,Pass@K 暗示小模型上限很高,但 test-time scaling 本身会增加推理成本,edge deployment 需要在 latency、采样次数和成功率之间取舍。

总体结论是:DR-Venus 证明 4B agent 在只有约 10K open data 的条件下可以达到新的 small-model frontier;关键不是盲目堆模型规模,而是让 SFT 数据更干净、更偏长程,让 RL reward 更密、更贴近信息获取过程,并确保训练协议与推理工具协议一致。