本文由来自 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 提取全文。下图可视化了深度研究助手的示例,我们将在博客后面部分深入讨论。
两者都针对 AI 消费进行了优化,返回结构化内容,智能体可以直接在之上进行推理。
- exa_search:使用多种模式(包括 auto、fast 和 deep)搜索网络。你的智能体可以使用类别、域、日期和文本内容等过滤器细化结果。
- exa_get_contents:从智能体发现的 URL(无论是来自之前的搜索还是其自身推理)中检索完整页面内容。该工具首先检查缓存结果以加快重复请求速度。如果需要新鲜内容,它可以自动回退到实时爬取以检索页面的最新版本。
使用 exa_search 搜索网络
exa_search 工具为你的智能体提供了超越基本查询字符串的搜索控制。该工具支持四种搜索模式:
- Instant (~200ms) – 专为自动完成、实时建议和语音智能体等实时应用设计。
- Fast (~450ms) – 为速度优化,同时仍访问 Exa 的高质量索引。适用于智能体进行数十次搜索调用的工作流程。
- Auto (~1s) [推荐] – 平衡延迟与高质量结果。推荐用于大多数用例。
- Deep (~3-6s) – 跨查询变体运行并行搜索以获得最大覆盖率。最适合需要完整性的研究任务。
除了搜索模式,exa_search 还为你的智能体提供对结果过滤和范围的精细控制。您可以将搜索缩小到特定内容类别,如新闻文章、公司网站、GitHub 仓库、PDF、个人资料或财务报告。当智能体已经知道需要什么类型的来源时,类别过滤最为有效。例如,查询技术性时过滤到研究论文,或者优先考虑时效性时过滤到新闻来源。您还可以在搜索结果的同一行中请求内容和摘要:
agent.tool.exa_search(
query="recent advances in AI safety research",
num_results=10,
summary={"query": "key research areas and findings"}
)响应包含标题、URL 以及每个结果针对您指定查询的合成摘要。您的智能体可以在不阅读每个完整页面的情况下建立对主题的基础理解。
使用 exa_get_contents 提取内容
一旦您的智能体找到了相关的 URL,无论是来自之前的搜索还是其自身推理,exa_get_contents 工具就会检索完整页面内容。您向其传递一个 URL 列表,它返回提取的文本,供智能体处理。Exa 维护一个内容缓存,对于已经爬取的页面,可以即时提供结果。对于不在缓存中的页面,或者当您的智能体需要页面的最新版本时,该工具支持实时爬取。您可以使用 livecrawl 模式控制此行为。可配置的超时控制等待实时爬取完成的时间。您还可以控制返回的文本量。例如,从页面检索最多 5000 个字符的纯文本:
agent.tool.exa_get_contents(
urls=["https://example.com/blog-post"],
highlight={"maxCharacters": 5000}
)前提条件
要跟随本文中的示例,您需要:
- Python 3.10 或更高版本
- 具有 Amazon Bedrock 访问权限的 AWS 账户
- Exa API 密钥
- 安装 strands-agents 和 strands-agents-tools 包:
pip install strands-agents strands-agents-tools设置
Exa 工具遵循与 Strands Agents 框架中每个其他工具相同的模式,因此如果您使用过其他 Strands 工具,体验是相同的。Strands Agents SDK 包含一个预建工具库,涵盖文件操作、网络搜索、代码执行、AWS 服务、内存管理等。Exa 工具是该库的一部分。导入它们并通过 tools 参数传递给 Agent 构造函数。然后智能体的底层 LLM 在其推理循环中决定何时调用每个工具。由于集成直接与 Exa REST API 通信,因此您无需安装或管理单独的 SDK。唯一的新的依赖是 strands-agents-tools 包。
要使用 Exa 结合 Strands Agents,请按照以下步骤操作:
- 设置您的 Exa API 密钥
Exa 需要 API 密钥进行身份验证访问。在运行您的智能体之前,使用您的密钥设置 EXA_API_KEY 环境变量。您可以从 Exa 仪表板获取密钥:
```bash export EXA_API_KEY="your_exa_api_key_here" ```
- 导入并注册工具
在您的智能体代码中,从 strands_tools.exa 导入 exa_search 和 exa_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]) ```
- 调用您的智能体
注册工具后,您的智能体可以自然地在其推理流程中交错搜索和内容提取:
```python response = agent( "Search for the most recent trends in AI agents and provide a concise summary of key developments" ) ```
设置好智能体后,您就可以开始为不同的搜索场景使用 Exa 工具了。
示例:使用 Exa 构建深度研究智能体
为了查看两个工具如何协同工作,以下示例构建了一个深度研究助手,在多步骤工作流程中演示了这两个 Exa 工具。给定一个研究问题,智能体跨不同源类型运行四个目标搜索,从最有希望的结果中提取完整内容,并将所有内容综合成一个结构化的研究简报。整个工作流程在单个智能体调用中执行,推理循环中涉及多个工具调用。
关键设计见解是,不同的源类型需要不同的搜索参数,但不需要不同的工具。两个 Exa 工具在工作流程中重复使用,每个步骤具有不同的参数配置:类别用于定位新闻、PDF 或仓库;日期过滤器用于时效性;JSON 模式用于结构化提取;以及用于新鲜度的实时爬取。
开始使用
- 在 Exa 仪表板注册 Exa API 密钥
- 克隆示例仓库并运行深度研究助手
- 修改系统提示以针对您的领域:切换类别过滤器、日期范围和 JSON 模式以匹配您的用例
设置智能体
设置需要一个模型、一个系统提示和两个 Exa 工具:
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],
)系统提示定义了研究工作流程,引导智能体完成六个步骤:四次针对不同源类型的目标搜索,一次深入内容提取,以及一次最终综合传递。智能体决定何时以及如何调用每个工具,如何解释结果,以及何时在其推理循环中移动到下一步。
6 步骤研究工作流程
每个步骤指示智能体使用针对该内容类型调整的不同参数调用 Exa 工具。
步骤 1:概览搜索 – 使用 auto 模式进行广泛扫描以建立基础理解。系统提示指示智能体使用以下参数调用 exa_search:
- 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 设置缓存内容的最大可接受年龄(小时数)。
- category: "news"
- num_results: 5
- start_published_date: (计算值)
- text: {"maxCharacters": 1500}
- summary: {"query": "What are the key announcements, developments, and news?"}
- max_age_hours: 24
步骤 3:研究论文 – 继续执行后续步骤,针对研究论文和其他来源。由于篇幅限制,此处省略详细配置。
通过这种方式,深度研究智能体能够自主完成复杂的研究任务,实时获取并综合网络信息。