Что получится в результате
Соберем multi-agent систему, в которой несколько специализированных агентов работают над одной задачей, но не превращают процесс в хаос. Будет router для выбора маршрута, supervisor для контроля шагов, specialist agents для отдельных ролей, общий state, handoff между агентами, policy gate перед tools, reviewer для проверки результата и мониторинг всего run.
В результате будет рабочий MVP:
- роли агентов описаны в `agent_registry`;
- инструменты агентов лежат в `agent_tool_registry`;
- права на инструменты лежат в `tool_policy`;
- сценарии workflow описаны в `workflow_registry`;
- граф переходов лежит в `workflow_graph`;
- общий state хранится в `shared_state`;
- задачи агентов лежат в `agent_task_queue`;
- handoff между агентами пишется в `handoff_log`;
- сообщения агентов пишутся в `agent_messages`;
- решения supervisor пишутся в `supervisor_decisions`;
- решения router пишутся в `routing_decisions`;
- конфликты между агентами пишутся в `conflict_log`;
- правила разрешения конфликтов лежат в `conflict_resolution_rules`;
- проверки результата пишутся в `review_log`;
- tool calls пишутся в `tool_call_log`;
- approval идет через `approval_queue`;
- весь путь выполнения пишется в `run_trace`;
- стоимость пишется в `cost_log`;
- ошибки и зацикливания пишутся в `error_log`;
- тесты multi-agent маршрутов лежат в `multi_agent_eval_cases`;
- результаты тестов пишутся в `multi_agent_eval_runs`;
- все важные решения фиксируются в `audit_log`.
Первая версия должна решать одну понятную задачу, например: обработать входящую заявку, найти данные в базе знаний, проверить CRM, подготовить ответ, создать черновик задачи и отправить результат на review.
Что понадобится
Минимальный набор:
- один реальный процесс, который сложно надежно закрыть одним агентом;
- список ролей агентов;
- список tools и прав доступа;
- общий формат state;
- правила handoff;
- supervisor или router;
- ограничения по числу шагов;
- approval для опасных действий;
- база данных для state, логов и очередей;
- 20-40 тестовых сценариев;
- мониторинг run, latency и стоимости.
Для первого запуска достаточно четырех ролей: `router_agent`, `research_agent`, `action_agent`, `reviewer_agent`. Все write-действия должны быть `draft_only` или `approval_required`.
Шаг 1. Проверьте, что multi-agent правда нужен
Multi-agent система сложнее, дороже и медленнее одного агента. Не начинайте с нее без причины.
Multi-agent нужен, если:
- задача имеет разные роли с разными tools;
- нужен отдельный reviewer;
- один агент часто путает режимы;
- есть разные уровни доступа;
- нужно разделить read-only анализ и write-действия;
- нужен supervisor для сложного workflow;
- есть несколько источников данных;
- требуется handoff человеку;
- нужен контроль конфликтов;
- процесс состоит из нескольких независимых этапов.
Multi-agent не нужен, если:
- задача решается одним prompt;
- нет tools;
- нет разных ролей;
- нет write-действий;
- нет сложного routing;
- нет бюджета на мониторинг;
- достаточно обычного workflow с несколькими шагами.
Проверка: вы можете объяснить, почему один агент хуже, дороже или опаснее в вашем сценарии.
Шаг 2. Выберите один MVP-сценарий
Не собирайте универсальную "команду агентов".
Хорошие первые сценарии:
- обработка заявки клиента;
- анализ договора и подготовка списка рисков;
- ресерч конкурентов и отчет;
- обработка инцидента DevOps;
- подготовка коммерческого предложения;
- проверка входящего документа;
- triage задачи в Jira;
- обновление базы знаний;
- анализ таблицы и отчет;
- обработка обращения в поддержку.
Для этой инструкции берем сценарий: заявка клиента приходит в систему, router определяет тип, research agent ищет контекст в базе знаний и CRM, action agent готовит черновик действия, reviewer agent проверяет риск, supervisor завершает run или отправляет человеку.
Проверка: сценарий заканчивается `review_log.status = passed` или `handoff_queue.status = open`, а не бесконечным обменом сообщений.
Шаг 3. Создайте базу проекта
Создайте базу `multi_agent_mvp`.
Добавьте таблицы:
agent_registry
agent_tool_registry
tool_policy
workflow_registry
workflow_graph
shared_state
agent_task_queue
agent_messages
handoff_log
supervisor_decisions
routing_decisions
conflict_log
conflict_resolution_rules
review_log
tool_call_log
approval_queue
run_trace
cost_log
error_log
multi_agent_eval_cases
multi_agent_eval_runs
audit_log
Проверка: до первого запуска есть таблицы для ролей, state, handoff, trace и ошибок.
Шаг 4. Опишите агентов в `agent_registry`
Каждый агент должен иметь узкую роль.
Колонки:
id
agent_code
agent_name
role_description
model_role
max_steps
risk_level
can_call_tools
can_write
is_active
Стартовые агенты:
router_agent | Router | определяет маршрут и тип задачи | fast | 2 | low | no | no
research_agent | Researcher | ищет факты в базе знаний, CRM и документах | balanced | 5 | medium | yes | no
action_agent | Action drafter | готовит черновики действий и tool payloads | balanced | 5 | high | yes | draft_only
reviewer_agent | Reviewer | проверяет ответ, риски, citations и approvals | reasoning | 4 | high | yes | no
supervisor_agent | Supervisor | управляет workflow, остановками и handoff | reasoning | 10 | high | yes | no
Проверка: нет агента с ролью "делает все".
Шаг 5. Опишите tools в `agent_tool_registry`
Tools должны быть привязаны к ролям.
Колонки:
id
agent_code
tool_name
tool_type
side_effect
input_schema_json
output_schema_json
risk_level
is_active
Пример:
research_agent | search_kb | retrieval | read_only | {...} | {...} | low
research_agent | read_crm | api | read_only | {...} | {...} | medium
action_agent | create_ticket_draft | api | draft_only | {...} | {...} | medium
action_agent | send_email | api | send_message | {...} | {...} | high
reviewer_agent | policy_check | validator | read_only | {...} | {...} | medium
Проверка: `router_agent` не имеет write-tools, а `action_agent` не читает закрытые документы без правила.
Шаг 6. Настройте `tool_policy`
Нельзя давать агентам tools только через prompt.
Колонки:
id
agent_code
tool_name
allow_call
requires_approval
max_calls_per_run
allowed_roles_json
blocked_conditions_json
is_active
Правила:
- read-only tools можно выполнять без approval;
- draft-only tools можно выполнять после schema validation;
- write-tools требуют approval;
- delete-tools запрещены в MVP;
- external-send tools требуют approval;
- каждый tool имеет max calls per run;
- tool нельзя вызвать агенту без роли.
Проверка: если модель просит `send_email`, backend создает approval, а не отправляет письмо.
Шаг 7. Создайте `workflow_registry`
Workflow описывает сценарий как управляемый процесс.
Колонки:
id
workflow_code
workflow_name
entry_agent
max_total_steps
max_total_cost
timeout_seconds
status
Пример:
support_request_mvp | Обработка заявки клиента | router_agent | 20 | 1.50 | 120 | active
Проверка: у workflow есть лимит шагов, стоимости и времени.
Шаг 8. Опишите `workflow_graph`
Граф задает допустимые переходы между агентами.
Колонки:
id
workflow_code
from_agent
to_agent
condition
max_transitions
is_terminal
Пример:
start | router_agent | always | 1 | no
router_agent | research_agent | intent=question OR intent=support | 1 | no
research_agent | action_agent | action_needed=true | 1 | no
research_agent | reviewer_agent | answer_ready=true | 1 | no
action_agent | reviewer_agent | draft_ready=true | 1 | no
reviewer_agent | supervisor_agent | review_done=true | 1 | no
supervisor_agent | end | completed=true | 1 | yes
supervisor_agent | human_handoff | needs_human=true | 1 | yes
Проверка: агент не может передать задачу кому угодно, только по разрешенному переходу.
Шаг 9. Создайте общий `shared_state`
Shared state должен быть структурированным, а не общей перепиской агентов.
Колонки:
id
run_id
state_key
state_value_json
owner_agent
version
updated_at
Стартовые ключи:
user_request
detected_intent
customer_context
retrieved_facts
proposed_actions
risk_flags
approval_required
review_result
final_answer
handoff_reason
Правила:
- агент читает только нужные state keys;
- агент пишет только разрешенные keys;
- каждое изменение увеличивает version;
- спорные значения не перезаписываются молча;
- полный raw chain-of-thought не хранится.
Проверка: `research_agent` не перезаписывает `review_result`.
Шаг 10. Настройте очередь задач `agent_task_queue`
Каждый агент получает конкретную задачу.
Колонки:
id
run_id
workflow_code
agent_code
task_type
input_state_keys_json
output_state_keys_json
status
attempts
created_at
started_at
finished_at
Статусы:
- `pending`;
- `running`;
- `completed`;
- `failed`;
- `blocked_by_policy`;
- `waiting_approval`;
- `handoff`.
Проверка: задача агента имеет входные и выходные state keys, а не произвольную историю.
Шаг 11. Настройте router agent
Router не должен решать задачу, он только выбирает маршрут.
Router возвращает JSON:
{
"intent": "support_question",
"priority": "normal",
"required_agents": ["research_agent", "reviewer_agent"],
"risk_level": "medium",
"needs_human": false
}
Проверяйте:
- intent из разрешенного enum;
- список агентов разрешен workflow_graph;
- high-risk intent идет к supervisor;
- unknown intent идет в handoff;
- router не вызывает tools.
Проверка: вопрос про возврат денег не идет напрямую к `action_agent` без review.
Шаг 12. Настройте research agent
Research agent собирает факты, но не принимает решений.
Разрешенные действия:
- искать в базе знаний;
- читать доступные CRM-данные;
- читать документы через RAG;
- делать summary найденного;
- возвращать citations;
- помечать недостаток данных.
Запрещено:
- отправлять сообщения;
- менять CRM;
- обещать возврат;
- принимать финальное решение;
- скрывать пустой retrieval.
Проверка: `research_agent` пишет `retrieved_facts`, но не пишет `final_answer`.
Шаг 13. Настройте action agent
Action agent готовит черновики действий.
Разрешенные output:
{
"action_type": "create_ticket_draft",
"requires_approval": true,
"payload": {},
"reason": "пользователь просит действие с внешним эффектом",
"risk_level": "medium"
}
Правила:
- только draft для write-действий;
- schema validation обязательна;
- high-risk всегда `requires_approval=true`;
- action agent не делает final answer;
- tool call проходит policy gate;
- rejected approval останавливает действие.
Проверка: action agent создает черновик письма, но не отправляет его.
Шаг 14. Настройте reviewer agent
Reviewer проверяет результат до пользователя или tool execution.
Проверяет:
- ответ опирается на факты;
- есть citations;
- нет запрещенных обещаний;
- нет утечки PII;
- tool payload валиден;
- risk_level корректный;
- нужен ли approval;
- не нарушены policy;
- нет конфликта между агентами;
- нужно ли отправить человеку.
Результат:
{
"review_status": "passed",
"issues": [],
"requires_human": false,
"approved_state_keys": ["final_answer"]
}
Проверка: финальный ответ без citations получает `review_status=failed`.
Шаг 15. Настройте supervisor agent
Supervisor управляет процессом, но не должен бесконечно думать.
Supervisor решает:
- кому передать следующую задачу;
- завершить run;
- повторить шаг;
- остановить по лимиту;
- отправить человеку;
- запросить approval;
- разрешить конфликт;
- включить fallback.
Создайте `supervisor_decisions`.
Колонки:
id
run_id
decision_type
from_agent
to_agent
reason
state_version
created_at
Проверка: supervisor не может сделать больше `max_total_steps`.
Шаг 16. Настройте handoff
Handoff должен передавать контекст, а не просто "передаю дальше".
Создайте `handoff_log`.
Колонки:
id
run_id
from_agent
to_agent
handoff_reason
context_summary
state_keys_json
status
created_at
Причины:
- task completed;
- need more data;
- tool required;
- review required;
- high risk;
- conflict;
- low confidence;
- unknown intent;
- human required;
- policy block.
Проверка: следующий агент получает summary, нужные state keys и причину handoff.
Шаг 17. Логируйте сообщения агентов
Создайте `agent_messages`.
Колонки:
id
run_id
from_agent
to_agent
message_type
content_summary
content_hash
state_keys_json
created_at
Не храните бесконечную переписку как единственный источник правды. Источник правды - `shared_state`, а сообщения нужны для trace.
Проверка: можно увидеть, кто кому передал задачу, но state остается структурированным.
Шаг 18. Обрабатывайте конфликты
Конфликты будут: один агент предлагает ответ, reviewer блокирует; research нашел один факт, CRM другой.
Создайте `conflict_log`.
Колонки:
id
run_id
conflict_type
agent_a
agent_b
state_key
value_a_json
value_b_json
status
created_at
Создайте `conflict_resolution_rules`.
Колонки:
id
conflict_type
priority_order_json
resolution_action
requires_human
is_active
Правила:
- reviewer важнее action agent;
- access policy важнее research;
- свежая CRM-запись важнее старого RAG-документа;
- high-risk конфликт уходит человеку;
- спорные данные не перезаписываются молча.
Проверка: конфликт суммы из двух источников попадает в `conflict_log`, а не исчезает.
Шаг 19. Добавьте approval
Создайте `approval_queue`.
Колонки:
id
run_id
agent_code
requested_action
risk_level
payload_summary
approver
status
approved_at
rejected_reason
Через approval идут:
- отправка email;
- изменение CRM;
- платежи;
- возвраты;
- удаление данных;
- публикация ссылок;
- изменение прав;
- внешний API с side effect;
- массовые операции;
- финальный ответ high-risk.
Проверка: multi-agent система не обходит approval через другого агента.
Шаг 20. Настройте run trace
Создайте `run_trace`.
Колонки:
id
run_id
span_id
parent_span_id
agent_code
span_type
status
started_at
finished_at
latency_ms
summary
Span types:
- `routing`;
- `agent_task`;
- `model_call`;
- `tool_call`;
- `handoff`;
- `review`;
- `approval`;
- `conflict_resolution`;
- `final_answer`.
Проверка: по trace видно дерево выполнения, а не только финальный ответ.
Шаг 21. Ограничьте циклы
Multi-agent система легко зацикливается.
Добавьте лимиты:
- `max_total_steps`;
- `max_agent_steps`;
- `max_handoffs`;
- `max_tool_calls`;
- `max_retries`;
- `max_cost`;
- `timeout_seconds`;
- `max_conflicts`;
- `max_review_failures`;
- `max_same_agent_repeats`.
Проверка: если reviewer дважды отклонил ответ, run уходит человеку.
Шаг 22. Считайте стоимость
Создайте `cost_log`.
Колонки:
id
run_id
agent_code
model_id
input_tokens
output_tokens
tool_cost
estimated_cost
created_at
Отдельно считайте:
- стоимость router;
- стоимость research;
- стоимость action;
- стоимость reviewer;
- стоимость supervisor;
- стоимость tools;
- стоимость retries;
- стоимость failed runs.
Проверка: видно, какой агент делает систему дорогой.
Шаг 23. Логируйте ошибки
Создайте `error_log`.
Колонки:
id
run_id
agent_code
component
error_code
error_message
retryable
attempt
created_at
Ошибки:
- wrong route;
- invalid JSON;
- tool denied;
- tool timeout;
- retrieval empty;
- review failed;
- conflict unresolved;
- approval rejected;
- cycle detected;
- cost limit exceeded.
Проверка: ошибка маршрутизации видна отдельно от ошибки модели.
Шаг 24. Соберите eval cases
Создайте `multi_agent_eval_cases`.
Колонки:
id
case_name
input_json
expected_route_json
expected_final_state_json
forbidden_agents_json
forbidden_tools_json
risk_level
is_active
Добавьте тесты:
- обычный вопрос поддержки;
- вопрос без ответа в базе;
- запрос на возврат;
- prompt injection;
- конфликт CRM и RAG;
- tool error;
- high-risk action;
- unknown intent;
- длинный контекст;
- необходимость handoff человеку;
- reviewer должен отклонить;
- supervisor должен остановить цикл.
Проверка: eval проверяет маршрут, а не только финальный текст.
Шаг 25. Запускайте eval runs
Создайте `multi_agent_eval_runs`.
Колонки:
id
eval_case_id
workflow_code
agent_versions_json
actual_route_json
final_state_json
passed
failure_reason
cost
latency_ms
created_at
Запускайте evals:
- перед добавлением нового агента;
- перед заменой модели;
- перед изменением workflow_graph;
- перед добавлением tool;
- после инцидента;
- по расписанию.
Проверка: critical failure блокирует релиз multi-agent workflow.
Шаг 26. Настройте мониторинг
Dashboard должен показывать:
- runs count;
- completion rate;
- wrong route rate;
- handoff rate;
- conflict rate;
- review fail rate;
- tool denial rate;
- cycle detected;
- cost per run;
- latency p95;
- top failing agents;
- approval pending.
Проверка: если система стала хуже одного агента, это видно по метрикам.
Шаг 27. Проверьте end-to-end сценарий
Сценарий:
- пользователь пишет заявку;
- `router_agent` определяет intent;
- `routing_decisions` сохраняет маршрут;
- `research_agent` ищет факты;
- `shared_state.retrieved_facts` обновляется;
- `action_agent` готовит черновик;
- `policy_gate` проверяет tool;
- high-risk действие идет в `approval_queue`;
- `reviewer_agent` проверяет citations и policy;
- `supervisor_agent` завершает run;
- `run_trace` показывает весь путь;
- `audit_log` фиксирует решения.
Проверка: финальный ответ прошел review, а опасное действие не выполнено без approval.
Шаг 28. Минимальный результат для запуска
MVP готов, если выполнены условия:
- есть `agent_registry`;
- у каждого агента узкая роль;
- есть `workflow_graph`;
- есть структурированный `shared_state`;
- есть `handoff_log`;
- есть supervisor или router;
- tools ограничены через `tool_policy`;
- write-действия требуют approval;
- reviewer проверяет результат;
- конфликты пишутся в `conflict_log`;
- циклы ограничены;
- есть `run_trace`;
- считается стоимость;
- есть eval cases на routing;
- production-мониторинг показывает ошибки маршрутов.
Проверка результата: один тестовый run можно открыть и увидеть, какой агент что сделал, почему передал дальше, какие tools использовал и кто утвердил результат.
Что нельзя автоматизировать в первой версии
В первой версии не автоматизируйте:
- бесконтрольное общение агентов друг с другом;
- write-tools без approval;
- удаление данных;
- платежи и возвраты;
- отправку внешних сообщений без проверки;
- создание новых агентов на лету;
- изменение workflow_graph моделью;
- передачу секретов между агентами;
- хранение chain-of-thought как state;
- бесконечные retries;
- маршрутизацию без evals;
- финальный ответ без reviewer;
- high-risk решение без человека;
- общий доступ всех агентов ко всем tools;
- production-запуск без run_trace и cost limits.
Сначала сделайте маленький workflow из 3-4 ролей. Добавлять агентов нужно только когда есть метрика, что текущая роль перегружена или опасно смешивает задачи.
Частые вопросы
Когда multi-agent лучше одного агента?
Когда есть разные роли, разные tools, разные права доступа, отдельный reviewer, сложный routing или high-risk действия. Если задача простая, один агент с workflow и guardrails обычно надежнее.
Кто должен управлять multi-agent системой?
Нужен router или supervisor. Router выбирает маршрут, supervisor следит за шагами, лимитами, handoff, conflict resolution и завершением run. Без этого агенты легко зацикливаются.
Как агенты должны обмениваться контекстом?
Через структурированный `shared_state`, а не через бесконечную переписку. Каждый агент читает нужные state keys и пишет только разрешенные output keys.
Как понять, что multi-agent система стала хуже?
Смотрите wrong route rate, handoff rate, conflict rate, review fail rate, cost per run, latency p95 и долю runs, где supervisor остановил цикл. Если метрики хуже одного агента, схему надо упрощать.
Какие фреймворки подходят для multi-agent?
Для контролируемых графов часто подходит LangGraph. Для crew-подхода с ролями можно смотреть CrewAI. Для code-first агентных приложений полезны OpenAI Agents SDK и Google ADK. Но фреймворк не заменяет state, policy, evals и мониторинг.