AI Agents · Урок

Tavily и SerpAPI для поиска агентов

Настройка API, построение запросов и разбор результатов для инструментов веб-поиска.

Урок 1 из 413 шагов

«Tavily и SerpAPI для поиска агентов» — бесплатный урок AI Agents на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Зачем агентам нужен веб-поиск

У LLM есть дата отсечения знаний. Для вопросов о текущих событиях, актуальных ценах, свежих новостях или быстро меняющихся темах обучающие данные модели устарели.

Инструменты веб-поиска, такие как Tavily и SerpApi, предоставляют агентам доступ к интернету в реальном времени, устраняя разрыв между статичными обучающими данными и текущей действительностью.

Tavily: специализированный инструмент для ИИ-агентов

Tavily — это поисковый API, разработанный специально для ИИ-агентов. В отличие от обычного сбора данных из интернета, он возвращает чистые структурированные результаты с предварительно извлечённым содержимым — разбор HTML не требуется.

Установите пакет с помощью команды pip install tavily-python. Получите ключ API на сайте tavily.com.

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

Чтобы использовать Tavily или SerpApi внутри агента LangChain, оберните функцию поиска в 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]}...")

Проверка знаний

В чём заключается главное преимущество Tavily перед обычным сбором данных из интернета для ИИ-агентов?

Итоги: Tavily и SerpApi для поиска агентами

API веб-поиска предоставляют агентам доступ к актуальной информации, выходящей за пределы даты отсечения их обучения. Tavily специально создан для ИИ-агентов и выполняет извлечение чистого содержимого; SerpApi предоставляет более подробные структурированные данные Google, включая рекомендуемые фрагменты и информационные панели.

Основные практики: используйте фильтрацию по доменам для контроля качества, применяйте фильтры актуальности для запросов, чувствительных ко времени, нормализуйте длину фрагментов и реализуйте логику повторных попыток с задержкой для обработки ограничений частоты запросов.

Можно начать бесплатно

Изучай AI Agents с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
60
Уроки
239

Часто задаваемые вопросы

Урок «Tavily и SerpAPI для поиска агентов» бесплатный?

Да — полный текст урока «Tavily и SerpAPI для поиска агентов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Tavily и SerpAPI для поиска агентов»?

Настройка API, построение запросов и разбор результатов для инструментов веб-поиска. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Tavily и SerpAPI для поиска агентов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Tavily и SerpAPI для поиска агентов
  2. Ранжирование и фильтрация результатов поиска
  3. Шаблон цикла глубокого исследования
  4. Объединение веб-поиска с RAG
← Назад к AI Agents