← Модуль 4: Architect
4.4

Multi-agent research: координатор + подагенты

Цель: спроектировать систему которая исследует широкую тему параллельно, синтезирует результаты, сохраняет источники. Сценарий 3 экзамена Architect.

Задача из экзамена

Ты строишь многоагентную исследовательскую систему на Claude Agent SDK. Агент-координатор делегирует задачи специализированным подагентам:

  • Один ищет в вебе
  • Другой анализирует документы
  • Третий синтезирует результаты

Система исследует темы и создаёт полные отчёты со ссылками на источники.

Hub-and-spokes архитектура

            [  Coordinator (Opus)  ]
              /         |          \
       [Search]    [Analyst]    [Synth]
       (Haiku)     (Sonnet)     (Sonnet)

Роли

АгентЗадачаМодель
CoordinatorДекомпозиция, делегирование, агрегация, итеративное уточнениеOpus (глубина)
SearchВеб-поиск, фильтрация источниковHaiku (дёшево, объёмно)
AnalystЧтение длинных документов, извлечение ключевых выводовSonnet
SynthСинтез множественных источников в связный отчётSonnet

Декомпозиция — самая частая ошибка

Плохой пример (вопрос 7 экзамена)

Тема: "Влияние AI на творческие индустрии"

Координатор декомпозирует на 3 подтемы:

  1. AI в цифровом арт-создании
  2. AI в графическом дизайне
  3. AI в фотографии

Каждый подагент работает отлично. Но итоговый отчёт покрывает только визуальные искусства, полностью пропускает музыку, литературу, кинопроизводство.

Корневая причина: декомпозиция слишком узкая. Подагенты сделали корректно что им поручили — проблема в координаторе.

Лечение

Координатор должен:

  1. Мапить широкое поле перед декомпозицией
  2. Явно покрывать все секторы: "творческие индустрии включают visual art, music, literature, film, performing arts, design"
  3. Рефлексировать: "покрыл ли я все области? каких нет?"
  4. Итеративно уточнять: если обнаружил пробел — делегируй новый подагент

Распределение с минимизацией дублирования

# Плохо — оба агента могут найти одно и то же
call_task("search", "find papers on AI in creative industries")
call_task("search", "find papers on AI in creative industries")
 
# Хорошо — явное разделение
call_task("search_a", """
Find academic papers on AI in creative industries.
Your scope: VISUAL (art, design, photography, film).
Avoid: music, literature (other agents handle those).
""")
 
call_task("search_b", """
Find academic papers on AI in creative industries.
Your scope: TEXT-BASED (literature, journalism, poetry).
Avoid: visual arts, music, film.
""")
 
call_task("search_c", """
Find academic papers on AI in creative industries.
Your scope: AUDIO (music, sound design, audio production).
Avoid: visual, text, video.
""")

Каждый подагент знает свою территорию и чужие зоны.

Контекст передаётся явно

Критично напомнить: подагенты не наследуют контекст координатора. Всё что нужно — в промпте Task.

call_task("analyst", prompt=f"""
Previous search agent found these papers:
{search_results}  # явно включаем!
 
User's original question: "{user_question}"
 
Your task:
- Read each paper
- Extract: main claim, methodology, limitations, 2 key quotes with page numbers
- Return structured JSON
 
Format: [{
  "paper_id": "...",
  "main_claim": "...",
  "methodology": "...",
  "limitations": "...",
  "quotes": [{"text": "...", "page": N}]
}]
""")

Параллельное выполнение

Координатор может вызвать несколько Task в одном ответе:

response = {
    "role": "assistant",
    "content": [
        {"type": "tool_use", "name": "Task", "input": {"agent": "search_a", ...}},
        {"type": "tool_use", "name": "Task", "input": {"agent": "search_b", ...}},
        {"type": "tool_use", "name": "Task", "input": {"agent": "search_c", ...}}
    ]
}

Все 3 запускаются параллельно. Результаты возвращаются когда все завершатся. Экономия времени 3× для независимых подзадач.

Структурированный вывод подагентов

Обязательно разделяй контент и метаданные:

{
  "findings": [
    {
      "claim": "Transformer models generate photorealistic images at 2048x2048",
      "evidence_quote": "...",
      "source_url": "https://arxiv.org/abs/...",
      "source_title": "Diffusion Models for Art Generation",
      "publication_date": "2025-03-15",
      "confidence": 0.85
    }
  ],
  "coverage_gaps": ["didn't find data on opera/classical music"],
  "methodological_notes": "focused on English-language papers"
}

Это даёт агенту синтеза:

  • Атрибуцию источников (не теряем при суммаризации)
  • Темпоральные данные (для разрешения противоречий)
  • Уведомления о пробелах (что не покрыли)

Обработка противоречий

Два авторитетных источника дают разную статистику?

Плохо: координатор выбирает одно значение Хорошо: синтезатор аннотирует конфликт

## Adoption rate of AI tools
 
According to McKinsey (2025) — 67% of creative professionals use AI tools weekly.
 
However, Adobe's own survey (2026) — only 42% report weekly use.
 
The discrepancy may be explained by:
- Different definitions of "AI tools" (generative AI specifically vs broader ML)
- Sample composition (McKinsey sampled agencies, Adobe sampled individuals)
- 1-year gap (trend still evolving)

Итеративное уточнение

Координатор не работает "один проход". После начального синтеза:

  1. Оценивает результат
  2. Если обнаруживает пробелы → новый цикл делегирования
  3. Если противоречия → запрашивает дополнительные источники
  4. Только когда уверен → финальный вывод

Распространение ошибок

Подагент получает таймаут. Что он возвращает?

Плохо: "search unavailable"

{"error": "search unavailable"}

Координатор: а что делать? Повторить? Пропустить? Неизвестно.

Хорошо: структурированный контекст

{
  "success": false,
  "error_type": "timeout",
  "partial_results": [
    {"title": "Paper 1", ...}  // 3 статьи до таймаута уже были
  ],
  "attempted_approach": "semantic search with k=20",
  "alternatives": [
    "Try smaller k (k=5)",
    "Try keyword search instead of semantic",
    "Retry with longer timeout"
  ],
  "recommendation": "Continue with partial + try alternative approach"
}

Координатор может:

  • Использовать partial results
  • Попробовать альтернативу
  • Пропустить эту подзадачу с явным указанием в финале

Сохранение происхождения (provenance)

Когда синтезатор пишет финальный отчёт — каждое утверждение должно иметь ссылку на источник.

### Key finding
 
Photorealistic AI image generation has reached 2048x2048 resolution[^1], 
with commercial deployment at Midjourney v6 (released Jan 2026)[^2].
 
[^1]: Zhang et al., "Scaling Diffusion Models", ICML 2025, p. 14.
[^2]: Midjourney release notes, January 2026.

Без provenance отчёт бесполезен для принятия решений.

Аннотации покрытия

Честный отчёт включает:

  • Что хорошо подтверждено
  • Что имеет один источник (слабее)
  • Где не нашли данных

Это отличает академически честный вывод от "генерации уверенным тоном".

Упражнение из экзамена (Упражнение 4)

Задача: построить координатор с делегированием минимум двум подагентам (веб-поиск, анализ документов).

Шаги:

  1. В allowedTools координатора включить "Task"
  2. Каждый подагент возвращает результат непосредственно в промпт координатора
  3. Параллельное выполнение: несколько Task в одном ответе
  4. Структурированный вывод: каждая находка — утверждение + выдержка-доказательство + URL/имя документа + дата публикации
  5. Распространение ошибок: таймаут → структурированный контекст ошибки
  6. Противоречивые данные: синтез сохраняет оба значения с атрибуцией

Практика (30-45 минут)

Спроектируй на бумаге (или реализуй) research-систему для одной из тем:

  • "Состояние AI-инструментов для кодинга в 2026"
  • "Экономика удалённой работы — pros and cons по секторам"
  • "Climate tech — какие решения вышли за research phase"

По каждой:

  1. Декомпозиция (какие 3-4 подтемы? явно покрывают всё поле?)
  2. Scope для каждого подагента (чтобы не дублировали)
  3. Структура вывода (какие поля обязательны?)
  4. Обработка конфликтов (как разрешаешь?)
  5. Purity check: синтез только из подагентов, без галлюцинаций от координатора

Что дальше

Урок 4.5: надёжность. Эскалация, распространение ошибок, multi-pass review — всё про то как делать системы которые не ломаются в проде.