Tavily实战:5个案例解锁AI搜索的强大能力

案例 1:基础实时搜索与结果处理

应用场景:构建一个简单的实时信息查询系统,用于快速获取特定主题的最新信息,如技术趋势、新闻事件或产品更新。解决传统搜索引擎结果分散、信息冗余的问题,直接返回结构化的高相关度结果。

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from tavily import TavilyClient
import os

# 从环境变量加载API密钥
api_key = os.getenv("TAVILY_API_KEY")
if not api_key:
raise ValueError("TAVILY_API_KEY 环境变量未设置")

# 初始化客户端
client = TavilyClient(api_key=api_key)

# 执行高级搜索,获取Python 3.12的最新特性
response = client.search(
query="Python 3.12 新特性",
search_depth="advanced", # 高级搜索模式,获取更全面的结果
max_results=5, # 限制返回结果数量
include_domains=["python.org", "realpython.com"] # 仅从指定域名获取结果
)

# 处理并打印结果
print(f"搜索查询: {response['query']}")
print(f"响应时间: {response['response_time']:.2f}秒\n")

for i, result in enumerate(response['results'], 1):
print(f"结果 {i}:")
print(f"标题: {result['title']}")
print(f"链接: {result['url']}")
print(f"摘要: {result['content'][:200]}...\n")

功能解析

  1. API密钥管理:通过环境变量安全加载API密钥,避免硬编码泄露风险。
  2. 搜索参数配置:
    • search_depth="advanced":启用高级搜索模式,提高结果质量和相关性
    • max_results=5:限制返回结果数量,减少信息过载
    • include_domains:仅从指定权威域名获取结果,提高信息可信度
  3. 结果处理:遍历返回结果,提取标题、URL和摘要信息,进行结构化展示。

使用建议

  • 最佳实践:将API密钥存储在.env文件中,使用python-dotenv库加载,提高安全性。
  • 性能优化:对于高频查询,可实现结果缓存机制,减少重复API调用。
  • 错误处理:添加异常捕获机制,处理网络错误、API限流等情况。
  • 适用场景:快速信息查询、技术调研、新闻聚合等需要实时数据的场景。

案例 2:问答搜索与LLM集成

应用场景:构建智能问答系统,直接返回自然语言答案,适合集成到聊天机器人、虚拟助手或知识问答平台。解决传统搜索需要用户自行筛选信息的问题,直接提供简洁准确的答案。

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from tavily import TavilyClient
import os

# 初始化客户端
client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))

# 问答搜索示例
question = "谁是 Lionel Messi?"
answer = client.qna_search(query=question)

print(f"问题: {question}")
print(f"答案: {answer}")

# 结合LLM进行扩展回答
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model="deepseek-chat",
openai_api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base="https://api.deepseek.com/v1"
)
extended_answer = llm.invoke(f"请详细介绍一下{question},基于以下信息:{answer}")

print(f"\n扩展回答: {extended_answer.content}")

功能解析

  1. 问答搜索:使用qna_search方法直接获取自然语言答案,无需手动解析搜索结果。
  2. LLM集成:将Tavily返回的答案作为上下文,结合LangChain和OpenAI的LLM生成更详细的回答。
  3. 结果格式:返回简洁准确的答案,适合直接展示给用户或作为LLM的输入。

使用建议

  • 最佳实践:在需要快速回答的场景中优先使用qna_search,减少LLM的调用次数和成本。
  • 结果验证:对于关键信息,建议同时返回来源链接,提高答案可信度。
  • 参数调整:通过search_depth参数控制回答的详细程度,”basic”模式返回更简洁的答案,”advanced”模式提供更全面的信息。
  • 适用场景:聊天机器人、智能客服、知识问答平台等需要直接回答用户问题的场景。

案例 3:批量内容提取与分析

应用场景:从多个网页中提取结构化内容,用于数据分析、文本挖掘或知识图谱构建。解决传统爬虫需要手动解析HTML、处理反爬机制的问题,直接返回清洗后的文本内容。

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from tavily import TavilyClient
import os
from bs4 import BeautifulSoup

# 初始化客户端
client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))

# 定义要提取内容的URL列表
urls = [
"https://en.wikipedia.org/wiki/Artificial_intelligence",
"https://en.wikipedia.org/wiki/Machine_learning",
"https://en.wikipedia.org/wiki/Data_science"
]

# 批量提取网页内容
response = client.extract(
urls=urls,
include_images=False, # 不提取图片,减少数据量
include_raw_content=True # 返回原始HTML内容,方便后续处理
)

# 处理提取结果
for result in response["results"]:
print(f"URL: {result['url']}")
print(f"标题: {result['title']}")

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(result['raw_content'], 'html.parser')
paragraphs = soup.find_all('p')

# 提取前3个段落作为摘要
if paragraphs:
print("摘要:")
for p in paragraphs[:3]:
print(f" {p.get_text()[:200]}...")
print("\n" + "="*80 + "\n")

功能解析

  1. 批量提取:一次最多可提取20个URL的内容,提高数据采集效率。
  2. 内容清洗:自动处理HTML标签,返回干净的文本内容。
  3. 灵活配置:可选择是否提取图片、原始HTML内容等,满足不同需求。
  4. 结果处理:结合BeautifulSoup进一步解析HTML内容,提取特定元素。

使用建议

  • 最佳实践:对于大规模数据采集,使用异步客户端AsyncTavilyClient提高并发处理能力。
  • 性能优化:限制include_raw_content为False,仅返回清洗后的文本内容,减少数据传输量。
  • 错误处理:检查response["failed_results"]处理提取失败的URL。
  • 适用场景:网页内容分析、文本挖掘、知识图谱构建、竞品分析等需要批量获取网页内容的场景。

案例 4:异步高并发搜索

应用场景:构建高并发的信息检索系统,同时处理多个搜索请求,提高系统吞吐量。解决传统同步搜索在高并发场景下性能瓶颈的问题,充分利用异步IO提高效率。

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import asyncio
from tavily import AsyncTavilyClient
import os

async def perform_search(client, query):
"""异步执行单个搜索任务"""
try:
response = await client.search(
query=query,
search_depth="basic", # 基础搜索模式,提高响应速度
max_results=3
)
return {
"query": query,
"results": response["results"]
}
except Exception as e:
return {
"query": query,
"error": str(e)
}

async def main():
# 初始化异步客户端
client = AsyncTavilyClient(api_key=os.getenv("TAVILY_API_KEY"))

# 定义多个搜索查询
queries = [
"2026年人工智能发展趋势",
"Python异步编程最佳实践",
"大模型微调技术",
"AI伦理与治理"
]

# 并发执行所有搜索任务
tasks = [perform_search(client, query) for query in queries]
results = await asyncio.gather(*tasks)

# 处理并打印结果
for result in results:
if "error" in result:
print(f"查询 '{result['query']}' 失败: {result['error']}")
else:
print(f"\n查询: {result['query']}")
for i, item in enumerate(result['results'], 1):
print(f" {i}. {item['title']}")
print(f" {item['url']}")

if __name__ == "__main__":
asyncio.run(main())

功能解析

  1. 异步客户端:使用AsyncTavilyClient实现异步IO操作,提高并发处理能力。
  2. 并发任务:通过asyncio.gather同时执行多个搜索任务,减少总等待时间。
  3. 错误处理:为每个搜索任务添加异常捕获,确保单个任务失败不影响整体执行。
  4. 性能优化:使用search_depth="basic"模式,提高响应速度,适合高并发场景。

使用建议

  • 最佳实践:在Web服务、API网关等高并发场景中优先使用异步客户端。
  • 资源管理:合理控制并发任务数量,避免超出API限流限制(默认100并发)。
  • 结果缓存:对于重复查询,实现缓存机制,减少API调用次数和成本。
  • 适用场景:实时数据监控、舆情分析、多任务信息检索等高并发场景。

案例 5:网站爬取与内容聚合

应用场景:构建网站内容聚合系统,从指定网站爬取相关页面内容,用于知识整理、竞品分析或内容监控。解决传统爬虫需要手动处理链接发现、页面解析的问题,直接返回结构化的爬取结果。

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from tavily import TavilyClient
import os

# 初始化客户端(确保 TAVILY_API_KEY 已设置在环境变量中)
client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))

# 使用新版 API 实现网站爬取
response = client.search(
query="Python 异步编程 asyncio 文档", # 查询语句,用于指导爬取内容的相关性
search_type="crawl", # 指定为爬取模式
urls=["https://docs.python.org/3/library/asyncio.html"], # 起始 URL(注意:去除末尾空格!)
max_results=5 # 最多返回 5 个页面
)

# 打印结果摘要
print(f"起始URL: https://docs.python.org/3/library/asyncio.html")
print(f"返回页面数量: {len(response['results'])}\n")

# 遍历并打印每个结果
for i, result in enumerate(response['results'], 1):
print(f"页面 {i}:")
print(f"标题: {result['title']}")
print(f"链接: {result['url']}")
print(f"内容预览: {result['content'][:300]}...\n")

功能解析

  1. 智能爬取:从指定URL开始,自动发现并爬取相关页面内容。
  2. 爬取控制:通过max_results参数控制爬取范围,避免过度爬取。
  3. 内容过滤:使用query参数指导爬取过程,仅提取相关内容。
  4. 结构化结果:返回包含URL、标题和内容的结构化结果,方便后续处理。

使用建议

  • 最佳实践:在爬取前查看目标网站的robots.txt文件,遵守爬取规则。
  • 性能优化:合理设置爬取深度和页面数量限制,避免长时间运行或触发反爬机制。
  • 内容处理:对爬取到的内容进行去重、清洗和分类,提高数据质量。
  • 适用场景:网站内容聚合、竞品分析、知识图谱构建、技术文档整理等需要批量获取网站内容的场景。

通用最佳实践

  1. API密钥安全
    • 始终使用环境变量或配置文件存储API密钥,避免硬编码
    • 定期轮换API密钥,防止泄露风险
  2. 性能优化
    • 根据需求选择合适的search_depth模式(basic/advanced)
    • 合理设置max_results参数,减少数据传输量
    • 高并发场景使用异步客户端AsyncTavilyClient
  3. 错误处理
    • 捕获并处理常见异常(如网络错误、API限流、无效密钥等)
    • 实现重试机制,提高系统健壮性
  4. 结果处理
    • 对返回结果进行去重、清洗和结构化处理
    • 实现结果缓存机制,减少重复API调用
  5. 成本控制
    • 监控API使用情况,避免超出免费额度
    • 优先使用qna_search获取简洁答案,减少API调用次数

这些案例覆盖了Tavily Python SDK的主要功能和应用场景,从基础搜索到高级爬取,从同步调用到异步并发,帮助你快速上手并灵活应用到实际项目中。