把搜索做得更深:ASearcher 如何用异步强化学习让大模型“查资料”超过 40 轮

如果让一位普通人去网上查一篇冷门论文里提到的实验动物,他可能会在两三次搜索后放弃;而今天的开源大模型,通常被限制在 10 轮以内 的工具调用——再长,训练框架就撑不住了。
ASearcher 的出现打破了这层天花板:经过强化学习训练后,同一个 32 B 参数的模型可以连续调用搜索与浏览工具 40 次以上,并输出 15 万 tokens 的推理过程,最终把答案找全、找对。这篇文章用对话的方式,带你完整拆解 ASearcher 是怎么做到的,以及你可以怎样复现、微调甚至定制自己的“深度搜索代理”。


目录

  1. 为什么要让搜索“超过十轮”?
  2. ASearcher 的三板斧:数据、训练框架、代理设计
  3. 效果到底如何?——用数字说话
  4. 手把手:在自己的机器上跑起来
  5. 常见问题 FAQ(预测你会问)

1. 为什么要让搜索“超过十轮”?

场景示例 普通人搜索 传统开源代理(≤10 轮) ASearcher(>40 轮)
“2024 年底中国 2012 伦敦奥运奖牌数到底是多少?” 3-5 次查询后,被冲突信息劝退 因轮次限制,无法交叉验证 逐条核对官方报告,锁定因禁药取消的 1 枚金牌
“某篇 2021 论文中提到的实验动物是什么?” 很难同时比对作者 A、作者 B 与维基引用 只查到作者 A,遗漏作者 B 把两位作者的原文、维基引用全部读完,确认是 mice

一句话:复杂问题需要“深挖”,而深挖需要“长轨迹”
旧系统卡在“10 轮”是因为训练框架一旦遇到长轨迹,GPU 会长时间空转;ASearcher 用完全异步的强化学习把这个问题解决了。


2. ASearcher 的三板斧:数据、训练框架、代理设计

2.1 数据:让问题“更难、更真、更多”

数据来源 数量 特点
开源多跳 QA(HotpotQA、2WikiMQA) 1.6 万 人工标注,已显简单
自研 QA 合成代理新造 2.56 万 平均每条经历 4.3 次“加料”,2.1 次“模糊”

QA 合成代理的两把刷子

  1. Injection(加料):把“迈克尔·海因的出生年份”升级成“曾任纽约阿尔斯特县执行官、允许 2016 年铁路继续运营的那位埃克德学院校友的出生年份”。
  2. Fuzzing(模糊):把精确年份“1934”换成“20 世纪 30 年代”,让模型无法靠记忆回答。

每条合成题都要过三道质检:

  • 基本可读性与事实正确
  • 直接让 QwQ-32B 闭卷回答,必须答错才算难
  • 确认唯一答案,防止“多解”

2.2 训练框架:把“长轨迹”从 GPU 杀手变成训练优势

旧范式:同步批生成 ASearcher:完全异步
每批等最慢轨迹,GPU 空转 轨迹与训练彻底解耦,GPU 持续满载
上限 10 轮 放宽到 128 轮,真实需要多长就多长
平均 5-6 轮就结束 训练后期常见 40-70 轮

实现细节一句话:每条轨迹独立跑,随时把完成的样本塞进训练队列
代码层面基于 AReaL 系统,开箱即用。

2.3 代理设计:简单但够用

模块 工具 说明
搜索 Serper API 返回 10 条网页摘要
浏览 Jina Reader 拿到网页全文
记忆 最近 25 k 字符 对大模型足够,防止爆表

没有花哨的“外部 LLM”或“子代理”,所有思考、摘要、验证都在同一个模型里完成,方便端到端 RL 直接优化。


3. 效果到底如何?——用数字说话

3.1 主战场:三大高难度基准

基准 任务特点 ASearcher-Web-QwQ Avg@4 开源 32 B 最佳对手
GAIA 真实网络、需要外部知识 52.8 Search-o1 48.1
xBench-DeepSearch 多跳、实时信息 42.1 Search-o1 40.3
Frames 长文档交叉验证 70.9 SimpleDS 67.0

Avg@4:四次尝试的平均分;↑ 表示超过之前最好成绩。

3.2 RL 带来的提升有多大?

基准 训练前 QwQ-32B 训练后 ASearcher 提升
GAIA 43.7 52.8 +9.1
xBench-DeepSearch 28.7 42.1 +13.4
Frames 58.9 70.9 +12.0

一句话:强化学习让模型“更会查”,而不是“死记更多知识”。


4. 手把手:在自己的机器上跑起来

4.1 环境准备

  1. 机器:最少 1 张 80 GB A100(7 B 模型),推荐 16 节点 8×A100(训练 7 B)。
  2. 系统:Ubuntu 20.04+,Python 3.10。
  3. 克隆仓库

    git clone https://github.com/inclusionAI/ASearcher.git
    cd ASearcher
    pip install -r requirements.txt
    

4.2 快速评估:复现论文数字

cd evaluation/
export SERPER_API_KEY=你的_key
export JINA_API_KEY=你的_key

python3 search_eval_async.py \
  --data_names GAIA,xbench-deepsearch,Frames \
  --model_name_or_path inclusionAI/ASearcher-Web-QwQ \
  --output_dir ./results \
  --llm_as_judge \
  --pass-at-k 4

运行完在 results/ 里能看到 Avg@4 与 Pass@4,与论文表 4 对应。

4.3 微调 7 B 模型(单节点示例)

cd AReaL
export SERPER_API_KEY=你的_key
export JINA_API_KEY=你的_key

python3 -m areal.launcher.local ASearcher/train/asearcher.py \
  --config ASearcher/configs/asearcher_web.yaml \
  experiment_name=my_first_run \
  trial_name=7b_single_node
  • 默认 32 轮上限,单节点大约 48 小时完成。
  • 日志实时写入 logs/ 目录,可用 TensorBoard 查看 reward 曲线。

4.4 合成你自己的 QA 数据

  1. 下载 Wikipedia 2018 快照(脚本已提供)。
  2. 起两个 SGLang 服务:

    • QwQ-32B 负责生成问题
    • Qwen2.5-72B-Instruct 负责质检
  3. 运行合成脚本

    python3 qa_synthesis/qa_synthesis_agent.py \
      --seed_path data/seed_qa.jsonl \
      --output_dir data/my_synthetic_qa
    

生成的文件直接可喂给训练脚本,实现“私人定制题库”。


5. 常见问题 FAQ

Q1:我没有 80 GB 显存,能跑吗?
可以。官方提供了 7 B 模型单节点脚本,显存需求降到 24 GB(使用 ZeRO-3 + CPU offload)。

Q2:QA 合成一定要用 72 B 模型吗?
不一定。实验表明 32 B 也能完成质检,只是 72 B 更稳。资源紧张时,可把质检温度调低、样本量减少。

Q3:为什么浏览工具要用 Jina Reader?
它返回干净 markdown,减少网页噪声,且支持并发。你也可以换成 Playwright 或自研爬虫,只要接口一致即可。

Q4:训练时出现 reward 震荡怎么办?
先确认数据集中是否有“答案不唯一”题目,可用脚本 scripts/verify_answer_uniqueness.py 自动筛。再检查 batch size 与 learning rate 是否匹配,官方 config 已给出经验值。

Q5:想接入企业内网知识库,怎么改?
search_client.py 中的 Serper API 调用替换成你的内部检索接口即可;浏览工具同理。整套 RL 训练流程无需改动。


结语

ASearcher 把“搜索”从 10 轮小游戏升级成 40 + 轮的深度调查。
它用简单的两工具(搜索 + 浏览)、完全异步的 RL 框架,以及自动生成的 2.5 万道难题,把开源模型的“查资料”能力第一次拉到专业级。

如果你正在做知识密集型应用——客服、投研、法律检索或科研助理——不妨把 ASearcher 当作“可复现、可定制”的起点。
代码、模型、数据全在 Hugging Face;剩下的事,就是把搜索场景换成你自己的。