
Haystack SerperDevWebSearch API 深度参考基于 serperdev-haystack 集成包构建网络搜索组件【免费下载链接】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 2.19 版本文档站中 SerperDev 集成 API 参考 为主体系统讲解SerperDevWebSearch组件的构造参数、同步/异步搜索接口与序列化协议并结合当前仓库中的发布说明与工具层源码给出该组件在 RAG 管线和 Agent 工具中的实战用法与演进脉络。读完后你可以独立配置、调用、将SerperDevWebSearch序列化进 YAML 管线并理解它在 Haystack 生态中从核心组件迁移到独立集成包的完整历程。组件定位返回的是搜索摘要而非全文SerperDevWebSearch使用 Serper 搜索引擎 API 从互联网检索与查询最相关的文档。需要特别注意其工作方式它利用搜索结果的页面摘要snippet即搜索结果页标题下方的那段文字构造返回的Document而不是抓取整页内容。如果你需要页面全文应将其输出与LinkContentFetcher组件组合使用——这正是该组件在管线中最常见的位置位于LinkContentFetcher或各类 Converter 之前。组件的运行依赖一个 Serper API Key默认读取SERPERDEV_API_KEY环境变量也可以在初始化时显式传入api_key。关于包归属当前仓库的 组件文档 明确标注包名serperdev-haystack安装命令pip install serperdev-haystack导入路径haystack_integrations.components.websearch.serperdev版本 2.19 的导入路径与演进背景指定参考文档2.19 版给出的导入方式是集成包路径from haystack.utils import Secret from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch但同一版本的 管线组件使用文档 中示例代码使用的还是核心包路径from haystack.components.websearch import SerperDevWebSearch。两者并存反映了该组件在 2.x 时期的迁移过渡状态。仓库中的发布说明可以还原完整时间线组件首次引入发布说明Adds SerperDevWebSearch component to retrieve URLs from the web当时位于 Haystack 核心包内健壮性增强发布说明当 API 响应中缺失snippet字段时不再出错组件对不完整响应更鲁棒新增exclude_subdomains参数发布说明当设为True时搜索结果被严格限制在allowed_domains列出的精确域名上例如allowed_domains[example.com]且exclude_subdomainsTrue时blog.example.com、shop.example.com的结果都会被过滤掉该参数默认False以保持向后兼容弃用公告发布说明组件从 Haystack 弃用预告将在 3.0 移除迁移到serperdev-haystack包正式移出核心发布说明给出 Before/After 迁移指引——旧导入from haystack.components.websearch import SerperDevWebSearch改为from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch。从源码结构看当前仓库的haystack/核心目录中已不再包含websearch/serper_dev.py实现组件本体随serperdev-haystack集成包独立发布核心仓库仅保留文档、发布说明和工具层引用。这与 Haystack 将第三方 API 依赖剥离到 integrations 仓库的架构策略一致。构造参数详解__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_keySecret默认Secret.from_env_var(SERPERDEV_API_KEY)Serper API 的密钥。Secret是 Haystack 的敏感信息封装支持环境变量读取与显式 token 两种来源top_kint \| None默认10返回的文档数量上限allowed_domainslist[str] \| None默认None将搜索范围限定到指定域名列表None表示不限定search_paramsdict[str, Any] \| None默认None透传给 Serper API 的附加参数。文档中给出的例子是设置num: 20来增大搜索结果的返回数量exclude_subdomainsbool默认False关键字参数按allowed_domains过滤时是否排除子域名。True时仅返回与allowed_domains中域名完全一致的结果False时子域名结果也会被保留两个值得注意的实现细节api_key使用Secret而非裸字符串这是 Haystack 对敏感凭据的统一处理方式。默认值Secret.from_env_var(SERPERDEV_API_KEY)采用非严格模式strictFalse的语义由from_env_var决定即使环境变量缺失也不会立即抛错而是在实际调用时或序列化时体现实践中也可以用Secret.from_token(your-api-key)直接传入字面量见下文管线示例。exclude_subdomains是纯关键字参数签名中位于*之后调用时必须以exclude_subdomainsTrue的形式显式命名不能按位置传参。基础用法直接调用与域名过滤参考文档给出的标准用法示例如下第一个示例展示基本检索与输出断言第二个示例展示带域名过滤含排除子域名的构造方式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) results websearch.run(queryWho is the boyfriend of Olivia Wilde?) assert results[documents] assert results[links] # 带域名过滤的示例 - 排除子域名 websearch_filtered SerperDevWebSearch( top_k10, allowed_domains[example.com], exclude_subdomainsTrue, # 只返回 example.com 的结果不包含 blog.example.com api_keyserper_dev_api, ) results_filtered websearch_filtered.run(querysearch query)更贴近独立调用习惯的写法来自 2.19 管线组件文档from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret web_search SerperDevWebSearch(api_keySecret.from_token(your-api-key)) query What is the capital of Germany? response web_search.run(query)运行后response是一个包含两个键的字典documentsDocument列表content为搜索摘要文本与links结果 URL 字符串列表。run与run_async同步与异步搜索接口参考文档为两个搜索入口给出了相同的契约run(query: str) - dict[str, list[Document] | list[str]]run_async(query: str) - dict[str, list[Document] | list[str]]入参querystr即搜索查询语句。返回值一个字典固定包含两个键documents搜索引擎返回的Document列表内容为摘要片段links搜索引擎返回的链接列表。异常行为两个方法一致SerperDevError查询 SerperDev API 过程中发生错误时抛出TimeoutError请求 SerperDev API 超时时抛出。run_async是run的异步版本参数与返回值完全相同供async管线与并发场景使用——这与当前仓库中大量组件补齐run_async支持的整体方向一致参考 发布说明目录 中多条add-run-async-*条目。序列化协议to_dict/from_dict与 YAML 管线to_dict() - dict[str, Any] from_dict(data: dict[str, Any]) - SerperDevWebSearchto_dict将组件状态序列化为字典from_dict执行反向操作。这一对方法使组件可以嵌入Pipeline的 YAML 快照中持久化。从当前仓库 最新 API 参考 对应的管线 YAML 序列化样例可以看到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两个细节值得注意api_key被序列化为env_var类型的Secret结构记录环境变量名SERPERDEV_API_KEY而非密钥本身保证密钥不落盘type字段记录了完整限定类名haystack_integrations.components.websearch.serperdev.websearch.SerperDevWebSearch反序列化时据此定位类。实战SerperDevWebSearch 驱动的 RAG 管线2.19 文档中的完整管线示例串联了网络搜索 → 抓取网页 → 转文档 → 提示词构建 → 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), modelgpt-3.5-turbo, ) 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.messages, 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这条连接体现了组件设计意图SerperDevWebSearch只产出 URL 与摘要全文抓取交给LinkContentFetcherquery被同时注入两个组件search和prompt_builder搜索用它检索提示词构建用它填充模板变量{{ query }}提示词模板中的 Jinja 循环{% for document in documents %}{{ document.content }}{% endfor %}会把抓取转换后的文档正文逐条拼入用户消息。进阶把 SerperDevWebSearch 包装成 Agent 工具当前仓库的工具层源码为这个集成组件提供了典型的被复用方示范。ComponentTool 文档字符串 中给出的官方示例就是以SerperDevWebSearch为例将其自动包装为 LLM 可调用的工具from haystack import component 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_keySecret.from_env_var(SERPERDEV_API_KEY), top_k3) # 从组件创建工具 tool ComponentTool( componentsearch, nameweb_search, # 可选默认 serper_dev_web_search descriptionSearch the web for current information on any topic # 可选默认取组件 docstring ) # 组装 Agent agent Agent(chat_generatorOpenAIChatGenerator(), tools[tool]) message ChatMessage.from_user(Use the web search tool to find information about Nikola Tesla) result agent.run(messages[message]) print(result)ComponentTool的核心机制是从组件run方法的签名和类型提示自动推导 LLM 工具调用 schema实现逻辑 说明其自动处理 dataclass、基础类型及其列表的输入转换。由于SerperDevWebSearch.run(query: str)的签名简单清晰包装后 LLM 只需传一个query参数即可。AgentTool 的文档字符串 同样以serperdev-haystack包中的SerperDevWebSearch作为网络搜索工具的首选示例说明该组件是 Haystack Agent 场景下联网搜索的事实性推荐路径。参考路径汇总指定 API 参考文档docs-website/reference_versioned_docs/version-2.19/integrations-api/serperdev.md当前最新版 API 参考docs-website/reference/integrations-api/serperdev.md2.19 版管线组件使用文档含独立调用与 RAG 管线示例docs-website/versioned_docs/version-2.19/pipeline-components/websearch/serperdevwebsearch.mdx当前组件文档含安装命令与 YAML 序列化样例docs-website/docs/pipeline-components/websearch/serperdevwebsearch.mdx演进时间线引入、健壮性增强、exclude_subdomains 参数、弃用、移出核心Agent 工具集成示例haystack/tools/component_tool.py、haystack/tools/agent_tool.py适用前提与限制本文以 2.19 版 API 参考文档为准接口契约五个构造参数、run/run_async的双键返回、SerperDevError与TimeoutError异常在文档站最新版本中保持一致但需注意版本间导入路径差异——2.x 早期版本可用haystack.components.websearch核心路径导入3.0 起只能使用haystack_integrations.components.websearch.serperdev集成包路径迁移方式见上文发布说明第 5 条。【免费下载链接】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),仅供参考