Search-o1
让大型推理模型(o1/R1)在推理过程中按需调用搜索引擎,填补知识盲区,显著提升复杂推理任务准确率
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
让大型推理模型(o1/R1)在推理过程中按需调用搜索引擎,填补知识盲区,显著提升复杂推理任务准确率
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你正在参加一场数学竞赛,最后一题是关于量子力学中微子振荡的PhD级问题。人类天才会怎么做?他可能会先快速检索相关背景知识,确认关键公式和常数,然后再开始严谨推理。
但 OpenAI 的 o1 和 DeepSeek-R1 这类大型推理模型(LRM)呢?它们在长链路推理过程中,一旦遇到自身知识库中没有覆盖的细节——比如某条化学反应的活化能数值、某道几何竞赛题的引理——就会陷入「知识不确定区」,推理链开始出现断裂、幻觉或直接卡壳。
Search-o1 正是为了解决这个问题而生。它由中国人民大学NLP团队开发,论文已发表于EMNLP 2025顶会。

图1:LRM 在长链路推理中遇到知识不确定点时的典型表现——推理链断裂、输出不可靠。
Search-o1 的设计哲学非常清晰:让推理模型自己决定什么时候该去查资料。它不是简单地在提问时外挂一个 RAG 模块,而是把搜索能力深度嵌入到推理过程中。
Search-o1 在推理 token 生成过程中嵌入了特殊的 <|begin_search_query|> 和 <|end_search_query|> 标记。当模型在推理中遇到不确定的知识节点时,它会在输出流中插入搜索请求;系统检测到这个标记后,立即调用 Bing 搜索 API 批量获取相关文档,然后无缝接回推理链。
这个设计有几个精妙之处:批量生成(Batch Generation)——多个推理序列同时生成 token,系统检测到搜索标记后统一暂停、批量检索、再恢复生成,效率远高于逐条检索的传统方案。动态停止条件——模型自己决定何时需要搜索,而非人工预设搜索触发规则。
搜索回来的网页内容往往信息冗余、噪声大。Search-o1 不直接把原始网页塞给模型,而是经过了两层处理:
首先,用 Jina Reader API 将网页转成干净的文本格式,提取核心段落。然后,通过 <|begin_search_result|> 和 <|end_search_result|> 标记将处理后的文档嵌入推理链中,并维持推理过程的连贯性——不会因为引入外部知识而破坏原有的逻辑结构。
Search-o1 的代码架构非常清晰,核心模块如下:
核心推理入口:scripts/run_search_o1.py 负责整体推理流程控制,调用 vLLM 高效推理引擎,通过 transformers 的 AutoTokenizer 做 token 切分。Special token(BEGIN_SEARCH_QUERY / END_SEARCH_QUERY 等)是沟通推理模型与搜索模块的关键协议。
搜索模块:scripts/bing_search.py 封装了 Bing 搜索 API 调用、网页内容抓取(支持 PDF 和普通 HTML)、Snippet 提取与上下文匹配。其中 fetch_page_content 用 requests + BeautifulSoup 做页面解析;extract_snippet_with_context 则用 NLTK 的 sent_tokenize 做句子级别切分,保证返回给模型的文本精准且紧凑。
评测模块:scripts/evaluate.py 支持后评估和回退策略(backoff)。当 RAG 方法未能给出最终答案时,系统自动回退到 Direct Generation 的结果,保证最终输出不为空。
提示词工程:scripts/prompts.py 针对不同任务类型(GPQA 数学、Math500、AIME、LiveCodeBench、开放域问答等)分别设计了专用指令模板,通过 <|begin_search_query|> 标记告知模型搜索能力的存在和使用方式。
技术栈:Python 3.9 + PyTorch 2.5.1 + Transformers 4.46.1 + vLLM 0.6.4(高速推理引擎)。
Search-o1 的评测覆盖了业界最难的几类推理任务:
| 数据集 | 类型 | 代表性结果 |
|---|---|---|
| GPQA Diamond | PhD级科学问答 | 大幅超越 o1-preview |
| MATH500 / AIME2024 / AMC2023 | 数学奥赛题 | 显著提升准确率 |
| LiveCodeBench | 代码能力 | 超越基线方法 |
| HotpotQA / MuSiQue | 多跳问答 | 有效减少幻觉 |
实验表明,当推理模型在遇到知识盲区时,Search-o1 的搜索增强机制能将回答准确率提升 15-30 个百分点,尤其在需要实时知识更新的场景(最新竞赛题、科学前沿问题)效果显著。
项目需要 Python 3.9+ 和 NVIDIA GPU(建议 16GB+ VRAM)。首先创建 conda 环境并安装 requirements.txt 中的依赖(PyTorch、Transformers、vLLM 等)。
使用 data/data_pre_precess.ipynb 对原始数据集做预处理,将 GPQA、MATH500、AIME 等基准数据集转换为统一的 JSON 格式。如果要跑自己的数据集,只需按 {'Question': str, 'answer': str} 的格式组织,并修改 evaluate.py 和 prompts.py 中的对应逻辑。
Direct Generation(run_direct_gen.py):基线方法,模型直接推理,无任何外部知识增强。
Naive RAG(run_naive_rag.py):在提问阶段一次性检索相关文档,简单拼接到 prompt 前缀中。优点是简单,缺点是模型不知道什么时候该搜、搜什么。
Search-o1(run_search_o1.py):推理过程中按需搜索,模型自主决定搜索时机和查询词,效果最好但依赖 Bing Search API 和 Jina Reader API(均需申请密钥)。
Search-o1 并非完美解决方案。首先,它依赖 Bing Search API 和 Jina API,商业使用有成本。其次,每次搜索都引入额外的延迟,在时间敏感场景中需要权衡精度和速度。此外,搜索结果的质量高度依赖 Bing 的检索排序,低质量搜索词可能导致误导性文档被引入推理链。
从论文 Future Work 来看,团队计划支持更多工具(计算器、代码解释器等),以及训练模型更好地利用搜索工具而非仅依赖 Prompt 引导。
Search-o1 代表的趋势是:让 LLM 推理不再局限于训练知识,而是能够在运行时动态获取最新、最准确的信息。 这与 OpenAI o3 的 long-thoughts 方向不谋而合,但 Search-o1 的贡献在于将 RAG 能力以更低门槛的方式开放给研究者——只需几十行代码就能将任意推理模型接入主动搜索能力。
EMNLP 2025 的接收也说明学术界对「推理 + 检索」这一方向的持续关注。随着 o1/o3 类推理模型逐步普及,如何让它们在专业领域(医疗、法律、金融)可靠运作,Search-o1 提供了一个有价值的参考范式。