Проблема: ваш research agent тормозит из-за плохого сбора данных
В 2026 году каждый второй проект deep research агента упирается в одну стену - качество и скорость сбора данных. Вы можете поставить самую умную LLM, идеальный планировщик задач, но если информация из интернета приходит мусорная, позавчерашняя или нерелевантная, все разваливается. Агент начинает генерировать бред, основанный на устаревших статьях, или зацикливается, пытаясь найти то, чего нет.
Классическая ошибка: брать первый попавшийся API для поиска и думать, что этого достаточно. Поисковая выдача Google через стандартный API и реальные результаты в браузере - это две разные вселенные. Особенно после всех обновлений поисковых алгоритмов в 2025 году.
Три подхода доминируют сегодня: специализированные поисковые API для AI (Exa, Tavily), гибридные исследовательские платформы (Perplexity API) и ручное управление браузером через Playwright. Каждый убивает свою боль, но и создает новые. Давайте разбираться без маркетинговой шелухи.
1 Exa: поиск, который понимает контекст, а не ключевые слова
Exa (ранее известный как Metaphor) позиционирует себя как "поиск, понимающий смысл". Вместо того чтобы сопоставлять ключевые слова, их модель пытается понять семантику запроса. Звучит как магия? Отчасти так и есть, но магия стоит денег и имеет четкие ограничения.
Что делает Exa уникальным в 2026:
- Семантический поиск по содержимому страниц, а не только по метаданным
- Встроенное извлечение контента - возвращает уже очищенный текст с веб-страниц
- Фильтрация по дате, домену, типу контента на уровне API
- Поддержка поиска по аналогии ("найди сайты похожие на...")
Код ниже показывает, как это работает в реальном пайплайне агента. Обратите внимание на параметр highlights - это то, за что многие платят:
import exa_py
from datetime import datetime, timedelta
# Инициализация клиента Exa (версия API актуальна на март 2026)
client = exa_py.Exa(api_key="ваш_ключ")
# Семантический поиск с автоматическим извлечением контента
response = client.search_and_contents(
query="Новые методы квантовой коррекции ошибок 2025-2026",
num_results=10,
use_autoprompt=True, # Exa сам оптимизирует запрос для лучших результатов
include_domains=["arxiv.org", "nature.com"],
exclude_domains=["wikipedia.org"],
start_published_date=datetime(2025, 1, 1),
highlights=True, # Ключевая фича: извлекает релевантные фрагменты
text=True # Возвращает очищенный текст всей статьи
)
# Exa уже проделал скрапинг за вас
for result in response.results:
print(f"Заголовок: {result.title}")
print(f"Сайт: {result.url}")
print(f"Текст: {result.text[:500]}...") # Первые 500 символов
if result.highlights:
print(f"Ключевые фрагменты: {result.highlights}")
Предупреждение: Exa берет $0.005 за запрос с извлечением контента. При активном research агенте, который делает сотни запросов в день, счет может удивить. Но это плата за то, чтобы не возиться со скрапингом вручную.
2 Tavily: готовый пайплайн для ленивых (в хорошем смысле)
Если Exa - это кирпичи для строительства, то Tavily - это готовый дом. Их API разработан специально для AI агентов и выполняет всю грязную работу: поиск, скрапинг, очистку текста, суммирование. Вы получаете уже обработанные данные, готовые для передачи в LLM.
В статье "Архитектура State-of-the-Art Research Agent: философия и технические уроки от Tavily" подробно разобрано, как они сами строят своих агентов. Главный урок: Tavily не просто ищет, а понимает, какую информацию действительно нужно AI для ответа.
Чем Tavily отличается в 2026:
- Оптимизирован для работы с LLM - возвращает структурированные JSON ответы
- Автоматическое определение достоверности источников
- Встроенное суммирование длинных статей (экономит контекстное окно)
- Поддержка поиска по новостям, академическим статьям и общим знаниям
Простой пример, как Tavily интегрируется в research агента:
from tavily import TavilyClient
import json
# Инициализация Tavily (новый клиент 2026 года поддерживает асинхронные вызовы)
tavily = TavilyClient(api_key="ваш_ключ")
# Research-ориентированный поиск
response = tavily.search(
query="Сравнение эффективности трансформерных архитектур Gemini Ultra 2.0 и GPT-5",
search_depth="advanced", # Глубокий поиск с проверкой источников
max_results=8,
include_answer=True, # Tavily сам генерирует сводный ответ на основе найденного
include_raw_content=True,
include_images=False # Экономим трафик, если не нужны изображения
)
# Структурированный ответ, готовый для LLM
print(f"Ответ: {response['answer']}")
print(f"Количество источников: {len(response['results'])}")
# Каждый результат уже очищен и готов к использованию
for result in response['results']:
print(f"\nИсточник: {result['title']}")
print(f"Достоверность: {result['score']}/10")
print(f"Контент: {result['content'][:300]}...")
3 Playwright: когда нужно залезть в каждую щель
А теперь представим, что вам нужно скачать данные с сайта, который требует JavaScript, логина, кликов по кнопкам или работает через WebSocket. Exa и Tavily бессильны. Здесь в игру входит Playwright - инструмент для полного контроля над браузером.
В статье "AgentCrawl: Как создать оптимизированный под LLM скрапер" мы разбирали, как автоматизировать переход на headless-браузер, когда простой HTTP-запрос не работает. Playwright - это ядерный вариант, когда другие методы не справляются.
Когда Playwright незаменим в 2026:
- Сайты с тяжелым JavaScript (React, Vue, Angular SPA)
- Данные загружаются по мере прокрутки (infinite scroll)
- Требуется взаимодействие: клики, заполнение форм, навигация
- Нужны скриншоты или PDF (да, некоторые research агенты анализируют визуалы)
- Обход анти-бот систем (осторожно, это серая зона)
Пример сбора данных с современного SPA-сайта через Playwright 1.45 (актуальная версия на март 2026):
import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
import json
async def scrape_spa_site(url):
async with async_playwright() as p:
# Запускаем браузер с детекцией как обычный Chrome
browser = await p.chromium.launch(
headless=True,
args=['--disable-blink-features=AutomationControlled']
)
context = await browser.new_context(
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
viewport={'width': 1920, 'height': 1080}
)
page = await context.new_page()
# Идем на страницу и ждем загрузки контента
await page.goto(url, wait_until='networkidle')
# Ждем появления конкретного элемента (например, статей)
await page.wait_for_selector('.article-list', timeout=10000)
# Прокручиваем страницу 3 раза для загрузки ленивого контента
for _ in range(3):
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.wait_for_timeout(2000)
# Получаем HTML после выполнения всего JavaScript
html = await page.content()
# Парсим с BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
articles = []
for item in soup.select('.article-item'):
title = item.select_one('h2').text.strip() if item.select_one('h2') else ''
# Извлекаем текст, удаляя все теги кроме параграфов
content = ' '.join([p.text for p in item.select('p')])
articles.append({
'title': title,
'content': content[:1000], # Ограничиваем для LLM
'url': url
})
await browser.close()
return articles
# Запускаем скрапинг
# articles = asyncio.run(scrape_spa_site('https://example-spa-site.com'))
Главная проблема Playwright - производительность. Один запрос через Playwright занимает 3-10 секунд, когда HTTP-запрос через те же aiohttp делает это за 200-500 мс. В масштабе это убивает скорость research агента.
Гибридная архитектура: как совместить три подхода без головной боли
Умные research агенты в 2026 году не используют один инструмент. Они выбирают инструмент под задачу. Вот как выглядит реальная архитектура смарт-агента:
| Тип запроса | Первый выбор | Фолбэк | Причина |
|---|---|---|---|
| Быстрый факт-чекинг | Tavily (с include_answer=True) | Exa с highlights | Tavily уже суммирует, Exa дает цитаты |
| Глубокий анализ темы | Exa (10-15 результатов) | Свой скрапер на aiohttp | Exa находит академические источники, которые Google пропускает |
| Данные с SPA/JavaScript сайтов | Playwright | Ничего (пропускаем сайт) | Другие инструменты не работают с JS |
| Поиск последних новостей (<24ч) | Exa с фильтром по дате | RSS парсинг напрямую | Exa индексирует быстрее, чем Tavily |
Практическая реализация роутера запросов в Python:
class ResearchDataRouter:
def __init__(self, exa_client, tavily_client, playwright_enabled=True):
self.exa = exa_client
self.tavily = tavily_client
self.playwright_enabled = playwright_enabled
async def fetch_data(self, query: str, context: dict) -> list:
"""
Умный роутер, который выбирает лучший метод сбора данных
context содержит:
- 'urgency': 'fast' | 'deep'
- 'source_type': 'news' | 'academic' | 'general'
- 'requires_interaction': bool
"""
# Если нужна мгновенная проверка факта
if context.get('urgency') == 'fast':
return await self._use_tavily(query, include_answer=True)
# Если нужны академические источники
elif context.get('source_type') == 'academic':
return await self._use_exa(query, include_domains=['arxiv.org', 'scholar.google.com'])
# Если сайт требует JavaScript
elif context.get('requires_interaction'):
if not self.playwright_enabled:
raise ValueError("Playwright required but not enabled")
return await self._use_playwright(query)
# По умолчанию используем Exa для баланса качества и скорости
else:
return await self._use_exa(query)
async def _use_tavily(self, query, **kwargs):
# Реализация вызова Tavily
pass
async def _use_exa(self, query, **kwargs):
# Реализация вызова Exa
pass
async def _use_playwright(self, query):
# Реализация Playwright скрапинга
pass
Ошибки, которые сломают ваш пайплайн (и как их избежать)
Ошибка 1: Доверять всему, что приходит из API
Exa и Tavily - не истина в последней инстанции. Они могут возвращать устаревшие данные, сайты с paywall или откровенную дезинформацию. В 2026 году появилось множество сайтов, генерирующих контент ИИ для SEO, и поисковые системы до сих пор не всегда их фильтруют.
Решение: Добавляйте валидацию источников. Проверяйте домен, дату публикации, наличие контактов автора. Или используйте подход из статьи "TextWeb", где сравниваются данные из разных источников.
Ошибка 2: Игнорировать кэширование
Research агенты часто делают одинаковые запросы. Без кэширования вы платите Exa/Tavily за одно и то же, а Playwright тратит секунды на загрузку одинаковых страниц.
# Простой кэш на Redis для запросов Exa/Tavily
import redis
import hashlib
import json
class SearchCache:
def __init__(self, ttl=3600): # 1 час
self.redis = redis.Redis(host='localhost', port=6379)
self.ttl = ttl
def _make_key(self, query, params):
# Создаем уникальный ключ на основе запроса и параметров
key_str = f"{query}:{json.dumps(params, sort_keys=True)}"
return hashlib.md5(key_str.encode()).hexdigest()
def get(self, query, params):
key = self._make_key(query, params)
cached = self.redis.get(key)
return json.loads(cached) if cached else None
def set(self, query, params, data):
key = self._make_key(query, params)
self.redis.setex(key, self.ttl, json.dumps(data))
Ошибка 3: Синхронные вызовы в асинхронном агенте
Если ваш research agent работает асинхронно (а так делают все современные агенты в 2026), то синхронные HTTP-запросы к API будут блокировать весь event loop. Особенно это больно с Playwright, где операции занимают секунды.
Совет: используйте aiohttp для HTTP-запросов, асинхронные клиенты для Exa/Tavily (они появились в 2025), и async версию Playwright. Если библиотека не поддерживает async, выносите вызовы в thread pool через asyncio.to_thread().
Частые вопросы (FAQ)
Что лучше для стартапа с ограниченным бюджетом?
Начните с Tavily. У них есть бесплатный тариф (100 запросов в месяц), который позволяет протестировать концепцию. Когда упретесь в лимиты, добавьте простой HTTP-скрапер на aiohttp для основных сайтов, и только потом рассматривайте Exa для специфических задач.
Как обрабатывать сайты с paywall или требующие логина?
Ни Exa, ни Tavily не помогут. Здесь только Playwright с сохранением cookies (но помните о юридических ограничениях). Альтернатива - искать те же статьи на preprint серверах вроде arXiv или через Google Scholar.
Стоит ли использовать Perplexity API вместо Tavily?
Perplexity API (обновленный в конце 2025) хорош для конверсационных сценариев, где нужен диалог с поиском. Но для research агентов, которым нужно сырые данные для анализа, Tavily и Exa дают больше контроля. Perplexity больше подходит для финального этапа - генерации ответа пользователю.
Как ускорить работу Playwright?
1) Используйте один инстанс браузера на множество запросов. 2) Реиспользуйте контексты и страницы где возможно. 3) Параллелизуйте скрапинг разных сайтов, но не перегружайте один сайт (получите бан). 4) Отключайте загрузку изображений, CSS, шрифтов через route.continue() если они не нужны.