使用 Tavily 和 SerpAPI 搜索
为网络搜索工具配置 API、构建查询并解析结果。
使用 Tavily 和 SerpAPI 搜索 是 CoddyKit 上的免费 AI Agents 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
智能体为何需要网络搜索
LLM 有知识截止日期。对于时事、实时价格、近期新闻或快速变化的主题,模型的训练数据已经过时。
Tavily 和 SerpApi 等网络搜索工具可以让智能体实时访问互联网,弥合静态训练数据与当前现实之间的差距。
Tavily:专为 AI 智能体打造
Tavily 是专门为 AI 智能体设计的搜索 API。与通用的网络抓取不同,它会返回包含预提取内容的干净、结构化结果,无需解析 HTML。
使用 pip install tavily-python 安装。请在 tavily.com 获取 API 密钥。
from tavily import TavilyClient
import os
client = TavilyClient(api_key=os.getenv('TAVILY_API_KEY'))
results = client.search(
query='latest OpenAI GPT-5 release date',
max_results=5
)
for r in results['results']:
print(r['title'])
print(r['url'])
print(r['content'][:200])
print('---')Tavily 搜索参数
Tavily 提供多个参数来控制搜索行为。对智能体最有用的参数是 max_results、search_depth 以及 include_domains / exclude_domains。
# Basic search
results = client.search(
query='Python async best practices 2024',
max_results=5,
search_depth='basic' # 'basic' (fast) or 'advanced' (slower, deeper)
)
# Domain-filtered search
results = client.search(
query='machine learning papers',
max_results=5,
include_domains=['arxiv.org', 'papers.nips.cc', 'openreview.net']
)
# Exclude low-quality domains
results = client.search(
query='stock market today',
max_results=5,
exclude_domains=['pinterest.com', 'quora.com']
)Tavily 结果结构
每个 Tavily 结果都包含:title、url、content(提取的文本)、score(相关性),以及可选的 published_date。content 字段是干净的文本,不包含 HTML 标签。
results = client.search('Claude AI pricing 2024', max_results=3)
for r in results['results']:
print(f"Title: {r['title']}")
print(f"URL: {r['url']}")
print(f"Score: {r.get('score', 'N/A')}")
print(f"Date: {r.get('published_date', 'unknown')}")
print(f"Content: {r['content'][:300]}")
print()
# Tavily also returns 'answer' — a direct answer synthesized from results
if results.get('answer'):
print('Direct answer:', results['answer'])SerpApi:以编程方式访问 Google 搜索
SerpApi 提供对 Google、Bing、YouTube 及其他搜索引擎的结构化访问。它会返回丰富的数据,包括自然搜索结果、知识面板、精选摘要和购物结果。
使用 pip install google-search-results 安装。
from serpapi import GoogleSearch
import os
params = {
'q': 'best Python web frameworks 2024',
'api_key': os.getenv('SERPAPI_KEY'),
'num': 5, # number of results
'hl': 'en', # language
'gl': 'us', # country
'safe': 'active' # safe search
}
search = GoogleSearch(params)
results = search.get_dict()
for r in results.get('organic_results', []):
print(r['title'])
print(r['link'])
print(r.get('snippet', ''))
print()SerpApi 结果结构
SerpApi 返回的结构化数据比 Tavily 更丰富。organic_results 中的关键字段包括:title、link、snippet、position。精选摘要会单独出现在 answer_box 下。
def extract_serp_results(serp_data, max_results=5):
results = []
# Featured snippet / answer box (highest priority)
if 'answer_box' in serp_data:
box = serp_data['answer_box']
results.append({
'title': box.get('title', 'Featured Snippet'),
'url': box.get('link', ''),
'snippet': box.get('answer') or box.get('snippet', ''),
'is_featured': True
})
# Organic results
for r in serp_data.get('organic_results', [])[:max_results]:
results.append({
'title': r.get('title', ''),
'url': r.get('link', ''),
'snippet': r.get('snippet', ''),
'position': r.get('position', 0),
'is_featured': False
})
return results
if __name__ == '__main__':
demo_serp = {
'answer_box': {'title': 'Python version', 'link': 'https://python.org', 'answer': '3.13'},
'organic_results': [
{'title': 'Python Docs', 'link': 'https://docs.python.org', 'snippet': 'Official docs', 'position': 1},
],
}
for r in extract_serp_results(demo_serp):
print(f"{'[FEATURED] ' if r['is_featured'] else ''}{r['title']} - {r['url']}")
新鲜度选项与日期筛选
对于时间敏感的查询,请按发布日期筛选结果。Tavily 支持 days 参数;SerpApi 支持 tbs(基于时间的搜索)参数。
# Tavily: results from last 7 days
recent_results = client.search(
query='AI news',
max_results=5,
days=7 # only results published in last 7 days
)
# SerpApi: results from last month
params = {
'q': 'AI news',
'api_key': os.getenv('SERPAPI_KEY'),
'tbs': 'qdr:m', # qdr:d=day, qdr:w=week, qdr:m=month, qdr:y=year
'num': 5
}
search = GoogleSearch(params)
results = search.get_dict()为 LangChain 构建搜索工具
要在 LangChain 智能体中使用 Tavily 或 SerpApi,请将搜索函数封装为 Tool。之后,智能体便可以根据您提供的描述,像调用其他工具一样调用它。
from langchain.tools import Tool
from tavily import TavilyClient
import os
tavily = TavilyClient(api_key=os.getenv('TAVILY_API_KEY'))
def tavily_search(query: str) -> str:
results = tavily.search(query=query, max_results=3, search_depth='basic')
output = []
for r in results['results']:
output.append(f"Title: {r['title']}\nURL: {r['url']}\nContent: {r['content'][:500]}")
return '\n\n'.join(output)
web_search_tool = Tool(
name='web_search',
func=tavily_search,
description='Search the web for current information. Input: a search query string. Returns top results with title, URL, and content.'
)通过域名筛选控制质量
并非所有搜索结果都可靠。域名筛选可以让您将搜索限制在可信来源内(用于研究),或排除充斥垃圾内容的域名(用于一般查询)。
TRUSTED_DOMAINS = {
'medical': ['nih.gov', 'who.int', 'mayoclinic.org', 'pubmed.ncbi.nlm.nih.gov'],
'legal': ['law.cornell.edu', 'supreme.justia.com', 'congress.gov'],
'tech': ['docs.python.org', 'developer.mozilla.org', 'stackoverflow.com'],
'finance': ['sec.gov', 'federalreserve.gov', 'bloomberg.com']
}
SPAM_DOMAINS = ['pinterest.com', 'quora.com', 'answers.yahoo.com', 'wikihow.com']
def domain_aware_search(query, domain_category=None):
kwargs = {'query': query, 'max_results': 5, 'exclude_domains': SPAM_DOMAINS}
if domain_category and domain_category in TRUSTED_DOMAINS:
kwargs['include_domains'] = TRUSTED_DOMAINS[domain_category]
return client.search(**kwargs)处理搜索错误和速率限制
Tavily 和 SerpApi 都有速率限制。请使用指数退避实现重试逻辑,并妥善处理搜索没有返回结果的情况。
import time
def robust_search(query, max_retries=3):
for attempt in range(max_retries):
try:
results = client.search(query=query, max_results=5)
if results and results.get('results'):
return results['results']
print(f'No results for: {query}')
return []
except Exception as e:
if '429' in str(e) or 'rate' in str(e).lower():
wait = 2 ** attempt # 1s, 2s, 4s
print(f'Rate limited. Waiting {wait}s...')
time.sleep(wait)
else:
print(f'Search error: {e}')
return []
return []规范化摘要长度
结果摘要的长度差异很大:有些只有 50 个字符,有些则长达 2000 个字符。规范化摘要长度可以确保每个来源在 LLM 上下文中获得同等的呈现空间。
MAX_SNIPPET_CHARS = 600
MIN_SNIPPET_CHARS = 100
def normalize_snippets(results):
normalized = []
for r in results:
content = r.get('content') or r.get('snippet', '')
# Truncate long snippets at sentence boundary
if len(content) > MAX_SNIPPET_CHARS:
# Find last sentence end before limit
cutoff = content.rfind('. ', 0, MAX_SNIPPET_CHARS)
content = content[:cutoff + 1] if cutoff > 0 else content[:MAX_SNIPPET_CHARS]
# Skip very short snippets
if len(content) < MIN_SNIPPET_CHARS:
continue
normalized.append({**r, 'content': content})
return normalized
if __name__ == '__main__':
demo_results = [
{'content': 'Short.'},
{'content': 'A' * 200 + '. ' + 'B' * 500},
]
for r in normalize_snippets(demo_results):
print(f"Length {len(r['content'])}: {r['content'][:60]}...")
知识检查
对于 AI 智能体而言,Tavily 相比通用网络抓取方法的主要优势是什么?
回顾:使用 Tavily 和 SerpApi 搜索智能体所需信息
网络搜索 API 可以让智能体获取超出训练数据截止范围的当前信息。Tavily 专为 AI 智能体打造,能够干净地提取内容;SerpApi 提供更丰富的 Google 结构化数据,包括精选摘要和知识面板。
关键实践包括:使用域名筛选控制质量,对时间敏感的查询应用新鲜度筛选,规范化摘要长度,并通过带退避的重试逻辑处理速率限制。
常见问题解答
「使用 Tavily 和 SerpAPI 搜索」课时是免费的吗?
是的 — 「使用 Tavily 和 SerpAPI 搜索」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「使用 Tavily 和 SerpAPI 搜索」这节课中我会学到什么?
为网络搜索工具配置 API、构建查询并解析结果。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用 Tavily 和 SerpAPI 搜索」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 Tavily 和 SerpAPI 搜索
- 对搜索结果进行排序与筛选
- 深度研究循环模式
- 结合网络搜索与 RAG