资讯详情

Search-R1 检索服务部署实战指南:从 BM25 稀疏检索到 e5 稠密向量与在线搜索引擎的启动与配置

📅 2026/10/12 1:42:09 | 华诺云谱 👁 阅读
Search-R1 检索服务部署实战指南:从 BM25 稀疏检索到 e5 稠密向量与在线搜索引擎的启动与配置
人工智能大模型强化学习RLHFRAG工具调用【免费下载链接】Search-R1Search-R1: An Efficient, Scalable RL Training Framework for Reasoning Search Engine Calling interleaved LLM based on veRL项目地址https://gitcode.com/gh_mirrors/se/Search-R1点击查看免费下载Search-R1 是基于 veRL 的推理与检索调用交错强化学习训练框架其核心训练流程要求一个始终在线的检索服务LLM 在生成过程中输出search查询/search动作后由该服务返回 top-k 篇文档作为information观测喂回模型。本文以仓库文档 docs/retriever.md 为骨架系统讲解本地稀疏检索器BM25、本地稠密检索器e5含 Flat 与 ANN 两种索引以及在线搜索引擎SerpAPI / Google Custom Search的索引获取、服务启动与参数配置并结合 search_r1/search 目录下的真实源码说明其底层实现。读完本文你将能够根据语料特性与硬件条件正确选型、独立拉起任一检索服务并将其通过retriever.url接入 Search-R1 的 PPO/GRPO 训练。一、检索器在 Search-R1 中的定位在 Search-R1 的训练闭环中检索服务通过 HTTP 接口与强化学习流程解耦。训练侧配置位于 verl/trainer/config/ppo_trainer.yamlretriever: url: http://127.0.0.1:8000/retrieve topk: 3训练器 verl/trainer/ppo/ray_trainer.py 将这两个字段注入生成管理器的GenerationConfig随后 search_r1/llm_agent/generation.py 以POST {search_url}携带{queries: [...], topk: ..., return_scores: true}发起批量检索再把返回的文档按Doc N(Title: 标题)\n正文的格式拼进information观测。因此本文介绍的每一个检索服务都必须对外暴露POST /retrieve端点且返回体统一为{result: [[{document: {contents: 标题\n正文}}]]}结构——这正是仓库中三类服务器本地检索、SerpAPI、Google共同遵守的协议也是它们能被无缝替换接入训练的原因。一个完整的多轮检索交互示例见 example/case.txt模型先searchPaul Walkers cars in Fast and Furious /search服务端返回 3 篇文档包裹在information.../information中模型可据此继续搜索或直接answer Charger /answer收尾。二、如何选择检索器四条选型路径仓库文档给出的选型决策树如下直接决定你要部署哪一类服务有私有或领域专用语料→ 选择本地检索器领域内没有高质量的稠密检索embedding模型可用 → 选择稀疏本地检索器BM25否则选择稠密本地检索器GPU 资源不足以承担精确稠密向量匹配 → 选择ANN 索引 CPU方案GPU 资源充足 → 选择Flat 索引 GPU方案。目标是训练通用的 LLM 搜索智能体且有足够预算→ 选择在线搜索引擎如 SerpAPI。已有领域专用在线搜索引擎如 PubMed 搜索→ 参照 serp_search_server.py 的封装方式自行实现并接入 Search-R1。所有检索服务的启动脚本集中在 example/retriever 目录仓库根目录下也提供了 e5 Flat 检索服务的默认启动脚本 retrieval_launch.sh。三、本地稀疏检索器BM25BM25 是经典的传统检索方法检索过程高效、完全不需要 GPU但在特定领域上精度可能不如稠密检索器。Search-R1 的 BM25 实现基于 Pyserini 的 Lucene 索引见 retrieval.py 中的BM25Retriever通过LuceneSearcher加载预构建索引并完成 top-k 检索。3.1 下载预构建索引仓库示例使用 wiki-18 语料其 BM25 索引已上传至 Hugging Face用如下命令下载save_path/your/path/to/save huggingface-cli download PeterJinGo/wiki-18-bm25-index --repo-type dataset --local-dir $save_path3.2 启动本地 BM25 检索服务conda activate retriever index_file$save_path/bm25 corpus_file$save_path/wiki-18.jsonl retriever_namebm25 python search_r1/search/retrieval_server.py --index_path $index_file --corpus_path $corpus_file --topk 3 --retriever_name $retriever_name脚本化的等价命令见 example/retriever/retrieval_launch_bm25.sh。启动后服务默认监听0.0.0.0:8000。3.3 源码层面说明retrieval_server.py 中BM25Retriever会先检查索引是否内嵌文档内容searcher.doc(0).raw()是否非空若索引只含 docid则通过datasets.load_dataset加载corpus_path指定的 jsonl 语料按 docid 取回原文。返回的每条文档包含title首行去除引号与text其余各行与训练侧Doc N(Title: ...)的格式约定一致。--topk缺省为 3当命中数不足 topk 时源码会打印Not enough documents retrieved!警告retrieval_server.py。四、本地稠密检索器e5 与 Faisse5 等开箱即用的稠密检索模型在特定领域通常显著强于稀疏检索器。其代价是需要用 embedding 模型为语料构建向量索引并在检索时执行向量匹配。Search-R1 的DenseRetrieverretrieval.py基于 Faiss 索引 预训练 Encoder查询经编码后调用index.search()取 top-k 向量再映射回语料原文。仓库文档推荐GPU 充足时用 Flat 索引否则用 ANN 索引。4.1 Flat 索引精确匹配GPU 加速Flat 索引执行精确的向量匹配速度较慢但准确度高。为了支撑在线 RL 训练对吞吐的要求文档明确建议通过--faiss_gpu开启 GPU 计算。(1) 下载索引与语料save_path/the/path/to/save python scripts/download.py --save_path $save_path cat $save_path/part_* $save_path/e5_Flat.index gzip -d $save_path/wiki-18.jsonl.gz其中 scripts/download.py 从PeterJinGo/wiki-18-e5-index下载part_aa、part_ab两个分片--repo_id与--save_path为可配参数并从PeterJinGo/wiki-18-corpus下载wiki-18.jsonl.gz分片需自行拼接为完整的e5_Flat.index语料需解压为wiki-18.jsonl。(2) 启动本地 Flat e5 检索服务conda activate retriever index_file$save_path/e5_Flat.index corpus_file$save_path/wiki-18.jsonl retriever_namee5 retriever_pathintfloat/e5-base-v2 python search_r1/search/retrieval_server.py --index_path $index_file --corpus_path $corpus_file --topk 3 --retriever_name $retriever_name --retriever_model $retriever_path --faiss_gpu源码原理--faiss_gpu触发 retrieval_server.py 中的faiss.index_cpu_to_all_gpus将索引复制到全部可用 GPU 并分片shardTrue且以 FP16 存储向量useFloat16True以节省显存。Query 编码在 retrieval.py 的Encoder中完成e5 模型要求 query 加query: 前缀、passage 加passage: 前缀默认采用meanpooling编码结果做 L2 归一化DPR 除外--retriever_model缺省即为intfloat/e5-base-v2。若模型名包含bge则会自动套用 bge 的指令式前缀。4.2 ANN 索引HNSW64CPU 高效近似检索当只有 CPU 可用时可采用近似最近邻ANN索引提升检索效率例如 HNSW64。它非常高效但精度不如 Flat 索引尤其在每次检索的文档数topk较小时差距更明显。(1) 下载索引save_path/the/path/to/save huggingface-cli download PeterJinGo/wiki-18-e5-index-HNSW64 --repo-type dataset --local-dir $save_path cat $save_path/part_* $save_path/e5_HNSW64.index(2) 启动本地 ANN 稠密检索服务conda activate retriever index_file$save_path/e5_HNSW64.index corpus_file$save_path/wiki-18.jsonl retriever_namee5 retriever_pathintfloat/e5-base-v2 python search_r1/search/retrieval_server.py --index_path $index_file --corpus_path $corpus_file --topk 3 --retriever_name $retriever_name --retriever_model $retriever_path注意此处不带--faiss_gpu即索引保留在 CPU 上做近似检索。脚本化等价命令见 example/retriever/retrieval_launch_ann.sh。4.3 本地检索服务的统一参数速查以下参数均由 retrieval_server.py 的命令行解析并装配进内部Config其余检索相关默认值见Config类定义retrieval_server.py参数默认值说明--index_path示例路径Faiss 索引文件或 BM25 索引目录--corpus_path示例路径语料 jsonl 文件路径--topk3每个 query 返回的文档数--retriever_namee5检索器名称bm25时走BM25Retriever否则走DenseRetriever--retriever_modelintfloat/e5-base-v2稠密编码模型路径HF 模型名或本地路径--faiss_gpu关闭开关项将 Faiss 索引加载到全部 GPU 分片计算内部固定参数源码装配命令行不可改retrieval_pooling_methodmean、retrieval_query_max_length256、retrieval_use_fp16True、retrieval_batch_size512。服务启动后监听0.0.0.0:8000可通过 retrieval_request.py 验证接口——它向http://127.0.0.1:8000/retrieve发送批量查询设置topk与return_scores并打印返回的检索结果 JSON。五、在线搜索引擎SerpAPI 与 Google Custom SearchSearch-R1 同时支持 Google Search API 与 SerpAPI。文档推荐SerpAPI原因有二它聚合了 Google、Bing、Baidu 等多个在线搜索引擎 API并且没有月度配额上限Google Search API 有硬性的每月 1 万次配额不足以支撑在线 LLM RL 训练。5.1 SerpAPI 在线检索服务search_urlhttps://serpapi.com/search serp_api_key # 填入你的 SerpAPI 密钥https://serpapi.com/ 获取 python search_r1/search/serp_search_server.py --search_url $search_url --topk 3 --serp_api_key $serp_api_key脚本化等价命令见 example/retriever/retrieval_launch_serpapi.sh。源码说明serp_search_server.py命令行参数除--search_url、--serp_api_key、--topk默认 3外还支持--serp_engine默认google可切换其他引擎OnlineSearchEngine._search_query以engine / q / api_key三个参数请求 SerpAPIbatch_search用ThreadPoolExecutor并发处理一批查询_process_result会解析三类结果并统一拼成{document: {contents: \标题\\n摘要}}answer_box答案框、organic_results自然结果截取前 topk 条、related_questions相关问答。返回结构与本地检索服务完全一致因此可在训练中无缝替换。5.2 Google 在线检索服务api_key # 填入你的 Google Custom Search API 密钥https://developers.google.com/custom-search/v1/overview 获取 cse_id # 填入你的 CSE ID同一页面获取 python search_r1/search/google_search_server.py --api_key $api_key --topk 5 --cse_id $cse_id --snippet_only脚本化等价命令见 example/retriever/retrieval_launch_google.sh。源码说明google_search_server.py通过googleapiclient.discovery.build(customsearch, v1, ...)调用 Google Programmable Search Engine--snippet_only开关决定返回内容开启时仅使用搜索接口返回的 title 与 snippet经parse_snippet按...切分并过滤过短片段关闭时则用aiohttp并发抓取命中链接的网页正文fetch_all带 8 并发信号量与 5 秒超时并用bs4解析p段落再通过collect_context依据 snippet 定位并抽取所在段落作为上下文查询文本会先经sanitize_search_query清洗去除非字母数字符号与多余空白以规避部分字符引起的接口异常同样暴露POST /retrieve并统一返回{result: ...}结构返回前截取前--topk默认 3示例脚本用 5条。六、把检索服务接入 RL 训练确认协议无论本地还是在线服务都监听POST /retrieve接收{queries: [...]}可选topk、return_scores返回{result: [[{document: {contents: 标题\n正文}}]]}。配置训练脚本在 PPO/GRPO 启动命令中通过 Hydra override 指定服务地址与 topk例如 scripts/nq_hotpotqa/v0.1/train_grpo.shmax_turns4 \ retriever.urlhttp://127.0.0.1:8000/retrieve \ retriever.topk3多节点训练按 docs/multinode.md 的说明建议在每个节点含 head 节点与所有 worker 节点启动相同的检索服务以保证稳定训练例如在每台机器上执行bash retrieval_launch.sh拉起 e5 Flat 服务训练作业则只在 head 节点提交。七、进阶自建索引与检索重排若 wiki-18 预构建索引不满足需求可基于自己的 jsonl 语料构建索引corpus_file/your/corpus/jsonl/file # jsonl 格式 save_dir/the/path/to/save/index retriever_namee5 # 用于索引命名改为 bm25 则构建 BM25 索引 retriever_modelintfloat/e5-base-v2 # 将 faiss_type 改为 HNSW32/64/128 可构建 ANN 索引 CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 python search_r1/search/index_builder.py \ --retrieval_method $retriever_name \ --model_path $retriever_model \ --corpus_path $corpus_file \ --save_dir $save_dir \ --use_fp16 \ --max_length 256 \ --batch_size 512 \ --pooling_method mean \ --faiss_type Flat \ --save_embedding脚本见 search_r1/search/build_index.sh核心实现见 index_builder.pybm25走 Pyserini 的 Lucene 建索引流程稠密索引则用编码器对contents逐批产出 embeddinge5 加passage:前缀、默认 mean pooling、L2 归一化再经faiss.index_factory构建Flat/HNSW*索引支持多 GPU 训练索引后再写回 CPU 文件。建好的索引与语料即可按第三、四节的方式启动检索服务。如需进一步提升召回质量仓库还提供检索 重排两级服务 retrieval_rerank_server.py启动脚本 example/retriever/retrieval_launch_hierarchical.sh先用 e5 FlatGPU召回 top-10再用cross-encoder/ms-marco-MiniLM-L12-v2交叉编码器重排取 top-3其/retrieve端点同样兼容训练侧协议。独立的纯重排服务见 rerank_server.py默认端口 6980。八、部署要点小结本地稀疏检索BM25零 GPU 成本、启动最快适合无高质量稠密模型的领域索引与语料需先下载。本地稠密检索e5GPU 充足用--faiss_gpu Flat 索引追求精度与吞吐纯 CPU 环境用 HNSW64 ANN 索引换效率。在线搜索SerpAPI无月度配额限制适合通用搜索智能体的在线 RL 训练Google 方案有每月 1 万次配额上限--snippet_only可显著降低抓取成本。无论选择哪种检索器服务均统一暴露POST /retrieve通过训练配置retriever.url与retriever.topk接入多节点训练时务必在每个节点各自拉起同一检索服务。赞分享人工智能大模型强化学习RLHFRAG工具调用【免费下载链接】Search-R1Search-R1: An Efficient, Scalable RL Training Framework for Reasoning Search Engine Calling interleaved LLM based on veRL项目地址https://gitcode.com/gh_mirrors/se/Search-R1点击查看免费下载相关推荐LangChain4j Milvus EmbeddingStore 集成指南从稠密向量到混合检索BM25 与自定义稀疏向量LangChain4j Milvus EmbeddingStore 集成指南从稠密向量到混合检索BM25 与自定义稀疏向量 LangChain4j 通过人工智能AI 应用RAGAI Agent工具调用LlamaIndex BGEM3Index 实战指南用 BGE-M3 构建稠密稀疏多向量混合检索索引LlamaIndex BGEM3Index 实战指南用 BGE M3 构建稠密稀疏多向量混合检索索引 本篇指南以 LlamaIndex 的 BGEM3In人工智能RAG大模型openJiuwen HybridRetriever 混合检索实战向量检索 BM25 稀疏检索与 RRF 结果融合openJiuwen HybridRetriever 混合检索实战向量检索 BM25 稀疏检索与 RRF 结果融合 本篇技术指南聚焦 openJiuwen人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习上一篇高效集成Blender与Rhino3D模型互导无缝对接解决方案下一篇maya-glTF插件完全使用指南从安装到高级配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑