0Pricing
AI Agents · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 Tavily 和 SerpAPI 搜索
  2. 对搜索结果进行排序与筛选
  3. 深度研究循环模式
  4. 结合网络搜索与 RAG
← 返回 AI Agents