В какой-то момент каждая мультиагентная система перерастает простой маршрутизатор. Первый признак — когда агент-специалист должен задать уточняющий вопрос или в середине хода понимает, что должен продолжить другой агент. Фиксированный пайплайн ломается в этот момент. Одноразовый маршрутизатор ломается в этот момент.
Именно для этой проблемы разработан шаблон оркестрации Handoff в Microsoft Agent Framework.
Как Работает Handoff
Разработчик объявляет граф: вот агенты, вот рёбра между ними. Фреймворк делает всё остальное — синтезирует инструмент handoff на каждое исходящее ребро и внедряет его в каждого агента. Когда агент решает передать управление, он вызывает инструмент. Фреймворк обеспечивает соблюдение топологии.
Три вещи делают это отличным от простого вызова агентами друг друга:
- Единый транскрипт — принимающий агент видит полную историю разговора. Без начала с нуля.
- Соблюдение топологии — агент может передавать управление только объявленным целям. Ошибки маршрутизации обнаруживаются при создании, не в продакшене.
- Естественное завершение — когда активный агент заканчивает свой ход без вызова инструмента handoff, рабочий процесс уступает пользователю. Без опроса, без явных условий выхода.
Минимальный Пример
В .NET создание рабочего процесса handoff выглядит так:
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
AIAgent triage = chatClient.AsAIAgent(
instructions: "Route to the right specialist.",
name: "Triage");
AIAgent billing = chatClient.AsAIAgent(
instructions: "Handle billing questions.",
name: "Billing");
AIAgent tech = chatClient.AsAIAgent(
instructions: "Handle technical support.",
name: "Tech");
var workflow = HandoffWorkflow.Create()
.Add(triage, targets: [billing, tech])
.Add(billing, targets: [triage])
.Add(tech, targets: [triage, billing]);
Triage может отправлять к любому специалисту. Оба специалиста могут отправлять обратно к triage. Граф поддерживает ацикличность, но допускает обратные рёбра когда нужно (“нужно больше информации” → обратно к исследованию).
Когда Использовать Handoff (и Когда Не Стоит)
Handoff хорошо подходит когда:
- Владение может меняться в середине разговора — агент может понять, что он не тот специалист
- Обратные рёбра важны — может понадобиться вернуться к более раннему шагу без перезапуска
- Решения о маршрутизации размыты — решение о передаче управления контекстуально и лучше принимается моделью, чем типизированными предикатами
Это не правильный выбор когда:
- Ваш пайплайн фиксированный и последовательный — используйте
Sequential-рабочий процесс - Каждый шаг независим — агенты, разделяющие транскрипт, где только один из них нуждался в нём — просто шум
- Нужны строгие гарантии обработки — недетерминизм маршрутизации на основе модели — не то, что вам нужно
Обратные Рёбра и Human-in-the-Loop
Одна из интересных форм, которые Handoff позволяет — настоящие обратные рёбра. Агент может решить “у меня недостаточно информации” и вернуться к шагу исследования — не с жёстко закодированным циклом, а потому что модель решает, что это правильный ход.
Взаимодействия human-in-the-loop также естественно компонуются. Когда специалисту нужен ввод пользователя, рабочий процесс уступает пользователю через стандартный цикл хода, собирает ответ и возобновляется с полным контекстом. Агент никогда не потерял разговор.
Заключение
Handoff — один из тех шаблонов, который звучит просто, но позволяет много, как только вы его усвоите: децентрализованная маршрутизация, общий контекст, обеспечиваемая топология, естественное завершение. Это правильный следующий шаг, когда ваши агенты начинают говорить “на самом деле, это должен обработать кто-то другой.”
Прочитайте полное руководство в оригинальном посте: A Tour of the Handoff Orchestration Pattern
