Дата публикации
ai_products

Как собрать ИИ‑агента с веб‑поиском: 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=[...].

Дальше работает «агентный цикл»:

  1. Модель получает историю диалога и результаты всех предыдущих инструментов.
  2. Если ей не хватает данных, она сама вызывает нужный инструмент (например, exa_search).
  3. Strands Agents выполняет вызов, подставляет результат обратно в контекст.
  4. Цикл повторяется, пока модель не вернёт финальный ответ.

Инструменты описаны так, что модель понимает их сигнатуру и параметры. Никаких жёстко прошитых пайплайнов: порядок шагов и число вызовов инструментов модель определяет сама.

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 + задержка.

Установка

Для повторения примеров из блога вам нужно:

  1. Python 3.10+.
  2. AWS‑аккаунт с Amazon Bedrock.
  3. Exa API‑ключ.
  4. Установить пакеты:
pip install strands-agents strands-agents-tools
  1. Настроить переменную окружения с ключом 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‑шаговый пайплайн:

  1. Обзорный поиск (Overview)
  2. Новости за последние 30 дней
  3. Научные статьи
  4. GitHub‑проекты
  5. Глубокое извлечение контента
  6. Финальный синтез в виде отчёта

Пошаговый воркфлоу

Шаг 1: обзорный поиск

Агент делает широкий поиск в режиме auto и строит базовое понимание темы.

Рекомендуемые параметры для exa_search:

  • type: "auto"
  • num_results: 5
  • text: {"maxCharacters": 2000}
  • highlights: {"maxCharacters": 4000}
  • summary: {"query": "What are the key concepts, main points, and important details?"}
  • subpages: 2
  • subpage_target: ["overview", "about", "introduction"]
  • max_age_hours: 168 (не старше 7 дней для кэшированного контента)

Шаг 2: новости

Фокус на новостях за последний месяц.

Параметры:

  • category: "news"
  • num_results: 5
  • start_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: 5
  • text: {"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: 5
  • highlights: {"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: 3
  • subpage_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 не выдумывает факты, а опирается на текущие данные из интернета и честно показывает, откуда их взяла.


Читайте также