Tavily и SerpAPI для поиска агентов
Настройка API, построение запросов и разбор результатов для инструментов веб-поиска.
«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 — локальная установка не требуется.
Все уроки этого курса
- Tavily и SerpAPI для поиска агентов
- Ранжирование и фильтрация результатов поиска
- Шаблон цикла глубокого исследования
- Объединение веб-поиска с RAG