Что не так с «агентом как функцией»
Агент-функция принимает вход и возвращает выход. У него нет собственной цели — есть чужая задача; нет состояния — есть переданный контекст; нет ограничений — есть надежда, что вызывающий не попросит лишнего. Пока агент один, это работает. Как только их десятки и они должны сосуществовать месяцами, отсутствие внутренней структуры становится источником всех проблем сразу.
Сравнение, которое многое объясняет: агент-функция относится к участнику среды примерно как процедура к процессу в операционной системе. Процедура выполняется и исчезает. Процесс имеет память, права, квоты, жизненный цикл и может быть остановлен извне.
Из чего состоит участник
В нашем рантайме участник — это ограниченный локальный мир. Внутри у него набор вещей, каждая из которых существует не ради полноты модели, а потому что без неё ломается конкретный сценарий:
- идентичность и происхождение — кто он и от кого произошёл, если был клонирован или разделён;
- цель — то, ради чего он оценивает предложения других; без собственной цели невозможен отказ;
- способности и потребности — что он умеет и чего ему не хватает; из их пересечения возникают связи;
- состояние, разделённое на классы: приватное, выставленное наружу, долговременное и эфемерное;
- обязательства — то, что он уже пообещал другим и должен учитывать при новых предложениях;
- разрешения и бюджеты — что ему позволено и чем он за это платит;
- инварианты — условия, нарушение которых означает, что участнику нельзя продолжать;
- связи и жизненный цикл — с кем он соединён и в каком он состоянии сейчас.
Граница вместо доступа
Самый частый способ сделать многоагентную систему — дать всем общий контекст. Это удобно ровно до первого инцидента: общий контекст означает, что любой участник может прочитать чужие данные, любой сбой распространяется мгновенно, а стоимость вызова растёт вместе с общим объёмом.
Альтернатива — явная граница. Участник объявляет, что принимает, что производит и что ему нужно. Всё остальное остаётся внутри. Обмен идёт через согласованную часть состояния, а не через общий буфер. Практическое следствие: сбой одного участника не портит остальных, а данные не расползаются по системе просто потому, что «так было проще».
Локальные решения
Участник сам оценивает, с кем ему полезно связаться: сравнивает свои потребности с чужими способностями, учитывает взаимность, близость целей, стоимость общения и свободную ёмкость. Среда может показать ему кандидатов, но не может назначить связь — предложение должны принять обе стороны.
Это выглядит как усложнение по сравнению с планировщиком, который просто раздаёт задачи. Но именно отсюда берётся устойчивость: нет узла, чей отказ останавливает всё, и нет единственной точки, где нужно держать понимание всей системы.
Жизненный цикл: рождение, сон, уход
Участник может клонироваться, разделяться на нескольких, сливаться с другим, засыпать при недостатке работы, попадать в карантин при нарушении инвариантов и уходить в отставку. Всё это — обычные операции среды, а не аварийные сценарии.
- Клон наследует происхождение — по нему потом видно, откуда взялась ветка поведения.
- Сон дешевле удаления: спящий участник не потребляет ресурсы, но его связи и история сохраняются.
- Карантин — способ изолировать проблему, не разрушая систему.
- Отставка освобождает ёмкость: в ограниченной среде это не потеря, а высвобождение.
Что даёт ограниченность
Ограниченный участник ведёт себя предсказуемо в неприятных ситуациях, а это и есть то, за что платят в продакшене:
- Он может отказаться — потому что у него есть собственная цель и заполненные обязательства.
- Он не может потратить больше, чем ему выделено, — бюджет проверяется средой, а не совестью модели.
- Он не утащит чужие данные — их нет за его границей.
- Его можно остановить, усыпить или изолировать, не останавливая остальных.
- По его происхождению и связям восстанавливается история: откуда взялось поведение и с кем оно согласовано.
Чего это стоит
Честная сторона: такая модель дороже в проектировании. Нужно решить, что именно выставляется наружу, какие инварианты обязательны, как считается бюджет и что происходит при его исчерпании. На маленькой задаче это избыточно — там достаточно одного агента с инструментами.
Смысл появляется там, где участников много, они живут долго и должны переживать ошибки друг друга. Тогда ограниченность из накладных расходов превращается в единственный способ сохранить систему управляемой.