3 方法论

本文为论文《Search-o1:让推理模型学会边思考边检索》「中文全文翻译」板块的对应章节,与「论文原文」板块同一章节一一对应,层级保持一致。

3.1 问题公式化

我们考虑一个需要多步推理并检索外部知识以得出解决方案的复杂推理任务。目标是为每个问题 $q$ 生成一个综合解决方案,包含逻辑推理链 $\mathcal{R}$ 与最终答案 $a$。在本工作中,我们使推理模型能够在推理过程中利用外部知识源。具体而言,在问题求解过程中,我们考虑三个主要输入:任务指令 $I$、问题 $q$ 以及外部检索文档 $\mathcal{D}$。其中,$I$ 对推理任务提供总体描述,$q$ 是待回答的具体复杂问题,而 $\mathcal{D}$ 包含从相关知识库动态检索的背景知识。

目标是设计一种推理机制,能够有效整合 $I$、$q$ 与 $\mathcal{D}$ 以产生连贯的推理链 $\mathcal{R}$ 和最终答案 $a$。这可以形式化为映射 $(I,q,\mathcal{D})\rightarrow(\mathcal{R},a)$。推理序列与最终答案的生成可表示为:

| | $P(\mathcal{R},a\mid I,q,\mathcal{D})=\underbrace{\prod_{t=1}^{T_{r}}P(\mathcal{R}{t}\mid\mathcal{R}{where $T_{r}$ 是推理序列 $\mathcal{R}$ 中的 token 数量。位置 $t$ 处的 token 为 $\mathcal{R}{t}$,而 $\mathcal{R}{

3.2 Search-o1 框架概览

Search-o1 框架通过将外部知识检索无缝整合到推理过程,同时保持思维链连贯性,解决了大推理模型(LRM)中的知识不足问题。如图 2 所示,我们展示了三种方法的对比分析: vanilla reasoning、代理式检索增强生成(RAG)以及我们提出的 Search-o1 框架。

  • •

Vanilla Reasoning Pattern(直接推理模式):考虑图 2(a) 中的示例,任务涉及确定三步化学反应最终产物中的碳原子数量。直接推理方法在遇到知识缺口(例如“反式肉桂醛的结构”)时会失效。如果没有准确信息,模型必须依赖假设,可能导致后续推理步骤中出现级联错误。

  • •

Agentic RAG(代理式 RAG):为弥补推理过程中的知识缺口,我们构建了代理式 RAG 机制(图 2(b)),使模型在需要时能够自主检索外部知识。当出现不确定性时,例如关于化合物结构,模型会生成有针对性的检索查询(例如“trans-Cinnamaldehyde 的结构”)。然而,直接插入检索到的文档(这些文档通常包含冗长且无关的信息)可能会扰乱推理流程并损害连贯性。

  • •

Search-o1:我们的 Search-o1 框架(图 2(c)) 扩展了代理式 RAG 机制,引入了 Reason-in-Documents 模块。该模块将检索到的文档浓缩为专注的推理步骤,将外部知识整合进推理链,同时保持推理链的逻辑流程。它考虑当前检索查询、检索到的文档以及现有的推理链,以生成连贯的步骤。此迭代过程持续进行,直到达到最终答案。接下来的各节将详细说明代理式 RAG、Reason-in-Documents 和 Search-o1 推理过程。

3.3 代理式检索增强生成机制

代理式 RAG 机制是 Search-o1 框架的关键组件,它使推理模型能够自主确定在推理过程中何时检索外部知识。这种机制允许模型本身决定是继续生成推理步骤,还是启动检索步骤。详细的模型指令可见附录 A.1。

在推理链 $\mathcal{R}$ 生成过程中,模型可能会间歇性地生成被特殊符号 <|begin_search_query|> 和 <|end_search_query|> 包围的检索查询 $q_{\text{search}}^{(i)}$,其中 $i$ 索引第 $i$ 个检索步骤。每个检索查询均基于推理过程的当前状态与先前检索到的知识生成。每个检索查询的生成表示为:

| | $P(q_{\text{search}}^{(i)}\mid I,q,\mathcal{R}^{(i-1)})=\prod_{t=1}^{T_{q}^{(i)}}P\left(q_{\text{search},t}^{(i)}\mid q_{\text{search},where $T_{q}^{(i)}$ 是第 $i$ 个检索查询的长度,$q_{\text{search},t}^{(i)}$ 表示第 $i$ 个检索查询中步骤 $t$ 生成的 token,而 $\mathcal{R}^{(i-1)}$ 表示第 $i$ 个检索步骤之前的所有推理步骤,包括检索查询与检索结果。

一旦在推理序列中检测到新的特殊符号对,我们就会暂停推理过程,提取检索查询 $q_{\text{search}}^{(i)}$,并调用检索函数 Search 以获取相关文档:

| | $\mathcal{D}^{(i)}=\texttt{Search}(q_{\text{search}}^{(i)}),$ | | (3) |

其中 $\mathcal{D}^{(i)}={d_{1}^{(i)},d_{2}^{(i)},\ldots,d_{k_{i}}^{(i)}}$ 表示为第 $i$ 个检索查询检索到的 top-$k_{i}$ 相关文档集合。检索到的文档 $\mathcal{D}^{(i)}$ 随后被插入推理链 $\mathcal{R}^{(i-1)}$ 中,位于特殊符号 <|begin_search_result|> 和 <|end_search_result|> 之间,使推理模型能够利用外部知识继续推理过程。

这种代理机制使模型能够动态且高效地融合外部知识,在避免过多或无关检索结果带来的信息过载的同时,保持推理过程的连贯性与相关性。

3.4 通过 Reason-in-Documents 进行知识精炼

尽管代理式 RAG 机制解决了推理中的知识缺口,但直接插入完整文档会因其长度和冗余性而扰乱连贯性。为克服这一问题,Search-o1 框架包含了知识精炼模块,它通过使用原始推理模型的独立生成过程,有选择地仅将相关且简洁的信息整合到推理链中。该模块处理检索到的文档,使其与模型的特定推理需求对齐,将原始信息转化为精炼且相关的知识,同时保持主推理链的连贯性与逻辑一致性。

Reason-in-Documents 的精炼指南详见附录 A.1。这些指南指导模型基于先前的推理步骤、当前检索查询以及检索网页的内容来分析检索到的网页。目标是提取直接促进原始问题推理过程的相关且准确的信息,确保其无缝整合到现有的推理链中。

对于每个检索步骤 $i$,令 $\mathcal{R}^{(where $T_{d}^{(i)}$ 是中间推理序列的长度,而 ${r}{\text{docs},t}^{(i)}$ 表示步骤 $t$ 处的 token。基于此分析生成精炼知识 ${r}{\text{final}}^{(i)}$:

| | $P({r}{\text{final}}^{(i)}\mid{r}{\text{docs}}^{(i)},\mathcal{R}^{(where $T_{r}^{(i)}$ 是精炼知识序列的长度,而 ${r}{\text{final},t}^{(i)}$ 表示步骤 $t$ 处的 token。生成的精炼知识 ${r}{\text{final}}^{(i)}$ 随后被整合到推理链 $\mathcal{R}^{(i)}$ 中,使模型能够在获取外部知识的同时继续生成连贯的推理步骤。

| | $P(\mathcal{R},a\mid I,q)=\prod_{t=1}^{T_{r}}P\left(\mathcal{R}{t}\mid\mathcal{R}{where ${r_{\text{final}}^{(j)}}_{j\leq i(t)}$ 表示截至第 $i(t)$ 个检索步骤的所有先前精炼知识。此处 $i(t)$ 表示与当前推理步骤 $t$ 对应的检索步骤索引。这种精炼知识整合确保每个推理步骤都能获取相关外部信息,同时保持推理过程的简洁与专注。

Algorithm 1 Search-o1 推理

3.5 Search-o1 推理过程

单个问题的推理逻辑。

对每个问题,Search-o1 推理通过将任务指令 $I$ 与特定问题 $q$ 串联来初始化推理序列。随着推理模型 $\mathcal{M}$ 生成推理链 $\mathcal{R}$,它可能会产生被特殊符号 <|begin_search_query|> 和 <|end_search_query|> 包围的检索查询。在检测到 <|end_search_query|> 符号后,会提取相应的检索查询 $q_{\text{search}}$,触发检索函数 Search 以获取相关外部文档 $\mathcal{D}$。随后,这些检索到的文档连同推理-文档指令 $I_{\text{docs}}$ 与当前推理序列 $\mathcal{R}$ 一起,被 Reason-in-Documents 模块处理。该模块将原始文档精炼为简洁且相关的信息 $r_{\text{final}}$,并将其在符号 <|begin_search_result|> 和 <|end_search_result|> 之间无缝整合回推理链 $\mathcal{R}$。这一迭代过程确保推理模型在保持连贯性和逻辑一致性的同时融入必要的外部知识,从而生成综合的推理链 $\mathcal{R}$ 和最终答案 $a$。

批量推理机制。

为高效同时处理多个问题,Search-o1 框架采用批量推理机制,优化了 token 生成与知识精炼。首先,通过将任务指令 $I$ 与批量 $\mathcal{Q}$ 中的每个问题 $q$ 串联,创建一组未完成的推理序列 $\mathcal{S}$。接着,推理模型 $\mathcal{M}$ 为 $\mathcal{S}$ 中的所有序列并行生成 token,推进每个推理链,直至其完成或需要外部知识检索。当在任何序列中识别出检索查询时,会提取相应的查询,并通过 Search 函数批量处理以获取相关文档 $\mathcal{D}$。随后,这些文档由 Reason-in-Documents 模块集体精炼,为每个序列生成精炼知识 $r_{\text{final}}$。精炼知识随后被插回各自的推理链中。已完成的序列被移至完成集 $\mathcal{F}$,而仍在进行的序列则保留在 $\mathcal{S}$ 中以供进一步处理。通过利用生成与精炼步骤的并行处理,批量推理机制提升了处理多个并发输入时的系统吞吐量。