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 подтемы:
- AI в цифровом арт-создании
- AI в графическом дизайне
- AI в фотографии
Каждый подагент работает отлично. Но итоговый отчёт покрывает только визуальные искусства, полностью пропускает музыку, литературу, кинопроизводство.
Корневая причина: декомпозиция слишком узкая. Подагенты сделали корректно что им поручили — проблема в координаторе.
Лечение
Координатор должен:
- Мапить широкое поле перед декомпозицией
- Явно покрывать все секторы: "творческие индустрии включают visual art, music, literature, film, performing arts, design"
- Рефлексировать: "покрыл ли я все области? каких нет?"
- Итеративно уточнять: если обнаружил пробел — делегируй новый подагент
Распределение с минимизацией дублирования
# Плохо — оба агента могут найти одно и то же
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)Итеративное уточнение
Координатор не работает "один проход". После начального синтеза:
- Оценивает результат
- Если обнаруживает пробелы → новый цикл делегирования
- Если противоречия → запрашивает дополнительные источники
- Только когда уверен → финальный вывод
Распространение ошибок
Подагент получает таймаут. Что он возвращает?
Плохо: "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)
Задача: построить координатор с делегированием минимум двум подагентам (веб-поиск, анализ документов).
Шаги:
- В
allowedToolsкоординатора включить"Task" - Каждый подагент возвращает результат непосредственно в промпт координатора
- Параллельное выполнение: несколько Task в одном ответе
- Структурированный вывод: каждая находка — утверждение + выдержка-доказательство + URL/имя документа + дата публикации
- Распространение ошибок: таймаут → структурированный контекст ошибки
- Противоречивые данные: синтез сохраняет оба значения с атрибуцией
Практика (30-45 минут)
Спроектируй на бумаге (или реализуй) research-систему для одной из тем:
- "Состояние AI-инструментов для кодинга в 2026"
- "Экономика удалённой работы — pros and cons по секторам"
- "Climate tech — какие решения вышли за research phase"
По каждой:
- Декомпозиция (какие 3-4 подтемы? явно покрывают всё поле?)
- Scope для каждого подагента (чтобы не дублировали)
- Структура вывода (какие поля обязательны?)
- Обработка конфликтов (как разрешаешь?)
- Purity check: синтез только из подагентов, без галлюцинаций от координатора
Что дальше
Урок 4.5: надёжность. Эскалация, распространение ошибок, multi-pass review — всё про то как делать системы которые не ломаются в проде.