【阿里DeepResearch】写作组件WebWeaver详解
以下是针对论文《WebWeaver: Structuring Web-Scale Evidence with Dynamic Outlines for Open-Ended Deep Research》的数据构造、训练方式和效果提升的纯技术细节拆解。
一、数据构造方式:WebWeaver-3k —— 基于真实人类问题的高质量轨迹数据
核心目标:构建能教会小模型执行“规划-搜集-写作”完整研究流程的监督微调(SFT)数据,而非用于强化学习的合成数据。
详细过程与中文示例
-
数据来源:从互联网上爬取真实、开放式的复杂研究问题。
- 原文描述:“The process began by sourcing a diverse set of queries crawled from the web…”
- 示例问题:“帕金森病在不同阶段有哪些潜在的健康预警信号?作为家属,哪些具体迹象应促使我们干预或寻求医疗建议?对于接受过深部脑刺激(DBS)手术的患者,可以实施哪些日常生活调整和支持策略来提高他们的舒适度和整体幸福感?”
-
数据生成:使用一个强大的“教师模型”(如Claude-sonnet-4),在WebWeaver框架内完整执行研究任务,生成端到端的轨迹。
- 原文描述:“…processed by a powerful, tier teacher model, instantiated within our WebWeaver agent framework.”
- 轨迹内容:包含完整的“思考-行动-观察”日志,涵盖规划阶段的多次搜索、大纲优化,以及写作阶段的多次证据检索和分段撰写。
-
数据筛选:实施严格的质量控制协议,仅保留成功执行完整工作流且严格遵守预定义动作格式的轨迹。
- 原文描述:“A stringent filtering protocol was applied… retaining only those where the agent successfully executed the entire workflow and strictly adhered to the predefined action format.”
- 筛选标准:
- 最终生成的报告必须结构完整、逻辑清晰。
- 每一步“思考”必须合理,每一步“行动”(如
search
,write_outline
,retrieve
)必须符合规范。 - 大纲中的每个章节必须有对应的证据引用
<citation>id_xx</citation>
。
-
数据规模与统计:最终得到一个高质量数据集,包含3.3k条规划轨迹和3.1k条写作轨迹。
- 平均统计(见Table 4):
- 规划阶段:平均14.67次搜索,2.18次大纲优化,处理62,637个证据token。
- 写作阶段:平均22.76次写作步骤,生成22,637个输出token。
- 核心价值:这些统计数据证明了OEDR任务的复杂性,为小模型提供了学习“长序列推理”和“工具调用”的黄金样本。
- 平均统计(见Table 4):
工程化提示:
- 不要自己编问题。直接从知乎、Quora、专业论坛等平台爬取真实的、复杂的、开放式的研究型问题。
- 用最好的模型生成数据。数据质量决定模型上限,务必使用当前最强的闭源或开源模型作为“教师”。
- 强制结构化输出。在Prompt中明确规定输出格式(如必须包含
<write_outline>
,<citation>
,<write>
标签),便于后续自动化筛选和模型学习。
二、训练方式:监督微调(SFT)冷启动 + 框架即能力
核心目标:通过SFT,将“教师模型”在WebWeaver框架中展现的复杂能力(思考、搜索、写作)蒸馏到一个小模型中,使其能独立执行完整的OEDR流程。
详细过程
-
SFT冷启动:这是唯一的训练阶段。论文没有使用强化学习(RL),而是完全依赖SFT。
- 原文描述:“To bridge this critical gap, we constructed a high-quality Supervised Fine-Tuning (SFT) dataset: WebWeaver-3k… By fine-tuning our base model on this data, we explicitly imbued it with the requisite long-sequence reasoning and tool-use capabilities to master our framework.”
- 基座模型:Qwen3-30b-a3b-Instruct-2507。
-
训练目标:让模型学会在ReAct框架下,根据上下文生成正确的“思考”和“行动”。
- 输入:用户问题 + 之前的“思考-行动-观察”历史。
- 输出:当前步骤的“思考” + “行动”(如
{"name": "search", "arguments": {...}}
或<write_outline>...</write_outline>
)。
-
框架即能力:论文的核心思想是,框架本身(动态大纲+分层写作)就是一种能力。通过SFT教会模型使用这个框架,就等于教会了它如何进行深度研究。
- 原文描述:“…enabling a smaller model to achieve expert-level performance.” SFT后的Qwen3-30B模型在多个基准测试上超越了许多更大的模型和闭源系统。
工程化提示:
- 放弃RL,专注SFT。对于OEDR任务,高质量的SFT数据比复杂的RL算法更重要、更有效。
- 教模型“按剧本演”。SFT的目标不是让模型自由发挥,而是让它严格遵循“规划→搜集→优化大纲→分段写作→引用证据”的剧本。
- 上下文长度是关键。确保基座模型支持超长上下文(如128K),以容纳复杂的轨迹数据。
三、效果提升:小模型击败大模型,框架设计是核心
核心指标:
- DeepResearch Bench: 50.62 (SOTA, 超越Gemini-2.5-pro-deepresearch的49.71)
- DeepConsult: 6.96 平均分 (SOTA)
- DeepResearchGym: 96.77 平均分 (SOTA)
效果提升来源分析
-
动态大纲(Dynamic Outline)是核心。
- 实验验证(Fig. 5, 6):随着大纲优化轮数的增加(1轮→2轮→3轮),报告的“全面性”(Comprehensiveness)、“深度”(Depth)、“支持度”(Support)等指标显著提升。
- LLM评估(Fig. 7, 8):LLM直接评估大纲质量,结果显示优化后的大纲在“深度”、“广度”、“支持度”上得分更高。
- 工程价值:动态大纲让模型能像人类一样,边研究边调整方向,发现并深入研究初始计划中未预料到的重要维度。
-
分层写作(Hierarchical Writing)解决长上下文问题。
- 实验验证(Fig. 9, 10):与“一次性喂入所有证据”的暴力写作方法相比,分层写作在“洞察力”(Insight)和“可读性”(Readability)上提升巨大(40.97→50.02, 42.29→49.79)。
- 机制:写作时,只检索当前章节所需的证据,写完后从上下文中移除,再检索下一章节的证据。这避免了“中间丢失”和“上下文干扰”。
- 工程价值:这是处理超长报告(2万+ token)的唯一可行方案,确保模型在每个写作步骤都能聚焦于最相关的证据。
-
SFT数据的威力。
- 实验验证(Fig. 12):经过SFT的Qwen3-30B模型,其“引用准确性”从25%飙升至85.9%,证明它学会了如何精确检索证据并按大纲写作。
- 工程价值:高质量的SFT数据能让一个小模型掌握复杂的工作流,实现“四两拨千斤”的效果。
工程化提示:
- 必须实现动态大纲。这是WebWeaver的灵魂,没有它,你的系统就是一个高级版的“搜索-总结”工具。
- 必须实现分层写作。这是保证长报告质量和模型稳定性的技术基石。
- 评估时关注过程。不要只看最终报告的分数,要分析大纲优化了多少次、引用了多少证据、写作分了多少步,这些过程指标更能反映系统能力。
四、问题分析
问题1:规划轨迹和写作轨迹大概长什么样子?如何确保规划准确?如何确保写作符合规则?
- 轨迹样子:规划轨迹是一系列交替的
<think>...<search>...<write_outline>...
步骤;写作轨迹是一系列<think>...<retrieve>...<write>...
步骤。每一步的“思考”都必须逻辑连贯,每一步的“行动”都必须严格符合预定义的JSON或XML格式(如{"name": "search", "arguments": {...}}
)。 - 确保规划准确:通过动态大纲的迭代优化。规划者不是一次性生成大纲,而是在每次搜索后,用新证据修正和扩展大纲(见问题2)。论文Fig. 5, 6证明,大纲优化轮数越多,报告的“全面性”和“深度”得分越高。
- 确保写作符合规则:通过强制引用机制。写作时,模型只能引用大纲中已有的
<citation>id_xx</citation>
。在SFT数据中,所有成功的轨迹都严格遵守此规则。模型在写作时,会先执行retrieve
动作获取对应ID的证据,再基于这些证据写作,这从根本上防止了幻觉。
问题2:动态大纲如何生成?
- 初始大纲:基于初始搜索结果,生成一个初步的、较粗略的大纲。
- 动态优化:在后续的每一次搜索后,规划者会重新审视大纲:
- 扩展:如果新证据揭示了初始大纲未覆盖的重要维度(如“帕金森病”案例中发现“DBS设备安全”这一新主题),就新增章节。
- 细化:将已有章节拆分为更具体的子章节。
- 引用绑定:为每个章节/子章节显式链接到内存库中的证据ID(如
<citation>id_54</citation>
)。
- 终止条件:当规划者认为大纲已足够全面,能覆盖问题的所有方面时,输出
<terminate>
。
【有意思发现】:论文Fig. 4显示,在WebWeaver-3k数据集中,59%的案例进行了2轮大纲优化,21%进行了3轮。这证明单次静态大纲是远远不够的,动态迭代是高质量研究的必要条件。
问题3:分层写作是什么意思?
- 核心思想:不一次性喂入所有证据,而是按大纲章节,逐个处理。
- 具体流程:
- 写作器从大纲中取出第一个章节(如“帕金森病早期症状”)。
- 执行
retrieve
动作,只从内存库中拉取该章节引用的证据(如id_2, id_5, id_7
)。 - 在“思考”步骤中,只基于这些相关证据进行内部推理和内容规划。
- 执行
write
动作,生成该章节的文本。 - 关键一步:在开始写下一章节前,将本章节的证据从上下文中移除(或用占位符替换),以释放上下文空间。
- 解决的问题:此方法直接解决了“中间丢失(lost in the middle)”和“上下文干扰(contextual bleeding)”问题。如Fig. 9, 10所示,与一次性喂入所有证据的“暴力写作”相比,分层写作在“洞察力”和“可读性”上提升巨大(40.97→50.02, 42.29→49.79)。
问题4:是否是先进行规划、再进行写作?
是的,严格分阶段、串行执行。
- 规划阶段:由 Planner 智能体 负责。它通过多轮
search
和write_outline
交替执行,最终输出一个带引用ID的、结构完整、经过多次优化的动态大纲,并以<terminate>
动作结束。 - 写作阶段:由 Writer 智能体 负责。它只有在规划阶段完全结束后才开始工作。Writer 的输入是 Planner 产出的最终大纲和一个已填充好的“证据记忆库(Memory Bank)”。
- 关键证据:论文图3(Workflow of WebWeaver)清晰地将整个流程分为左右两部分:左侧是 Planner 的“Research Cycle”,右侧是 Writer 的“Hierarchical Writing”。两者之间通过“Outline”和“Memory Bank”进行数据传递,没有交叉或并行。
工程化提示:在您的系统中,必须将 Planner 和 Writer 实现为两个独立的执行单元。Planner 的终止是 Writer 启动的唯一信号。
问题5:SFT阶段主要训练哪些能力?动态大纲生成需要训练吗?分层写作需要训练吗?是一起训练还是分开训练?
SFT阶段训练的是“规划”和“写作”两种能力,它们被封装在一个统一的端到端轨迹中,但由两个不同的智能体(Planner/Writer)分别执行。动态大纲和分层写作都是核心训练目标,且是“一起训练”的。
详细拆解:
-
SFT数据构成:
- 数据集 WebWeaver-3k 包含 3.3k条规划轨迹 和 3.1k条写作轨迹。
- 这些轨迹是由一个强大的“教师模型”(如Claude-sonnet-4)在 完整的WebWeaver框架内 端到端执行生成的。
- 一条完整的训练样本 = 规划轨迹 + 写作轨迹。
-
训练的能力:
- 动态大纲生成能力:这是 Planner 智能体 的核心能力。SFT数据中的规划轨迹,完整记录了如何从一个初始大纲,通过多轮搜索和思考,迭代优化出最终大纲的全过程。模型通过学习这些轨迹,掌握了“何时扩展章节”、“何时添加新主题”、“如何将证据ID绑定到大纲节点”等关键技能。
- 分层写作能力:这是 Writer 智能体 的核心能力。SFT数据中的写作轨迹,完整记录了如何根据大纲中的引用ID,逐章节地执行
retrieve
动作获取证据,进行内部思考,然后执行write
动作生成文本,并在完成后清理上下文的全过程。模型通过学习这些轨迹,掌握了“如何聚焦于当前章节”、“如何避免上下文干扰”、“如何精确引用证据”等关键技能。
-
训练方式:一起训练,但角色分离:
- 不是分开训练:论文没有为Planner和Writer分别准备独立的数据集或训练流程。
- 是一起训练:整个SFT过程是将 完整的、端到端的ReAct轨迹(包含Planner和Writer的所有
<think>
,<search>
,<write_outline>
,<retrieve>
,<write>
步骤)作为输入,对一个单一的基座模型(Qwen3-30B)进行微调。 - 角色由动作标签区分:模型通过学习轨迹中的动作标签(如
<write_outline>
vs<write>
)来区分自己当前应扮演Planner还是Writer的角色。框架本身(即动作空间的定义)就是能力的一部分。
工程化提示:
- 不要拆分训练。构建一个能生成完整“规划+写作”轨迹的教师模型,然后用这个端到端轨迹去微调您的基座模型。
- 动作标签是关键。在构造SFT数据时,必须严格使用
<write_outline>
和<write>
等标签来明确区分规划和写作行为,这是模型学会角色切换的核心信号。 - 动态大纲和分层写作是“涌现”能力。只要SFT数据质量高、轨迹完整,模型在统一训练后,就能在推理时自动按需切换Planner和Writer模式,无需额外干预。
问题6:模型时如何做到“在后续的每一次搜索后,规划者会重新审视大纲”?
模型通过 “显式动作触发 + 结构化记忆绑定” 实现“在每次搜索后重新审视大纲”,其核心机制如下:
1. 每次搜索后,强制执行 <write_outline>
动作
在 WebWeaver 的 ReAct 框架中,规划者(Planner)的行动空间包含三个动作:search
、write_outline
和 terminate
。
关键设计:在每次 search
动作返回结果后,规划者必须执行一次 <write_outline>
动作(见论文 Section 3.2 和附录 B.2 的轨迹示例)。
原文轨迹示例(中文转写):
- Step 1:
<search>
→ 获取帕金森病阶段信息- Step 2:
<search>
→ 获取家庭紧急预警信号- Step 3:
<search>
→ 获取 DBS 手术信息- Step 5:
<write_outline>
→ 生成初始大纲- Step 6:
<search>
→ 获取 DBS 舒适护理新信息- Step 7:
<write_outline>
→ 更新大纲,新增“设备安全与维护”子章节
这表明,<write_outline>
不是一次性动作,而是每次获得新证据后都必须调用的反思与优化步骤。
2. 大纲与证据通过 引用ID强绑定
每次 <write_outline>
生成的大纲,会显式引用内存库(Memory Bank)中的证据 ID,格式为 <citation>id_xx</citation>
。
原文示例:
1.1.1 A. Definition <citation>id_1</citation> 1.1.2 B. Evolution from Traditional Sports...<citation>id_2</citation>
当新搜索返回新证据(如 id_54
),规划者在下一次 <write_outline>
中会:
- 扩展大纲结构(如新增 “1.1.3 C. Role of Multimodal Data Fusion”)
- 绑定新引用(
<citation>id_3</citation>
)
这种结构+引用的双重更新,确保大纲始终与最新证据对齐。
3. “重新审视”的触发逻辑由 内部思考(<think>
)驱动
在每次 <write_outline>
前,规划者会先执行 <think>
步骤,显式分析新证据对大纲的影响。
原文
<think>
示例(Step 7 前):“I have now created a comprehensive outline… However, I should search for any additional information that might be missing, particularly around specific comfort measures…”
搜索后
<think>
(Step 7):“I have now created a comprehensive, detailed outline that addresses all aspects… The outline is well-structured with four levels of hierarchy and covers all essential aspects.”
这表明,“重新审视”不是自动的,而是由模型在 <think>
中主动判断“是否有新维度需加入大纲”,再决定如何优化。
工程化实现要点
- 动作空间设计:必须将
write_outline
作为独立动作,而非隐式步骤。 - 引用机制:所有证据入库时分配唯一ID,大纲必须通过
<citation>
引用。 - 思考引导:在 Planner 的 Prompt 中明确要求:“每次搜索后,评估新证据是否需要扩展或修改大纲,并生成新版本。”
此机制确保大纲是动态、可追溯、与证据强耦合的活文档,而非静态模板。问题6:模型时如何做到“在后续的每一次搜索后,规划者会重新审视大纲”?