ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Haystack 中 SerperDevWebSearch 实战指南:用 Serper API 构建实时 Web 搜索与 RAG 管线

Haystack 中 SerperDevWebSearch 实战指南:用 Serper API 构建实时 Web 搜索与 RAG 管线 Haystack 中 SerperDevWebSearch 实战指南用 Serper API 构建实时 Web 搜索与 RAG 管线【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystackSerperDevWebSearch是 Haystack 生态中的 Web 搜索组件它封装了 Serper 搜索引擎 API把一条查询字符串变成结构化的搜索结果列表文档片段与链接。本文以 Haystack 2.18 版本文档为骨架完整讲解该组件的初始化参数、run/run_async调用方式、序列化与 YAML 管线配置并结合仓库中的用户指南与版本发布说明带你从零搭建搜索 → 抓取 → 生成的实时 RAG 管线。SerperDevWebSearch 是什么SerperDevWebSearch 是一个把外部搜索服务接入 Haystack 管线的组件。向它传入一条查询query后它会调用 Serper API 返回与查询最相关的 URL 列表。需要特别注意的是它使用搜索结果页面中的片段snippet——即标题下方展示的那段文字——来寻找答案而不是抓取整张网页。因此如果应用需要网页全文必须再接上LinkContentFetcher组件去抓取链接内容或者直接把它放在 Converters 之前。在管线的典型位置中SerperDevWebSearch通常位于LinkContentFetcher或 Converters 之前搜索组件产出链接抓取组件负责把链接变成内容流后续组件再做转换与生成。这是目前官方用户指南对它的定位见 serperdevwebsearch.mdx。从仓库的参考文档 version-2.18/integrations-api/serperdev.md 可以看到该组件的完整限定名是haystack_integrations.components.websearch.serperdev.websearch.SerperDevWebSearch注意这里的导入前缀是haystack_integrations。根据仓库内的版本发布说明 deprecate-serperdev-websearch-9de15a703cba06cc.yamlSerperDevWebSearch已从 Haystack 核心包迁出移入独立的serperdev-haystack集成包因此使用它需要先安装该包并采用上述haystack_integrations导入路径。安装与鉴权安装独立集成包pip install serperdev-haystack组件默认从SERPERDEV_API_KEY环境变量读取 Serper API 密钥from haystack.utils import Secret from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch serper_dev_api Secret.from_env_var(SERPERDEV_API_KEY) websearch SerperDevWebSearch(top_k10, api_keyserper_dev_api)也可以直接使用Secret.from_token(your-api-key)在初始化时传入密钥。Haystack 的Secret机制保证密钥不会直接明文暴露在序列化后的配置中——在 YAML 管线配置里api_key会以env_vars: [SERPERDEV_API_KEY]的形式记录这正是官方 YAML 示例见 serperdevwebsearch.mdx中search组件的写法。初始化参数详解参考 version-2.18/integrations-api/serperdev.md 中__init__的完整签名__init__( api_key: Secret Secret.from_env_var(SERPERDEV_API_KEY), top_k: int | None 10, allowed_domains: list[str] | None None, search_params: dict[str, Any] | None None, *, exclude_subdomains: bool False ) - None各参数含义如下参数类型默认值说明api_keySecretSecret.from_env_var(SERPERDEV_API_KEY)Serper API 的密钥top_kint \| None10返回的文档数量allowed_domainslist[str] \| NoneNone限定搜索范围的域名列表exclude_subdomainsboolFalse是否在按allowed_domains过滤时排除子域名。为True时只返回allowed_domains中精确域名下的结果为False时子域名结果也会包含在内关键字参数仅限*之后传参search_paramsdict[str, Any] \| NoneNone透传给 Serper API 的附加参数例如设置num: 20可以增加搜索结果条数其中exclude_subdomains参数在仓库的版本说明 serperdev-add-exclude-subdomains-param-932b8fe4a001f378.yaml 中有明确记载当allowed_domains[example.com]且exclude_subdomainsTrue时blog.example.com、shop.example.com等子域名的结果会被过滤掉只保留example.com的结果该参数默认False以保持向后兼容。域过滤的完整用法示例# Example with domain filtering - exclude subdomains websearch_filtered SerperDevWebSearch( top_k10, allowed_domains[example.com], exclude_subdomainsTrue, # Only results from example.com, not blog.example.com api_keyserper_dev_api, ) results_filtered websearch_filtered.run(querysearch query)run 与 run_async同步与异步执行run方法是组件的核心调用入口签名与返回结构如下run(query: str) - dict[str, list[Document] | list[str]]输入参数querystr——搜索查询语句返回字典包含两个键documents搜索引擎返回的文档列表list[Document]内容为搜索结果片段links搜索引擎返回的链接列表list[str]。run_async是run的异步版本参数与返回值完全相同适用于需要并发调用搜索的异步场景例如AsyncPipeline。两者在调用 SerperDev API 出错时都会抛出SerperDevError请求超时时抛出TimeoutError。独立使用示例websearch SerperDevWebSearch(top_k10, api_keyserper_dev_api) results websearch.run(queryWho is the boyfriend of Olivia Wilde?) assert results[documents] assert results[links]序列化to_dict 与 from_dict组件支持标准的 Haystack 序列化协议便于在 YAML 或 JSON 中持久化与恢复to_dict() - dict[str, Any]把组件序列化为字典包含类型标识与所有初始化参数from_dict(data: dict[str, Any]) - SerperDevWebSearch从字典反序列化还原组件实例。在管线层面这意味着SerperDevWebSearch可以被完整地写入 YAML 配置并重新加载。官方 YAML 示例见 serperdevwebsearch.mdx中search组件的序列化形式为search: init_parameters: allowed_domains: null api_key: env_vars: - SERPERDEV_API_KEY strict: true type: env_var exclude_subdomains: false search_params: {} top_k: 2 type: haystack_integrations.components.websearch.serperdev.websearch.SerperDevWebSearch可以看到密钥以环境变量引用形式序列化避免明文泄露allowed_domains、search_params等未设置参数统一序列化为null/{}这与__init__的默认值一一对应。在 Pipeline 中构建 RAG搜索 → 抓取 → 转换 → 生成SerperDevWebSearch最典型的应用场景是实时 RAG 管线先用搜索引擎检索最新信息再用LinkContentFetcher抓取网页全文最后交给 LLM 生成答案。官方用户指南给出了完整代码from haystack import Pipeline from haystack.utils import Secret from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder from haystack.components.fetchers import LinkContentFetcher from haystack.components.converters import HTMLToDocument from haystack.components.generators.chat import OpenAIChatGenerator from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.dataclasses import ChatMessage web_search SerperDevWebSearch(api_keySecret.from_token(your-api-key), top_k2) link_content LinkContentFetcher() html_converter HTMLToDocument() prompt_template [ ChatMessage.from_system(You are a helpful assistant.), ChatMessage.from_user( Given the information below:\n {% for document in documents %}{{ document.content }}{% endfor %}\n Answer question: {{ query }}.\nAnswer:, ), ] prompt_builder ChatPromptBuilder( templateprompt_template, required_variables{query, documents}, ) llm OpenAIChatGenerator( api_keySecret.from_token(your-api-key), ) pipe Pipeline() pipe.add_component(search, web_search) pipe.add_component(fetcher, link_content) pipe.add_component(converter, html_converter) pipe.add_component(prompt_builder, prompt_builder) pipe.add_component(llm, llm) pipe.connect(search.links, fetcher.urls) pipe.connect(fetcher.streams, converter.sources) pipe.connect(converter.documents, prompt_builder.documents) pipe.connect(prompt_builder.prompt, llm.messages) query What is the most famous landmark in Berlin? pipe.run(data{search: {query: query}, prompt_builder: {query: query}})该管线的数据流为search.links→fetcher.urls→fetcher.streams→converter.sources→converter.documents→prompt_builder.documents→prompt_builder.prompt→llm.messages。注意SerperDevWebSearch输出的是links字符串列表正好直接对接LinkContentFetcher的urls输入。同一管线也可以用 YAML 声明完整配置见 serperdevwebsearch.mdx通过haystack marshal等机制即可加载运行。进阶search_params 透传Serper API 支持丰富的自定义参数search_params把这些参数原样透传给上游服务。最常用的例子是调整返回条数websearch SerperDevWebSearch( api_keyserper_dev_api, top_k10, search_params{num: 20}, # 增加搜索结果条数 )top_k决定组件最终保留并转成Document的结果数量而search_params[num]控制 Serper API 返回的原始结果数量两者配合可以做到上游多取、下游精筛。健壮性与版本演进结合仓库中的版本发布说明可以梳理出该组件的演进脉络引入最初作为组件加入用于从 Web 检索 URL见 add-serper-dev-8c582749728e3699.yaml健壮性增强当响应中缺少snippet字段时组件也能正常工作不会因字段缺失而崩溃见 serperdev-more-robust-229ba25c8fc9306d.yaml新增域过滤加入exclude_subdomains参数见 serperdev-add-exclude-subdomains-param-932b8fe4a001f378.yaml迁移与移除组件从 Haystack 核心迁出至serperdev-haystack独立包旧导入路径from haystack.components.websearch import SerperDevWebSearch需要改为from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch见 deprecate-serperdev-websearch-9de15a703cba06cc.yaml 与 remove-serperdev-websearch-7c7f3caa702bfb03.yaml。因此无论你查看的是 2.18 版本的参考文档version-2.18/integrations-api/serperdev.md还是当前文档reference/integrations-api/serperdev.md组件 API 保持一致只要正确安装serperdev-haystack包并更新导入路径即可。若你的应用需要替代的搜索服务仓库还提供了 SearchAPI、Brave、Tavily 等其他 Web 搜索组件可供选择。【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表