人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读在 RAG检索增强生成与实时信息问答场景中如何把外部搜索引擎的能力无缝接入本地 Pipeline是决定系统时效性与召回质量的关键一环。PaddleNLP 的 pipelines 子项目位于 slm/pipelines在pipelines.nodes.search_engine模块中提供了统一、可插拔的搜索抽象层SearchEngine抽象基类、SerpAPI/SerperDev/SearchApi三大在线搜索 Provider以及面向整条 Pipeline 的WebSearch节点。本文围绕 search_engine.md 指向的源码完整讲解该模块的设计骨架、参数体系、调用链路与排名打分机制并给出可直接落地的接入示例帮助你用最短代码为检索、问答 Pipeline 注入实时 Web 搜索能力。模块全景抽象、Provider 与节点的三层结构search_engine模块位于slm/pipelines/pipelines/nodes/search_engine/共五个文件base.py定义抽象基类SearchEngine与统一的search()/score_results()接口providers.py实现三个具体 Provider——SerpAPI、SerperDev、SearchApiweb.py实现 Pipeline 节点WebSearch屏蔽 Provider 差异utils.py提供排名打分工具函数calculate_ranking_scoresinit.py对外导出SearchEngine与WebSearch。这三层结构对应三种使用方式继承抽象类自定义 Provider、直接实例化具体 Provider、或通过WebSearch节点挂入 Pipeline。抽象层的存在让上层节点如 WebRetriever完全不感知底层调用的是哪家搜索服务。SearchEngine 抽象基类统一接口与打分契约base.py 中SearchEngine继承自ABC定义了所有 Provider 必须实现的两类能力search()核心检索入口abstractmethod def search(self, query: str, **kwargs) - List[Document]: Search the search engine for the given query and return the results. :param query: The query to search for. :param kwargs: Additional parameters to pass to the search engine, such as top_k. :return: List of search results as documents. 要点query为必填检索词**kwargs用于透传 Provider 级附加参数如top_k、语言限定lr/hl等返回值统一为List[Document]即 pipelines 标准文档对象可直接进入下游节点如 Ranker、Reader、LLM 生成。score_results()结果归一化打分def score_results( self, results: List[Document], has_answer_box: Optional[bool] False, boost_factor: Optional[int] 5 ) - List[Document]: scores calculate_ranking_scores(results, boost_first_factorboost_factor if has_answer_box else None) for doc, score in zip(results, scores): doc.score doc.meta[score] score return results根据结果在列表中的排名位置分配分数并保证所有分数之和为 1若搜索引擎返回了 answer box答案卡片则对第一名结果乘以boost_factor默认 5进行加权让直接答案更突出分数会同时写入doc.score与doc.meta[score]供下游 Ranker 排序或 WebRetriever 记录search.score使用参见 retriever/web.py。排名打分算法的实现细节打分逻辑在 utils.py 的calculate_ranking_scores中def calculate_ranking_scores(list_items: List[Any], boost_first_factor: Optional[int] None) - List[float]: n len(list_items) scores [0.0] * n # 按排名位置线性降权 for i, _ in enumerate(list_items): scores[i] (n - i) / ((n * (n 1)) / 2) # 对第一名应用 boost 因子 if boost_first_factor is not None and n 0: scores[0] * boost_first_factor # 归一化使总分为 1 total_score sum(scores) normalized_scores [score / total_score for score in scores] return normalized_scores其数学本质是第 i 名从 0 开始的原始权重为(n-i)/(n*(n1)/2)即按名次等差递减的调和权重天然满足各权重之和为 1开启boost_first_factor后第一名权重先乘以因子、再整体归一化从而在不破坏总分为 1契约的前提下放大头部答案。三大内置 Provider参数、请求与结果解析providers.py 中三个 Provider 都继承SearchEngine构造签名保持一致def __init__( self, api_key: str, # API 密钥 top_k: Optional[int] 10, # 返回结果条数默认 10 engine: Optional[str] google, # 底层搜索引擎如 google/bing/baidu 等 search_engine_kwargs: Optional[Dict[str, Any]] None, # 透传的附加查询参数 ):SerpAPI多引擎聚合服务用途聚合 Google、Bing、Yahoo、Yandex、Amazon 等多家搜索引擎的 REST API请求GET https://serpapi.com/search30 秒超时参数包含sourcepython、serp_api_key、q与透传参数可指定engine如google、bing、baidu、duckduckgo附加参数示例lrlang_en可限定英文检索结果解析依次抽取answer_box答案卡片、organic_results自然结果经field_map{snippet: content}把摘要映射为文档正文、people_also_search_for相关搜索、related_questions相关问题四者拼接后按top_k截断若响应状态码非 200抛出带响应体详情的异常便于排查。SerperDevGoogle 专用轻量接口用途仅面向 Google 搜索的轻量 API请求POST https://google.serper.dev/search30 秒超时通过请求头X-API-KEY携带密钥Content-Type: application/json附加参数示例hlen设置结果语言为英文结果解析解析answerBox、organic、peopleAlsoSearchFor、relatedSearches、peopleAlsoAsk五类内容其中relatedSearches仅保留 query 文本作为contenttop_k同样通过从 kwargs 弹出top_k来控制未传时使用构造时的默认值。SearchApi实时多源搜索用途提供 Google、Google Scholar、YouTube、YouTube Transcripts 等实时搜索能力请求GET https://www.searchapi.io/api/v1/search90 秒超时最长请求头携带Authorization: Bearer api_key与X-SearchApi-Source: PaddleNLP附加参数示例locationNew York,United States可将搜索本地化结果解析比前两者更丰富额外处理knowledge_graph知识图谱使用 description 作为正文、website 作为链接、answer_box含population_graph人口图等特殊类型、organic_results、related_questions仅当link与content均非空时才生成答案类 Document保证进入 Pipeline 的结果具备可用性。三个 Provider 的最终产物一致documents[:top_k]截断后调用score_results打分返回。选用建议需要多引擎对比时选SerpAPI仅需 Google 且追求低延迟时选SerperDev需要 Scholar/YouTube 等多源检索时选SearchApi。WebSearch 节点把搜索能力挂入 Pipelineweb.py 中的WebSearch继承BaseComponent是搜索能力进入 Pipeline 的统一入口outgoing_edges 1单输出边。构造参数与 Provider 动态装配def __init__( self, api_key: str, top_k: Optional[int] 10, search_engine_provider: Union[str, SearchEngine] SerpAPI, engine: Optional[str] google, search_engine_kwargs: Optional[Dict[str, Any]] None, ):search_engine_provider支持两种传法字符串节点内部用pydoc.locate依次在pipelines.nodes.search_engine.providers.name与search_engine_provider两个路径中定位 Provider 类参考 web.py若找不到则抛出ValueError并校验其为SearchEngine子类SearchEngine 实例直接复用外部已构造好的 Provider 对象便于复用连接、密钥管理与自定义 Provider。其余参数原样透传给 Provider 构造函数。run()单查询入口def run(self, queryNone, file_pathsNone, labelsNone, documentsNone, metaNone) - Tuple[Dict, str]: if not query: raise ValueError(WebSearch run requires the query parameter) return {documents: self.search_engine.search(query)}, output_1为与其他节点保持一致的run签名其余入参file_paths、documents等被忽略仅使用query返回值结构为{documents: List[Document]}与边名output_1可直接与下游节点如 PromptBuilder / LLM相连。run_batch()批量查询入口def run_batch(self, queriesNone, ...): if isinstance(queries, str): queries [queries] elif not isinstance(queries, list): raise ValueError(WebSearch run_batch requires the queries parameter to be Union[str, List[str]]) for query in queries: results.append(self.search_engine.search(query)) return {documents: results}, output_1接受单个字符串或字符串列表逐条调用底层 Provider 的search()输出为List[List[Document]]。实战接入三步在 Pipeline 中使用 WebSearch步骤一准备 API 密钥从对应服务商后台申请api_keySerpAPI / Serper.dev / SearchApi 三选一建议通过环境变量注入避免硬编码。步骤二实例化节点from pipelines.nodes.search_engine import WebSearch # 方式 A字符串指定 Provider默认 SerpAPI web_search WebSearch( api_keyyour_serpapi_key, top_k10, search_engine_providerSerpAPI, # 也可传 SerperDev / SearchApi / 自定义类路径 enginegoogle, # 底层搜索引擎 search_engine_kwargs{lr: lang_en}, # 限定英文结果 ) # 方式 B直接传入 SearchEngine 实例 from pipelines.nodes.search_engine.providers import SerperDev web_search WebSearch( api_keyyour_serper_key, search_engine_providerSerperDev(api_keyyour_serper_key, top_k5, enginegoogle), )步骤三单查与批量调用# 单查询 result web_search.run(queryPaddleNLP 最新发布) documents result[documents] # List[Document] for doc in documents: print(doc.content) # 摘要正文 print(doc.meta.get(score)) # 排名得分归一化 # 批量查询 batch web_search.run_batch(queries[PaddleNLP 介绍, ERNIE 模型]) docs_list batch[documents] # List[List[Document]]返回的每个Document通过Document.from_dict构造meta[link]保存原始 URL、meta[score]保存归一化排名分数可直接喂给下游重排或生成节点。向上游延伸WebSearch 与 WebRetriever 的协作search_engine模块不仅独立可用还是 Web 检索管线的底座。节点 WebRetriever 在构造时内部创建WebSearch实例提供三种工作模式snippets直接返回搜索摘要片段不抓取页面raw_documents对命中 URL 发起 HTTP 抓取、用 boilerpy3 的ArticleExtractor剥离 HTML 后返回正文preprocessed_documents在原始正文基础上再用PreProcessor切分段落默认模式。from pipelines.nodes.retriever import WebRetriever retriever WebRetriever( api_keyyour_serpapi_key, search_engine_providerSerpAPI, enginegoogle, top_search_results10, # 传给 WebSearch 的 top_k top_k5, # 最终返回文档数默认 5 modepreprocessed_documents, ) docs retriever.retrieve(queryPaddleNLP pipelines 用法)实现细节对应 retriever/web.py先调用self.web_search.run(queryquery)拿到搜索结果再从中提取meta[link]构造 URL 列表使用ThreadPoolExecutor并发抓取页面线程数取min(len(links), cpu_count())抓取失败时回退为原始 snippet 文档保证召回不中断支持通过cache_document_store将检索结果缓存到 DocumentStore缓存默认有效期 24 小时cache_time86400命中缓存时跳过实时搜索显著降低 API 调用成本与延迟。从源码结构看这一搜索 Provider → WebSearch 节点 → WebRetriever 检索器的分层设计让同一套搜索抽象同时服务于轻量 snippets 召回与重量级全文抓取两种场景。注意事项与限制三个内置 Provider 均依赖requests访问外部服务运行环境需具备外网访问能力响应非 200 时抛出异常建议在 Pipeline 外层捕获兜底top_k默认 10但 WebRetriever 的top_k默认 5两者含义不同前者是搜索引擎返回的原始结果数后者是最终交给 Pipeline 的文档数搜索 API 为付费商业服务密钥、配额与限流策略以各服务商当前官方文档为准自定义 Provider 时只需继承SearchEngine并实现search()返回List[Document]即可被WebSearch以字符串类路径方式动态装配web.py 中的pydoc.locate机制同时可复用基类的score_results()获得统一打分。小结pipelines.nodes.search_engine用抽象基类 多 Provider 统一节点的紧凑设计把外部搜索服务封装成了 Pipeline 内的一等公民SearchEngine定义接口与归一化打分契约SerpAPI/SerperDev/SearchApi负责适配不同厂商 API 的差异WebSearch与WebRetriever则分别面向片段召回与全文抓取两类场景。无论是构建实时问答、带时效性的 RAG 应用还是为检索系统补充多源召回这套模块都能以最小代码量快速接入且可通过继承机制平滑扩展新的搜索服务商。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐终极指南Serper与SerpAPI搜索引擎集成深度对比终极指南Serper与SerpAPI搜索引擎集成深度对比 你是否在构建AI应用时为选择合适的搜索引擎API而烦恼还在纠结Serper和SerpAPI哪个更AI AgentAPI网关后端开发工具使用 WasmEdge C API 与 WASM Threads 提案多线程并行渲染 Mandelbrot 集使用 WasmEdge C API 与 WASM Threads 提案多线程并行渲染 Mandelbrot 集 Mandelbrot 集渲染是典型的计算密集型任人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPArchiveBox Snapshot 搜索查询引擎深度解析archivebox.search.query 模块 API 全指南ArchiveBox Snapshot 搜索查询引擎深度解析archivebox.search.query 模块 API 全指南 本文围绕 ArchiveBo后端数据工程上一篇shadcn/ui Vite Monorepo 模板实战在 packages/ui 中集中管理组件并用 Turborepo 驱动开发下一篇终极音乐解锁指南5种方法解决主流音乐平台加密格式限制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考