T
traeai
登录
返回首页
AWS Machine Learning Blog

使用 Strands 和 Exa 构建网络搜索 AI 助手

8.5Score
使用 Strands 和 Exa 构建网络搜索 AI 助手

TL;DR · AI 摘要

通过将 Exa 集成到 Strands Agents SDK 中,开发者可以轻松构建具备实时网络搜索能力的 AI 助手。

核心要点

  • Exa 提供无需后处理的结构化内容。
  • Strands Agents SDK 支持超过 40 种工具。
  • `exa_search` 支持多模式搜索。

结构提纲

按章节快速跳转。

  1. 介绍构建具备网络搜索功能的 AI 助手的重要性。

  2. Strands Agents SDK 是一个开源框架,支持模型驱动的方法来构建 AI 助手。

  3. 模型决定下一步操作,包括调用哪些工具及顺序。

  4. SDK 包含超过 40 种预建工具,涵盖多种功能。

  5. Exa 搜索工具

    `exa_search` 支持多模式搜索并允许结果过滤。

  6. 展示如何在真实场景中使用这些工具完成多步任务。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 构建网络搜索 AI 助手
    • Strands Agents
      • 模型驱动方法
      • 超过 40 种工具
    • Exa
      • 语义理解
      • 结构化内容

金句 / Highlights

值得收藏与分享的关键句。

#AI助手#搜索引擎#Strands Agents#Exa
打开原文

标题:使用 Strands 和 Exa 构建支持网络搜索的代理 | Amazon Web Services

来源 URL:https://aws.amazon.com/blogs/machine-learning/building-web-search-enabled-agents-with-strands-and-exa/

发布时间:2026-05-11T13:58:16-08:00

Markdown 内容: _本文由 Exa 的 Ishan Goswami 和 Nitya Sridhar 共同撰写。_

如果你正在为研究、事实核查或竞争情报构建支持网络搜索的 AI 代理,获取最新且可靠的信息至关重要。大多数通用的搜索 API 并未针对代理工作流设计。它们返回的是 HTML 丰富的页面和优化供人类浏览的短片段,而不是代理可以直接消费的结构化数据。因此,开发人员通常需要构建额外的层、自定义爬虫、解析器和排名逻辑,以将这些内容转换为代理工作流中可用的形式。

Exa 集成到 Strands Agents SDK 中通过直接嵌入工具界面的 AI 原生搜索和检索层解决了这一差距。Exa 提供了经过清理且格式化的结构化内容,可以直接用于 LLM 的上下文窗口中,无需进行后处理以去除标记或重新格式化输出。结合 Strands Agents SDK 的模型驱动架构,其中模型决定何时调用工具以及如何使用其输出,代理可以实时将网络知识引入其推理循环。

实际上,你的代理通过两个工具访问此集成:exa_search,它支持语义搜索并带有新闻、研究论文和存储库等类别的支持;以及 exa_get_contents,它从选定的 URL 检索完整内容。在这篇文章中,你将学习如何在 Strands Agents 中设置 Exa 集成,了解它暴露的两个核心工具,并通过现实世界中的用例展示代理如何利用网络搜索完成多步骤任务。

Strands Agents

Strands Agents SDK 是 AWS 提供的一个开源框架,用于采用模型驱动方法构建 AI 代理。与编写硬编码的工作流不同,开发者提供一个模型、系统提示和工具列表。模型本身决定接下来做什么:调用哪些工具、按什么顺序、以及何时任务完成。Strands Agents 的核心是代理循环。在每次迭代中,模型接收完整的对话历史记录,包括每个先前的工具调用及其结果。如果模型需要更多信息,它会请求工具;Strands Agents 执行该工具并将结果反馈回来。循环继续直到模型生成最终答案。这种跨迭代的上下文累积使代理能够处理超出单个 LLM 调用范围的多步骤任务。Strands Agents SDK 随附超过 40 个预构建工具,涵盖文件 I/O、shell 执行、网络搜索、AWS API、内存、代码执行等。它还支持模型上下文协议(MCP),因此 MCP 服务器提供的工具对代理可用,而无需额外的集成工作。添加新工具(包括 Exa 网络搜索工具)遵循相同的模式:将其放入 tools=[] 列表中,模型会从其签名中学习如何使用它们。

Exa

Exa 是专门为 LLM 和 AI 代理构建的网络规模搜索引擎。Exa 不仅理解查询的关键词,还能理解查询的实际含义。例如,“构建气候解决方案的初创公司”这样的查询会返回实际的气候初创公司,即使这些页面从未使用过这个确切短语。模型基于语义相似性而非字符串重叠进行匹配。结果以干净、结构化的形式返回,没有广告或 SEO 噪声,可以直接供 LLM 消费。

Strands Agents 和 Exa:集成概述

Exa 集成通过 strands-agents-tools 包提供。它为你的代理提供了两种能力:搜索相关的内容以及从特定 URL 提取全页文本。下图可视化了深度研究助手示例,将在本博客的后续部分详细讨论。

图像 1:Strands Agents 深度研究工作流

两者都针对 AI 消费进行了优化,返回代理可以直接推理的结构化内容。

  • exa_search:使用多种模式(自动、快速和深度)搜索网络。你的代理可以通过类别、域名、日期和文本内容过滤器来细化结果。
  • exa_get_contents:从代理发现的 URL(无论是来自之前的搜索还是自身的推理)检索全页内容。该工具首先检查缓存结果以加速重复请求。如果需要新鲜内容,它可以自动回退到实时爬取以获取页面的最新版本。

使用 `exa_search` 进行网络搜索

exa_search 工具让你的代理控制网络搜索,超越基本的查询字符串。该工具支持四种搜索模式。默认模式 auto 是大多数用例的推荐起点。

  • 即时(~200ms) – 专为实时应用设计,例如自动补全、实时建议和语音代理。
  • 快速(~450ms) – 在保持高速的同时仍能访问 Exa 的质量索引。适合代理工作流,代理可以进行数十次搜索调用。
  • 自动(~1s)[推荐] – 平衡延迟与高质量结果。推荐用于大多数用例。
  • 深度(~3-6s) – 对查询变体进行并行搜索以实现最大覆盖范围。最适合需要完整性的研究任务。

除了搜索模式之外,exa_search 还为您的代理提供了对结果过滤和范围控制的细粒度控制。您可以将搜索范围缩小到特定的内容类别,例如新闻文章、公司网站、GitHub 仓库、PDF 文件、个人资料或财务报告。当代理已经知道需要哪种类型的来源时,类别过滤最为有效。例如,当查询是技术性问题时,筛选为研究论文;或者当优先考虑时效性时,筛选为新闻来源。您还可以请求与搜索结果同步的内容和摘要,所有这些都可以在一个调用中完成:

python
agent.tool.exa_search(
    query="近期人工智能安全研究的进展",
    num_results=10,
    summary={"query": "关键研究领域和发现"}
)

使用 `exa_get_contents` 提取内容

一旦代理找到了相关的 URL,无论是通过之前的搜索还是自身的推理,exa_get_contents 工具都会检索完整页面的内容。您只需传递一个 URL 列表,它就会返回提取的文本,供代理处理。Exa 维护了一个内容缓存,可以立即提供已爬取页面的结果。对于不在缓存中的页面,或者当代理需要获取页面的最新版本时,该工具支持实时爬取。您可以通过实时爬取模式来控制此行为。一个可配置的超时时间控制实时爬取完成所需的时间。您还可以控制返回的文本量。例如,从页面检索最多 5,000 个字符的纯文本:

python
agent.tool.exa_get_contents(
    urls=["https://example.com/blog-post"],
    highlight={"maxCharacters": 5000}
)

前置条件

为了运行本文中的示例,您需要:

  • Python 3.10 或更高版本
  • 具有 Amazon Bedrock 访问权限的 AWS 账户
  • Exa API 密钥
  • 安装了 strands-agentsstrands-agents-tools 包:
  • pip install strands-agents strands-agents-tools

设置

Exa 工具遵循 Strands Agents 框架中的相同模式,因此如果您已经使用过其他 Strands 工具,体验将是相同的。Strands Agents SDK 包含一组预构建的工具库,涵盖文件操作、网络搜索、代码执行、AWS 服务、内存管理等。Exa 工具是该库的一部分。将其导入并通过 tools 参数传递给代理构造函数。代理底层的 LLM 会在其推理循环中决定何时调用每个工具。由于集成直接与 Exa REST API 通信,因此无需安装或管理单独的 SDK。唯一的新增依赖是 strands-agents-tools 包。要使用 Strands Agents 集成 Exa,请按照以下步骤操作:

#### 1. 设置 Exa API 密钥

Exa 需要 API 密钥进行身份验证。在运行代理之前,通过环境变量设置您的密钥。您可以在 Exa 仪表板 上获取密钥:

bash
export EXA_API_KEY="your_exa_api_key_here"

#### 2. 导入并注册工具

在代理代码中,从 strands_tools.exa 导入 exa_searchexa_get_contents,并将它们包含在代理的工具列表中:

python
from strands import Agent
from strands_tools.exa import exa_search, exa_get_contents
agent = Agent(tools=[exa_search, exa_get_contents])

#### 3. 调用代理

一旦工具注册完成,代理就可以在其推理流程中自然地交错执行搜索和内容提取:

python
response = agent("搜索人工智能代理的最新趋势,并提供关键发展的简洁总结")

设置完成后,您可以开始使用 Exa 工具进行不同的搜索场景。

示例:使用 Exa 构建深度研究代理

为了展示两个工具如何协同工作,以下示例构建了一个深度研究助手,它展示了多步工作流中的两个 Exa 工具。给定一个研究问题,代理会针对不同类型的来源运行四个有针对性的搜索,从最有前景的结果中提取完整内容,并将所有内容整合为结构化的研究简报。整个工作流在一个代理调用中执行,推理循环中包含多个工具调用。关键的设计见解是,不同类型的来源需要不同的搜索参数,但不需要不同的工具。在整个工作流中,两个 Exa 工具以不同的参数配置重复使用:类别用于目标新闻、PDF 或存储库;日期过滤器用于时效性;JSON 模式用于结构化提取;实时爬取用于新鲜度。

开始使用

  1. Exa 仪表板 注册一个 Exa API 密钥
  2. 克隆 示例存储库,并运行深度研究助手
  3. 修改系统提示以针对您的领域:替换类别过滤器、日期范围和 JSON 模式以匹配您的用例

设置代理

设置代理需要模型、系统提示以及两个 Exa 工具:

python
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools.exa import exa_search, exa_get_contents

def create_research_agent() -> Agent:
    model = BedrockModel(
        model_id="us.anthropic.claude-sonnet-4-6",
        region_name="us-west-2",
        max_tokens=20000,
    )
    return Agent(
        model=model,
        system_prompt=load_system_prompt(),
        tools=[exa_search, exa_get_contents],
    )

一个系统提示定义了研究工作流,指导代理通过六个步骤:四种针对不同资源类型的定向搜索、一次深入的内容提取以及最终的综合整理。代理决定何时以及如何调用每个工具,如何解释结果,并在推理循环中决定何时进入下一步。这六个步骤的研究工作流中的每一步都指示代理使用针对该类型内容调整过的参数调用 Exa 工具。

步骤 1:概览搜索 – 使用 auto 模式进行广泛扫描,构建基础理解。系统提示指示代理以这些参数调用 exa_search

code
- type: "auto"
- num_results: 5
- text: {"maxCharacters": 2000}
- highlights: {"maxCharacters": 4000}
- summary: {"query": "What are the key concepts, main points, and important details?"}
- subpages: 2
- subpage_target: ["overview", "about", "introduction"]
- max_age_hours: 168

标记语言

步骤 2:新闻搜索 – 聚焦于过去 30 天内的新闻来源。日期边界在 Python 中计算并注入提示中。max_age_hours 设置缓存内容可接受的最大年龄(以小时为单位)。

code
- category: "news"
- num_results: 5
- start_published_date: <runtime-injected: today minus 30 days>
- text: {"maxCharacters": 1500}
- summary: {"query": "What are the key announcements, developments, and news?"}
- max_age_hours: 24

标记语言

步骤 3:研究论文 – 为了学术深度,搜索目标定为 research paper 类别,并通过引导式 query 提取关键发现、方法论和结论作为简洁摘录。

code
- category: "research paper"
- num_results: 5
- text: {"maxCharacters": 2000}
- summary: {
    "query": "Extract the research findings, methodology, and conclusions",
    "schema": {
      "type": "object",
      "properties": {
        "title": {"type": "string", "description": "Paper title"},
        "main_findings": {"type": "string", "description": "Key findings and results"},
        "methodology": {"type": "string", "description": "Research methodology used"},
        "conclusions": {"type": "string", "description": "Main conclusions"}
      },
      "required": ["main_findings", "conclusions"]
    }
  }

XML

步骤 4:GitHub 项目 – 开源实现通过 github 类别浮现。

code
- category: "github"
- num_results: 5
- highlights: {"maxCharacters": 4000}

标记语言

步骤 5:深入挖掘 – 代理从发现切换到提取。前几步中最有价值的两到三个 URL 将其完整内容通过 exa_get_contents 获取。此步骤使用强制实时爬取("always" 而非 "fallback")以获取新鲜内容,字符限制更高(4000)以进行全面提取,并对参考文献、引文和方法论页面进行子页面爬取。

code
- urls: <前几步中最宝贵的 2-3 个 URL>
- text: {"maxCharacters": 4000}
- highlights: {"maxCharacters": 4000}
- summary: {"query": "Extract all important details, insights, and actionable information"}
- subpages: 3
- subpage_target: ["references", "citations", "bibliography", "methodology"]
- max_age_hours: 0

标记语言

步骤 6:综合整理 – 在最后一步中不调用任何工具。从前几步收集的所有内容汇总成结构化的研究简报,包含执行摘要、主题概述、最新发展、关键研究和论文、工具与实现、深入挖掘见解以及完整的带 URL 的来源列表。

多步骤工作流相比单一搜索调用或基本搜索 API 包装器具有多个优势:

  • 有根据的答案 – 最终简报中的每一项声明都可以追溯到来源 URL,减少幻觉现象。
  • 高效的令牌使用 – 搜索和提取时的摘要使内容更简洁,因此大型语言模型处理的是提炼后的知识而非原始页面转储。
  • 自主深度 – 代理在无需人工干预的情况下迭代不同类型的资源(新闻、论文、代码仓库、完整页面),覆盖单次搜索无法触及的范围。

使用 Amazon Bedrock AgentCore 可观察性进行跟踪

带有多个工具调用的 6 步管道如果没有结构化跟踪则很难调试。基于 OpenTelemetry 构建的 Amazon Bedrock AgentCore 可观察性 通过最小的代码更改对整个代理运行进行仪器化。每次工具调用和大型语言模型调用都成为一个带有父子关系的跨度。在 CloudWatch GenAI 可观察性仪表板中,每次研究运行都会显示为完整的跟踪。您可以查看代理中不同跨度的平均跨度延迟。

图 2:代理指标——错误和延迟仪表板

您可以钻取到各个跨度以检查:

  • 工具调用参数 每次 exa_searchexa_get_contents 调用,验证代理在每个步骤中是否正确使用了类别、日期范围和内容限制
图 3:跟踪详细信息——工具调用 JSON 负载
  • 每步延迟,识别新闻搜索或深入提取是否是瓶颈
  • LLM 调用的令牌消耗,显示搜索步骤与综合步骤之间的令牌分布

基于上下文的工作流是非确定性的。相同的查询可能会产生不同的搜索结果、深度挖掘时的不同 URL 选择以及不同的综合输出。跟踪数据将调试从猜测转变为检查。最终响应和研究简报的示例在最后一步中显示,如下图所示——

图 5:跟踪详细信息 - 最终综合输出

使用 Exa 工具的最佳实践

当你将 Exa 工具集成到代理中时,一些模式可以帮助你优化质量、延迟和成本。以下建议将帮助你在代理工作流中充分利用 Exa 工具。有关搜索类型、内容模式和高级过滤器的更多信息,请参阅Exa 最佳实践文档

  • 从 `auto` 开始并根据需要调整auto 搜索类型可以很好地处理大多数查询。对于研究任务,如果遗漏相关资源的成本很高,则切换到 deep;当代理执行大量连续搜索且累积延迟比每次查询的完整性更重要时,切换到 fastinstant
  • 控制内容大小以管理令牌预算:在“高亮”字段上设置 maxCharacters(默认最大字符数为 4,000)。

清理资源

本教程不会创建任何持久的 AWS 资源。如果你不再需要你的 Exa API 密钥,请从Exa 仪表板撤销它。

结论

Strands Agents SDKExa 提供了一条构建基于当前、准确网络信息的 AI 代理的路径。Exa 的搜索提供了语义理解,类别过滤缩小了结果范围,AI 摘要带有 JSON 模式返回代理所需的确切结构,并且实时爬取提供新鲜度。Strands Agents 集成通过两个工具和几行设置代码暴露了这些能力。

正如深度研究助手所展示的那样,你可以构建一个多步骤的研究代理,跨新闻、学术论文和代码存储库搜索,提取最佳结果的完整页面内容,并将其综合成一个有依据的研究简报,所有这些都由单一系统提示驱动。代理使用类别过滤器针对源类型,使用日期范围控制时效性,使用 JSON 模式塑造输出,并通过实时爬取管理新鲜度。你可以在将它们连接到代理之前,直接从Exa 仪表盘测试搜索、内容和答案端点。整个工作流可以通过Amazon Bedrock AgentCore 可观察性进行跟踪,将非确定性的代理行为转化为可检查、可调试的跨度。这种模式不仅适用于研究,还适用于竞争情报、技术支持、市场分析以及其他需要实时网络信息的领域。尝试使用自己的研究问题的深度研究助手样本获取你的 Exa API 密钥开始构建,探索Amazon Bedrock 文档了解更多关于底层平台的信息,并在Strands Agents GitHub 存储库分享你的反馈。

  • * *

关于作者们

AI 可能会生成不准确的信息,请核实重要内容