Skip to main content
Exa 是一款专为 LLM 使用而设计的搜索引擎。使用自然语言查询在互联网上搜索文档,然后从目标文档中获取经过清理的 HTML 内容 与基于关键词的搜索(如 Google)不同,Exa 的神经搜索能力可以语义理解查询并返回相关文档。例如,我们可以搜索 "fascinating article about cats",并比较 GoogleExa 的搜索结果。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 检索相关文档的检索器。
TextContentsOptionsmax_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 文档