Передача задач: маршрутизация между агентами

Сердце оркестратора — маршрутизатор: он смотрит на задачу и решает, какому специалисту её передать. Реализуем его в коде.

Маршрутизатор (router) — компонент, который по содержанию запроса выбирает подходящего агента-специалиста и передаёт ему задачу.

Задача маршрутизации

Пользователь приходит с разными запросами: где-то нужен счёт, где-то текст, где-то поддержка. Один агент на всё — перегружен (урок 5.1). Решение: на входе стоит маршрутизатор, который определяет тип запроса и направляет его нужному специалисту.

В реальной системе маршрутизатор — это часто отдельный вызов LLM («к какому из агентов отнести запрос?»). Для наглядности возьмём детерминированную версию: выбор по ключевому признаку.

Запускаемый роутер

# агенты-специалисты (заглушки)
def math_agent(task):
    expr = task.split(":", 1)[1].strip()
    return f"[Математик] {eval(expr)}"

def writer_agent(task):
    topic = task.split(":", 1)[1].strip()
    return f"[Писатель] текст про: {topic}"

def support_agent(task):
    issue = task.split(":", 1)[1].strip()
    return f"[Поддержка] разберусь с проблемой: {issue}"

# маршрутизатор: по префиксу выбирает специалиста
def route(task):
    if task.startswith("math:"):
        return math_agent(task)
    if task.startswith("write:"):
        return writer_agent(task)
    if task.startswith("help:"):
        return support_agent(task)
    return "[Роутер] не знаю, кому передать"

tasks = [
    "math: 6 * 7",
    "write: про осень",
    "help: не работает кнопка",
    "xyz: непонятно",
]
for t in tasks:
    print(route(t))

Вывод:

[Математик] 42
[Писатель] текст про: про осень
[Поддержка] разберусь с проблемой: не работает кнопка
[Роутер] не знаю, кому передать

Роутер направил каждый запрос своему специалисту, а нераспознанный — в ветку «не знаю». Это и есть скелет оркестратора: распознать тип → выбрать агента → передать.

Стратегии маршрутизации

СпособКак решаетПлюс/минус
По правиламключевые слова, префиксыбыстро и дёшево, но негибко
Через LLMмодель классифицирует запросгибко, но дороже и медленнее
Гибридправила + LLM для спорныхбаланс цены и гибкости

Что делать с «не знаю»

Важный случай — запрос, не подходящий ни одному агенту. Хороший роутер не молчит и не угадывает наугад: он либо отправляет к агенту «общего назначения», либо честно сообщает, что не может обработать, либо просит уточнить. Тихое неверное направление — частый источник ошибок в мультиагентных системах.

Передача контекста

Маршрутизатор передаёт специалисту не только задачу, но и нужный контекст: что уже известно, какой результат ожидается. Если контекст потерять, специалист начнёт «с чистого листа» и может продублировать работу. Поэтому вместе с задачей передают и относящуюся к ней часть памяти.

Итог

  • Маршрутизатор по типу запроса выбирает специалиста — это скелет оркестратора.
  • Маршрутизация бывает по правилам, через LLM или гибридной; у каждой свой баланс цены и гибкости.
  • Нераспознанный запрос нельзя «тихо» направить наугад; вместе с задачей передают и нужный контекст.
Проверьте себя
1. Что делает маршрутизатор (router) в мультиагентной системе?
AВыполняет все задачи сам
BПо содержанию запроса выбирает подходящего агента-специалиста и передаёт ему задачу
CХранит долгосрочную память
DСчитает стоимость вызовов
2. Чем маршрутизация через LLM отличается от маршрутизации по правилам?
ALLM-маршрутизация всегда точнее и бесплатна
BЧерез LLM гибче (модель классифицирует запрос), но дороже и медленнее, чем правила по ключевым словам
CПравила работают только с числами
DРазличий нет
3. Как хорошему роутеру стоит поступать с нераспознанным запросом?
AТихо отправить первому попавшемуся агенту
BНаправить к агенту общего назначения, честно сообщить о невозможности или попросить уточнить
CЗавершить работу системы
DВыполнить запрос самому
Поддержать проект