把搜索做得更深:ASearcher 如何用异步强化学习让大模型“查资料”超过 40 轮
如果让一位普通人去网上查一篇冷门论文里提到的实验动物,他可能会在两三次搜索后放弃;而今天的开源大模型,通常被限制在 10 轮以内 的工具调用——再长,训练框架就撑不住了。
ASearcher 的出现打破了这层天花板:经过强化学习训练后,同一个 32 B 参数的模型可以连续调用搜索与浏览工具 40 次以上,并输出 15 万 tokens 的推理过程,最终把答案找全、找对。这篇文章用对话的方式,带你完整拆解 ASearcher 是怎么做到的,以及你可以怎样复现、微调甚至定制自己的“深度搜索代理”。
目录
-
为什么要让搜索“超过十轮”? -
ASearcher 的三板斧:数据、训练框架、代理设计 -
效果到底如何?——用数字说话 -
手把手:在自己的机器上跑起来 -
常见问题 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 合成代理的两把刷子
-
Injection(加料):把“迈克尔·海因的出生年份”升级成“曾任纽约阿尔斯特县执行官、允许 2016 年铁路继续运营的那位埃克德学院校友的出生年份”。 -
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 张 80 GB A100(7 B 模型),推荐 16 节点 8×A100(训练 7 B)。 -
系统:Ubuntu 20.04+,Python 3.10。 -
克隆仓库 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 数据
-
下载 Wikipedia 2018 快照(脚本已提供)。 -
起两个 SGLang 服务: -
QwQ-32B
负责生成问题 -
Qwen2.5-72B-Instruct
负责质检
-
-
运行合成脚本 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;剩下的事,就是把搜索场景换成你自己的。