Haystack 集成指南:使用 SerperDevWebSearch 组件构建网页搜索与 RAG 管线
2026/9/15 10:12:03 网站建设 项目流程

Haystack 集成指南:使用 SerperDevWebSearch 组件构建网页搜索与 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/haystack

本文以 Haystack 官方 API 参考文档(docs-website/reference_versioned_docs/version-2.22/integrations-api/serperdev.md)为主体,系统讲解SerperDevWebSearch组件的初始化参数、序列化方法、同步/异步执行接口,并结合serperdev-haystack集成包的实战文档与当前仓库源码,展示如何将 Serper 网页搜索能力接入 Haystack Pipeline、Agent 与 LLM 工具链。读完本文,你将掌握 SerperDevWebSearch 的完整 API、域名过滤技巧、RAG 管线搭建方法,以及它在 Agent 工具场景下的用法。

SerperDevWebSearch 是什么

SerperDevWebSearch是 Haystack 生态中的网页搜索组件,由serperdev-haystack集成包提供。它基于 [Serper](Serper.dev)搜索引擎服务,输入一个查询字符串(query),返回与查询最相关的 URL 列表及对应文档。

从官方组件文档(docs-website/docs/pipeline-components/websearch/serperdevwebsearch.mdx)可以看出它的核心定位:

  • 管线中最常见的位置:位于LinkContentFetcher或各类转换器(Converter)之前——先搜索,再抓取网页全文;
  • 必需的初始化变量api_key(Serper API 密钥,默认通过SERPERDEV_API_KEY环境变量读取);
  • 必需的运行变量query(查询字符串);
  • 输出变量documents(文档列表)与links(链接字符串列表)。

需要特别强调的是其搜索原理SerperDevWebSearch返回的是搜索引擎结果页中的页面摘要(snippet)——即标题下方展示的片段文本,而非整页内容。因此它适合快速定位相关页面;若需要阅读网页全文,应将其与LinkContentFetcher(docs-website/docs/pipeline-components/fetchers/linkcontentfetcher.mdx)组合使用。

安装与前置条件

SerperDevWebSearch属于serperdev-haystack集成包,需要单独安装:

pip install serperdev-haystack

使用前需要:

  1. 在 Serper 平台注册并获取 API 密钥;
  2. 将密钥写入环境变量SERPERDEV_API_KEY,或在初始化组件时通过api_key参数显式传入。

在 Haystack 2.x 系列中,该组件的导入路径为haystack_integrations.components.websearch.serperdev(对应集成包serperdev-haystack)。如果你从早期 Haystack 版本迁移,原来的from haystack.components.websearch import SerperDevWebSearch已改为上述集成包路径,详见迁移指南 docs-website/docs/overview/migration.mdx 中的导入映射表。

核心 API 详解

API 参考文档(version-2.22 版 API 文档)定义了五个公开接口,下面逐一拆解。

__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关键字专用参数*之后),调用时必须写成exclude_subdomains=...的形式。

典型初始化方式有两种:

from haystack.utils import Secret from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch # 方式一:从环境变量读取密钥(默认行为) websearch = SerperDevWebSearch(top_k=10) # 方式二:显式传入密钥 websearch = SerperDevWebSearch( top_k=10, api_key=Secret.from_token("your-serper-api-key"), )

Secret类来自haystack.utils,支持from_env_varfrom_token等多种注入方式,保证密钥不出现在序列化配置的明文里。

to_dictfrom_dict:序列化

to_dict() -> dict[str, Any] from_dict(data: dict[str, Any]) -> SerperDevWebSearch
  • to_dict()将组件序列化为字典,便于持久化或嵌入 YAML 管线定义;
  • from_dict(data)从字典反序列化还原组件实例。

这两个方法保证SerperDevWebSearch可以无缝参与 Haystack 的 Pipeline 序列化体系。将管线导出为 YAML 后,search组件的配置形如(见 serperdevwebsearch.mdx 中的 YAML 示例):

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

可以看到api_key在序列化时以env_var类型保存环境变量名SERPERDEV_API_KEY,而不是明文密钥——这正是推荐用Secret.from_env_var注入密钥的原因。

run:同步搜索

run(query: str) -> dict[str, list[Document] | list[str]]

传入query(查询字符串),返回包含两个键的字典:

  • "documents":搜索引擎返回的文档列表(list[Document]);
  • "links":搜索引擎返回的链接列表(list[str])。
results = websearch.run(query="Who is the boyfriend of Olivia Wilde?") assert results["documents"] assert results["links"]

异常行为

  • 查询 Serper API 出错时抛出SerperDevError
  • 请求超时抛出TimeoutError

因此在实际应用中,建议对run调用做异常捕获,或在管线中配合条件路由组件设计回退(fallback)逻辑。

run_async:异步搜索

run_async(query: str) -> dict[str, list[Document] | list[str]]

run_asyncrun的异步版本,参数与返回值完全一致,同样可能抛出SerperDevErrorTimeoutError。在高吞吐或需要并发搜索的场景(例如一次处理多个查询)下,可以通过asyncio等机制与 Haystack 的异步管线配合使用,避免阻塞事件循环。

实战:独立使用与域名过滤

基础用法

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_k=10, api_key=serper_dev_api) results = websearch.run(query="What is the capital of Germany?") for doc in results["documents"]: print(doc.content) # 页面摘要文本 print(doc.meta) # 通常包含来源 URL 等元信息 for link in results["links"]: print(link) # 结果页 URL 字符串

域名过滤:精准限定搜索范围

allowed_domainsexclude_subdomains组合可以实现站点级搜索收敛:

# 只保留 example.com 的结果,排除 blog.example.com 等子域名 websearch_filtered = SerperDevWebSearch( top_k=10, allowed_domains=["example.com"], exclude_subdomains=True, # 只返回 example.com 的精确匹配结果 api_key=serper_dev_api, ) results_filtered = websearch_filtered.run(query="search query")

exclude_subdomains=False(默认值)时,blog.example.comdocs.example.com等子域名结果也会被纳入;设为True后则严格限定在allowed_domains中的精确域名。这一特性非常适合企业站内搜索、垂直领域资料检索等需要排除外部噪音的场景。

自定义 Serper 搜索参数

search_params会将参数原样透传给 Serper API。例如把默认的num(结果数)调大:

websearch = SerperDevWebSearch( top_k=10, search_params={"num": 20}, # 请求 20 条搜索结果 api_key=serper_dev_api, )

其他 Serper 支持的搜索参数(如语言、地域、时间范围、图片/新闻搜索等)均可通过该字典透传。

实战:在 RAG Pipeline 中使用

搜索组件输出的摘要通常不足以支撑高质量的生成回答。标准做法是让SerperDevWebSearch先搜索,再由LinkContentFetcher抓取全文、HTMLToDocument转成文档,最后交给ChatPromptBuilderOpenAIChatGenerator生成答案。完整示例来自 serperdevwebsearch.mdx:

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_key=Secret.from_token("<your-api-key>"), top_k=2) 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( template=prompt_template, required_variables={"query", "documents"}, ) llm = OpenAIChatGenerator( api_key=Secret.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}})

这段代码体现了SerperDevWebSearch在管线中的典型连接关系:search.links → fetcher.urls,即搜索结果里的 URL 列表被直接喂给LinkContentFetcher抓取全文。上面的 YAML 配置(含search组件完整init_parameters)即是这段管线的可序列化等价形式,可直接保存为.yaml文件后通过Pipeline.loadPipeline.loads还原。

进阶:把 SerperDevWebSearch 变成 Agent / LLM 工具

除了作为管线组件,SerperDevWebSearch还能通过 Haystack 的工具系统包装成 LLM 可调用的工具,为 Agent 提供实时联网能力。当前仓库源码 haystack/tools/component_tool.py 中给出了直接基于该组件构建ComponentTool的示例:

from haystack.tools import ComponentTool from haystack.utils import Secret from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch # 创建 SerperDev 搜索组件 search = SerperDevWebSearch(api_key=Secret.from_env_var("SERPERDEV_API_KEY"), top_k=3) # 将组件包装成工具 tool = ComponentTool( component=search, name="web_search", # 可选,默认以组件类名生成 snake_case 名称 description="Search the web for current information on any topic" # 可选,默认取组件 docstring ) # 交给 Agent 使用 agent = Agent(chat_generator=OpenAIChatGenerator(), tools=[tool]) message = ChatMessage.from_user("Use the web search tool to find information about Nikola Tesla") result = agent.run(messages=[message]) print(result)

从 haystack/tools/agent_tool.py 的文档字符串可以看到,AgentTool同样支持用SerperDevWebSearch构建 Agent 工具。ComponentTool会根据组件的run方法签名与类型注解自动生成 LLM 工具调用 Schema,并把top_kquery等参数暴露给模型。这意味着你可以让 Agent 自主决定搜索关键词与返回条数,是构建"具备实时信息获取能力"的 Agent 的轻量路径。

最佳实践与注意事项

  1. 密钥安全:始终通过Secret.from_env_var("SERPERDEV_API_KEY")Secret.from_token(...)注入密钥。to_dict/YAML 序列化会保留环境变量引用而非明文,降低泄漏风险。
  2. 摘要 vs 全文:记住SerperDevWebSearch返回的是搜索摘要。需要全文时务必接LinkContentFetcher与转换器(如HTMLToDocument),这是构建可靠 RAG 管线的关键一环。
  3. 异常与回退run/run_async会抛出SerperDevErrorTimeoutError。面向生产环境时,建议结合 Haystack 的条件路由组件为搜索失败设计回退分支,保证管线可用性。
  4. 域名收敛:垂直搜索场景善用allowed_domains+exclude_subdomains=True,可显著降低无关页面进入管线的概率。
  5. 结果条数控制top_k控制返回文档数,search_params={"num": N}控制 Serper 原始结果数,两者配合可兼顾召回与下游组件的处理开销。
  6. 异步场景:并发处理多个查询时优先使用run_async,避免阻塞事件循环;run_asyncrun参数、返回值和异常语义完全一致,迁移成本为零。
  7. 替代方案:如需对比其他搜索后端,可参考 docs-website/docs/pipeline-components/websearch.mdx 中列出的 Brave、Tavily、SearchApi、DDGS 等组件,以及 SerperDev 的同类替代说明(见 searchapiwebsearch.mdx)。

小结

SerperDevWebSearch是 Haystack 生态中接入 Serper 搜索能力的标准组件:安装serperdev-haystack后即可在独立脚本、Pipeline、Agent 工具三种形态中使用。它的 API 简洁清晰——api_keytop_kallowed_domainsexclude_subdomainssearch_params五个初始化参数覆盖了从基础搜索到精细域控制的绝大多数场景,run/run_async提供同步与异步两种执行方式,to_dict/from_dict保证与 Haystack 序列化体系无缝衔接。配合LinkContentFetcher与生成组件,即可快速搭建具备实时联网能力的 RAG 与 Agent 应用。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询