- Дата публикации
Как собрать ИИ‑агента с веб‑поиском: AWS Strands Agents подружили с Exa
Что нового
AWS дополнила open source‑SDK Strands Agents интеграцией с Exa — поисковым движком для LLM. Теперь агент может сам:
- Делать семантический веб‑поиск через инструмент
exa_search. - Тянуть полный текст страниц по URL через
exa_get_contents. - Получать результат уже очищенным от HTML, рекламы и SEO‑мусора — в виде структурированного текста, готового к вставке в контекст LLM.
- Выбирать режим поиска под задачу:
- Instant ~200 мс — для автодополнения, живых подсказок, голосовых ассистентов.
- Fast ~450 мс — для агентов, которые делают десятки запросов за сессию.
- Auto ~1 секунда — рекомендованный режим с балансом скорости и качества.
- Deep ~3–6 секунд — параллельные вариации запроса, максимум покрытия для ресёрча.
- Фильтровать результаты по категориям: новости, научные статьи, GitHub‑репозитории, сайты компаний, PDF, профили людей, финансовые отчёты.
- Ограничивать объём текста и выдержек по символам (
maxCharacters), чтобы не взрывать токен‑лимит модели. - Получать сразу краткие или структурированные (по JSON‑схеме) резюме документов на стороне Exa.
- Подключать live‑краулинг: брать свежую версию страницы или использовать кэш, если свежесть не критична.
Strands Agents уже включает более 40 готовых инструментов (файлы, shell, веб‑поиск, AWS API, память, исполнение кода и др.), а Exa добавляется к ним одной строкой в списке tools.
В примерной конфигурации из блога агент работает на Claude Sonnet 4.6 через Amazon Bedrock, с лимитом до 20 000 токенов на ответ.
Как это работает
Strands Agents: модель решает сама
Strands Agents — это SDK от AWS для «агентных» сценариев. Разработчик задаёт три вещи:
- Модель (например,
us.anthropic.claude-sonnet-4-6через Bedrock). - System prompt, где описан стиль и шаги работы агента.
- Список инструментов
tools=[...].
Дальше работает «агентный цикл»:
- Модель получает историю диалога и результаты всех предыдущих инструментов.
- Если ей не хватает данных, она сама вызывает нужный инструмент (например,
exa_search). - Strands Agents выполняет вызов, подставляет результат обратно в контекст.
- Цикл повторяется, пока модель не вернёт финальный ответ.
Инструменты описаны так, что модель понимает их сигнатуру и параметры. Никаких жёстко прошитых пайплайнов: порядок шагов и число вызовов инструментов модель определяет сама.
SDK также поддерживает Model Context Protocol (MCP), поэтому инструменты из MCP‑серверов можно подключать без отдельной интеграции.
Exa: поиск под LLM, а не под браузер
Exa — веб‑поиск, который ориентируется на семантику запроса, а не только на совпадения по ключевым словам. Пример из блога: запрос "startups building climate solutions" возвращает реальные климат‑стартапы, даже если на страницах нет точной фразы.
Главное отличие от классических поисковых API:
- Результат — структурированный текст без HTML‑шума и рекламы.
- Можно сразу запросить резюме документа и даже задать JSON‑схему, по которой Exa должна структурировать вывод (например, поля
main_findings,methodology,conclusionsдля научных статей). - Есть категории источников (news, research paper, github и т.д.), чтобы не смешивать новости, код и академию в одном ответе.
Интеграция Strands Agents + Exa
Интеграция поставляется как Python‑пакет strands-agents-tools и даёт два инструмента:
exa_search— семантический поиск с режимами Instant / Fast / Auto / Deep, фильтрами по категориям, доменам, дате и параметрами объёма текста/резюме.exa_get_contents— вытаскивает полный текст страниц по списку URL, с учётом кэша и live‑краулинга.
Оба инструмента возвращают данные в формате, удобном для LLM: структурированный текст, выдержки, резюме, метаданные и URL.
Exa поддерживает кэш: если страница уже проиндексирована и агенту не критична свежесть, ответ приходит быстрее. Для свежих данных можно включить принудительный live‑краулинг и задать таймаут ожидания.
Пример вызова exa_search с одновременным получением резюме:
agent.tool.exa_search(
query="recent advances in AI safety research",
num_results=10,
summary={"query": "key research areas and findings"}
)
Пример exa_get_contents c ограничением длины текста:
agent.tool.exa_get_contents(
urls=["https://example.com/blog-post"],
highlight={"maxCharacters": 5000}
)
Наблюдаемость через Amazon Bedrock AgentCore Observability
Многократные вызовы инструментов и LLM плохо дебажить без трассировки. Amazon Bedrock AgentCore Observability решает это с помощью OpenTelemetry:
- Каждый вызов
exa_search,exa_get_contentsи каждой LLM‑инференции становится span в трейсе. - В CloudWatch GenAI Observability Dashboard видно:
- параметры каждого вызова инструмента (категории, даты, лимиты текста);
- латентность по шагам (где тормозит — новости, deep‑поиск или глубокое извлечение);
- расход токенов по этапам (поиск против финального синтеза).
Это особенно полезно, потому что агентные пайплайны недетерминированы: один и тот же вопрос может привести к разным URL, разным глубинам обхода и разным ответам.
Что это значит для вас
Где это полезно
Интеграция Strands Agents + Exa закрывает типичный разрыв в агентных сценариях: «LLM умная, но живёт в отрыве от актуального веба». Теперь можно собрать агента, который:
- Ресёрч по теме:
- Собирает новости за последние 30 дней.
- Находит и кратко конспектирует научные статьи.
- Ищет GitHub‑репозитории с реализациями идей.
- Делает глубокий разбор 2–3 ключевых источников.
- Сводит всё в структурированный отчёт с источниками.
- Факт‑чекинг и конкурентная разведка:
- Фильтрует только по новостям, сайтам компаний, PDF‑отчётам.
- Ограничивает дату публикации.
- Ссылается на конкретные URL — видно, откуда взялась каждая цифра.
- Поддержка и теханалитика:
- Ищет багрепорты и обсуждения в GitHub.
- Подтягивает документацию и релиз‑ноты.
- Формирует краткие инструкции и сводки изменений.
Хороший сценарий: когда вам нужно много шагов и типов источников, а человек не хочет руками переключаться между Google, arXiv и GitHub.
Где не стоит применять
- Если нужен строгий офлайн‑режим без доступа к интернету — Exa не поможет, она работает как веб‑поиск.
- Если вы решаете задачу, где достаточно одного LLM‑запроса по локальным данным, агентный пайплайн с Exa будет избыточен.
- Если цена и задержка критичны до миллисекунд (например, реклама в RTB) — даже режим Instant (~200 мс) плюс инференция LLM может быть медленнее, чем специализированные индексы.
Доступность и ограничения
Для запуска из блога нужны:
- AWS‑аккаунт с доступом к Amazon Bedrock.
- Exa API‑ключ (выдаёт сама Exa через дашборд).
- Python 3.10+ и пакеты
strands-agents,strands-agents-tools.
Ограничения для России и СНГ:
- Доступ к Amazon Bedrock и Exa может требовать VPN и аккаунтов, зарегистрированных в других юрисдикциях.
- Условия использования и геоограничения нужно проверять на сайтах AWS и Exa.
Если вы работаете в российской компании с жёсткими требованиями по данным, придётся отдельно разбираться с юридическими аспектами вывода запросов и контента за пределы РФ.
Место на рынке
Прямых численных сравнений с Google Programmable Search API, Bing Web Search или Perplexity в блоге нет, но по функциональности связка Strands Agents + Exa занимает свою нишу:
- Поиск под LLM:
- Классические поисковые API возвращают HTML‑страницы и короткие сниппеты, оптимизированные под человека.
- Exa сразу отдаёт очищенный и структурированный текст, выдержки и резюме — минимум пост‑обработки на вашей стороне.
- Семантический поиск:
- Фокус не на точном совпадении фразы, а на смысловом соответствии запроса и документа.
- Агентный сценарий из коробки:
- Strands Agents уже умеет управлять инструментами, хранить историю и строить цикл «поиск → извлечение → синтез».
- Вам не нужно писать свой оркестратор и обвязку вокруг LLM.
Цен и прямых бенчмарков по скорости/стоимости против, например, Perplexity API или собственных векторных индексов в материале нет. Если вы выбираете между Exa и альтернативами, придётся тестировать на своих запросах и считать TCO: цена Exa‑запросов + токены LLM + задержка.
Установка
Для повторения примеров из блога вам нужно:
- Python 3.10+.
- AWS‑аккаунт с Amazon Bedrock.
- Exa API‑ключ.
- Установить пакеты:
pip install strands-agents strands-agents-tools
- Настроить переменную окружения с ключом Exa:
export EXA_API_KEY="your_exa_api_key_here"
Как запустить
Подключаем инструменты Exa к агенту
from strands import Agent
from strands_tools.exa import exa_search, exa_get_contents
agent = Agent(tools=[exa_search, exa_get_contents])
response = agent(
"Search for the most recent trends in AI agents and provide a concise summary of key developments"
)
Здесь модель сама решит, когда вызвать exa_search, какие параметры использовать и нужно ли потом тянуть полный текст через exa_get_contents.
Пример: глубокий ресёрч‑агент
Авторы блога собирают агента, который делает многошаговый ресёрч по заданному вопросу. Он использует обе функции Exa и работает поверх Claude Sonnet 4.6 в Bedrock.
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools.exa import exa_search, exa_get_contents
def create_research_agent() -> Agent:
model = BedrockModel(
model_id="us.anthropic.claude-sonnet-4-6",
region_name="us-west-2",
max_tokens=20000,
)
return Agent(
model=model,
system_prompt=load_system_prompt(),
tools=[exa_search, exa_get_contents],
)
system_prompt в этом примере описывает 6‑шаговый пайплайн:
- Обзорный поиск (Overview)
- Новости за последние 30 дней
- Научные статьи
- GitHub‑проекты
- Глубокое извлечение контента
- Финальный синтез в виде отчёта
Пошаговый воркфлоу
Шаг 1: обзорный поиск
Агент делает широкий поиск в режиме auto и строит базовое понимание темы.
Рекомендуемые параметры для exa_search:
type: "auto"num_results: 5text: {"maxCharacters": 2000}highlights: {"maxCharacters": 4000}summary: {"query": "What are the key concepts, main points, and important details?"}subpages: 2subpage_target: ["overview", "about", "introduction"]max_age_hours: 168(не старше 7 дней для кэшированного контента)
Шаг 2: новости
Фокус на новостях за последний месяц.
Параметры:
category: "news"num_results: 5start_published_date: <дата: сегодня минус 30 дней>text: {"maxCharacters": 1500}summary: {"query": "What are the key announcements, developments, and news?"}max_age_hours: 24(кэш не старше суток)
Шаг 3: научные статьи
Поиск по категории research paper с жёсткой JSON‑схемой для извлечения сути.
Параметры:
category: "research paper"num_results: 5text: {"maxCharacters": 2000}summaryс JSON‑схемой:
{
"query": "Extract the research findings, methodology, and conclusions",
"schema": {
"type": "object",
"properties": {
"title": {"type": "string", "description": "Paper title"},
"main_findings": {"type": "string", "description": "Key findings and results"},
"methodology": {"type": "string", "description": "Research methodology used"},
"conclusions": {"type": "string", "description": "Main conclusions"}
},
"required": ["main_findings", "conclusions"]
}
}
Так агент получает не просто абстракт, а структурированный конспект по каждой статье.
Шаг 4: GitHub‑проекты
Поиск по категории github, чтобы найти открытые реализации идей.
Параметры:
category: "github"num_results: 5highlights: {"maxCharacters": 4000}
Шаг 5: глубокое извлечение контента
Агент выбирает 2–3 самых ценных URL из предыдущих шагов и тянет полный текст через exa_get_contents.
Параметры:
urls: <2–3 наиболее полезных URL>text: {"maxCharacters": 4000}highlights: {"maxCharacters": 4000}summary: {"query": "Extract all important details, insights, and actionable information"}subpages: 3subpage_target: ["references", "citations", "bibliography", "methodology"]max_age_hours: 0(принудительно свежий контент, с live‑краулингом в режимеalways)
Шаг 6: финальный синтез
На этом шаге инструменты уже не вызываются. Агент собирает всё, что нашёл, в структурированный отчёт:
- Executive summary.
- Обзор темы.
- Недавние события и тренды.
- Ключевые исследования и статьи.
- Инструменты и реализации (включая GitHub).
- Глубокие инсайты из выбранных источников.
- Полный список источников с URL.
Почему многошаговый подход лучше простого поиска
- Привязка к источникам: каждая тезисная часть отчёта опирается на конкретный URL, что снижает риск галлюцинаций.
- Экономия токенов: Exa режет текст по
maxCharactersи делает резюме заранее, модель работает с выжимкой, а не со «сливом» всей страницы. - Автономная глубина: агент сам переключается между новостями, академией, репозиториями и полным текстом страниц без ручного управления.
Лучшие практики
Авторы блога предлагают несколько практических правил при работе с Exa в агентах:
- Начинайте с режима
auto:- Для большинства запросов его хватает.
- Переходите на
deep, если важно не потерять ни один релевантный источник. - Используйте
fastилиinstant, если агент делает много последовательных запросов и суммарная задержка критична.
- Контролируйте объём текста:
- Настраивайте
maxCharactersвhighlightsиtext, чтобы не переполнять контекст LLM. - По умолчанию
highlights— до 4000 символов, но это можно уменьшить.
- Настраивайте
Если вы строите продакшн‑агента, имеет смысл отдельно протестировать разные комбинации: auto vs deep, объём резюме, глубину обхода подстраниц и частоту live‑краулинга.
Как почистить ресурсы
Сама демонстрация в блоге не создаёт долгоживущие AWS‑ресурсы. Если вы больше не планируете использовать Exa, просто отзовите API‑ключ в дашборде Exa.
Если вы делаете агента, которому нужен живой веб, а не статичная база знаний, связка Strands Agents + Exa — рабочий шаблон. Можно быстро собрать ресёрч‑ассистента, конкурентного аналитика или техподдержку, где LLM не выдумывает факты, а опирается на текущие данные из интернета и честно показывает, откуда их взяла.