论文:https://arxiv.org/pdf/2501.05366Search-o1 的核心思想是让大模型在推理过程中自主判断何时缺乏知识,并主动生成搜索查询以调用外部检索模块获取补充文档。随后通过设计的 Reason-in-Documents 模块对冗长检索结果进行“分析—精炼”,提取有用信息再注入后续推理,从而减少噪声干扰。
Step 1:明确工作流结构
我们首先回顾 Search-o1 算法流程图:

Step 2:实现必要Tool
Step 2.1:实现 Prompt Server
在 Search-o1 推理流程中,Prompt Server 主要承担两个任务:- 构建初始化提示语(带有搜索能力说明)
- 组织“搜索 → 推理”的交替流程,包括插入搜索结果和文档分析
prompt/search_o1_reasoning.jinja
中定义提示模板,样例如下:
servers/prompt/src/prompt.py
prompt/search_o1_refinement.jinja
,示例如下:
servers/prompt/src/prompt.py
reasoning_indoc_template
,请不要忘了在 servers/prompt/parameter.yaml
中显式注册:
<|begin_search_result|>
…<|end_search_result|>
内容追加到现有 prompt 中:
servers/prompt/src/prompt.py
Step 2.2:实现 Router Server
在servers/router/src/router.py
中添加:
servers/router/src/router.py
<|im_end|>
或 <|end_search_query|>
等终止符。
Step 2.3:实现 Custom Server
在 servers/custom/src/custom.py
中添加:
servers/custom/src/custom.py
<search>
标签内的查询字符串。
Step 3:编写 Pipeline 配置文件
按照上述流程,在examples/
下新建一个 search_o1.yaml
:
Step 4:配置 Pipeline 参数
执行下列命令:examples/parameter/search_o1.yaml
,可根据需求修改 benchmark、retriever、generation 等参数配置,或提前在各 Server 下的 parameter.yaml
文件中设置默认值再进行 build。