Exa 是一款专为 LLM 使用而设计的搜索引擎。使用自然语言查询在互联网上搜索文档,然后从目标文档中获取经过清理的 HTML 内容。
与基于关键词的搜索(如 Google)不同,Exa 的神经搜索能力可以语义理解查询并返回相关文档。例如,我们可以搜索 "fascinating article about cats",并比较 Google 和 Exa 的搜索结果。Google 基于关键词 “fascinating” 给出了 SEO 优化的列表页,而 Exa 则直接理解意图并返回结果。
本笔记本介绍如何在 LangChain 中使用 Exa Search。
安装 LangChain Exa 集成包:
pip install -qU langchain-exa
# 以及本笔记本的一些依赖
pip install -qU langchain langchain-openai langchain-community
您需要 Exa API 密钥才能使用此集成。在此注册即可获得 $10 免费额度(完成特定操作(如首次搜索)后还可获得更多额度)。
import getpass
import os
if not os.environ.get("EXA_API_KEY"):
os.environ["EXA_API_KEY"] = getpass.getpass("Exa API key:\n")
使用 ExaSearchResults 工具
ExaSearchResults 是一个可与 LangChain Agent 配合使用的工具,用于执行 Exa 搜索。它为搜索操作提供了更结构化的接口:
from langchain_exa import ExaSearchResults
# 初始化 ExaSearchResults 工具
search_tool = ExaSearchResults(exa_api_key=os.environ["EXA_API_KEY"])
# 执行搜索查询
search_results = search_tool._run(
query="When was the last time the New York Knicks won the NBA Championship?",
num_results=5,
text_contents_options=True,
highlights=True,
)
print("Search Results:", search_results)
ExaSearchResults 的高级功能
您可以使用高级搜索选项,例如控制搜索类型、实时抓取和内容过滤:
# 使用高级选项执行搜索查询
search_results = search_tool._run(
query="Latest AI research papers",
num_results=10, # 结果数量(1-100)
type="auto", # 可以是 "neural"、"keyword" 或 "auto"
livecrawl="always", # 可以是 "always"、"fallback" 或 "never"
text_contents_options={"max_characters": 2000}, # 限制文本长度
summary={"query": "generate one liner"}, # 自定义摘要提示
)
print("Advanced Search Results:")
print(search_results)
使用 ExaFindSimilarResults 工具
ExaFindSimilarResults 允许您查找与给定 URL 相似的网页,适用于查找相关内容或竞品分析:
from langchain_exa import ExaFindSimilarResults
# 初始化 ExaFindSimilarResults 工具
find_similar_tool = ExaFindSimilarResults(exa_api_key=os.environ["EXA_API_KEY"])
# 根据 URL 查找相似结果
similar_results = find_similar_tool._run(
url="http://espn.com", num_results=5, text_contents_options=True, highlights=True
)
print("Similar Results:", similar_results)
在 Agent 中使用
我们可以将 ExaSearchResults 和 ExaFindSimilarResults 工具与 LangGraph Agent 结合使用。这赋予 Agent 根据用户查询动态搜索信息并查找相似内容的能力。
首先,配置语言模型。您需要提供 OpenAI API 密钥:
import getpass
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API key:\n")
需要安装 langgraph:
pip install -qU langgraph
from langchain.chat_models import init_chat_model
from langchain_exa import ExaFindSimilarResults, ExaSearchResults
from langchain.agents import create_agent
# 初始化语言模型
model = init_chat_model(model="gpt-4.1", model_provider="openai", temperature=0)
# 初始化 Exa 工具
exa_search = ExaSearchResults(
exa_api_key=os.environ["EXA_API_KEY"],
max_results=5,
)
exa_find_similar = ExaFindSimilarResults(
exa_api_key=os.environ["EXA_API_KEY"],
max_results=5,
)
# 使用两个工具创建 Agent
agent = create_agent(model, [exa_search, exa_find_similar])
# 示例 1:基础搜索
user_input = "What are the latest developments in quantum computing?"
for step in agent.stream(
{"messages": user_input},
stream_mode="values",
):
step["messages"][-1].pretty_print()
使用 ExaSearchRetriever
ExaSearchRetriever 是一个使用 Exa Search 检索相关文档的检索器。
TextContentsOptions 的 max_characters 参数原来叫做 max_length,该名称现已弃用。请确保使用 max_characters。
基础用法
以下是使用 ExaSearchRetriever 的简单示例:
from langchain_exa import ExaSearchRetriever
# 创建 ExaSearchRetriever 实例
exa = ExaSearchRetriever(exa_api_key=os.environ["EXA_API_KEY"])
# 搜索并保存结果
results = exa.invoke("What is the capital of France?")
# 打印结果
print(results)
高级功能
您可以使用高级功能控制结果数量、搜索类型、实时抓取、摘要以及文本内容选项:
from langchain_exa import ExaSearchRetriever
# 使用高级选项创建实例
exa = ExaSearchRetriever(
exa_api_key=os.environ["EXA_API_KEY"],
k=20, # 结果数量(1-100)
type="auto", # 可以是 "neural"、"keyword" 或 "auto"
livecrawl="always", # 可以是 "always"、"fallback" 或 "never"
text_contents_options={"max_characters": 3000}, # 限制文本长度
# 用于 LLM 生成页面内容摘要的自定义提示
summary={"query": "generate one line summary in simple words."},
)
# 使用高级选项搜索
results = exa.invoke("Latest developments in quantum computing")
print(f"Found {len(results)} results")
for result in results[:3]: # 打印前 3 个结果
print(f"Title: {result.metadata.get('title', 'N/A')}")
print(f"URL: {result.metadata.get('url', 'N/A')}")
print(f"Summary: {result.metadata.get('summary', 'N/A')}")
print("-" * 80)
API 参考
关于所有 Exa API 功能和配置的详细文档,请访问 Exa API 文档。