В двух работах — методическом разборе Anthropic «Building effective agents» и статье Generative Agents (arXiv 2304.03442) — описано, как устроены агентные системы и чем они отличаются от простых ассистентов. Anthropic разбирает набор паттернов и даёт рекомендации по их применению, Generative Agents показывает симуляцию из двадцати пяти агентов, ведущих себя как жители небольшого городка.
Ниже — что именно изменилось в подходе к построению таких систем, откуда взялись паттерны и что они меняют для разработчика.
Базовый блок и паттерны workflow
Отправная точка — augmented LLM: augmented LLMязыковая модель, дополненная retrieval, инструментами и памятью, которыми она распоряжается сама. Модель генерирует собственные поисковые запросы, выбирает инструменты и решает, какую информацию сохранять.
Поверх этого блока Anthropic выделяет два класса систем. workflowсистема, где LLM и инструменты оркеструются через заранее заданные пути кода следует фиксированной структуре. agentсистема, где LLM динамически управляет собственными процессами и использованием инструментов сам решает, как выполнять задачу.
Workflow-паттернов четыре:
- prompt chaining — задача разбивается на последовательность шагов, каждый вызов LLM обрабатывает вывод предыдущего; так задачу можно разложить на обозримые этапы и на промежуточных шагах ставить программные проверки, чтобы процесс не сбился;
- routing — вход классифицируется и направляется в специализированную последующую задачу;
- parallelization — в двух вариантах: секционирование (независимые подзадачи параллельно) и голосование (одна задача запускается многократно ради разных выводов);
- orchestrator-workers — центральная LLM динамически разбивает задачи, делегирует их рабочим LLM и синтезирует результаты.
Ключевое отличие агентов от workflow: workflow следуют заранее заданной структуре, а агенты применяются для открытых задач, где число шагов трудно или невозможно предсказать и нельзя жёстко задать фиксированный путь.
Как работает orchestrator-workers
Центральная LLM динамически разбивает задачу, делегирует подзадачи рабочим LLM и синтезирует их результаты. Подзадачи не предопределены заранее — их определяет оркестратор на основе конкретного входного запроса, и именно это отличает паттерн от параллелизации.
Подход подходит для сложных задач, где нельзя предсказать необходимые подзадачи: например, при внесении сложных изменений сразу в несколько файлов или при поиске и анализе информации из множества источников.
Как работает routing
Routing классифицирует вход и направляет его к специализированной последующей задаче. Это позволяет разделять ответственность и строить более узкие промпты. Без такого разделения оптимизация под один тип входа ухудшает производительность на других.
Паттерн работает там, где есть чёткие категории, которые лучше обрабатывать отдельно, и где классификацию можно выполнить точно — силами LLM или более традиционной модели классификации. Примеры: разные типы обращений в поддержку (общие вопросы, возвраты, техподдержка) уходят в разные нижестоящие процессы и инструменты; простые и частые вопросы направляются к меньшим и более дешёвым моделям, а сложные и необычные — к более способным.
Что показала симуляция Generative Agents
Generative Agents — это вычислительные программные агенты, имитирующие правдоподобное человеческое поведение. В работе описана симуляция небольшого городка из двадцати пяти агентов в интерактивной песочнице, вдохновлённой The Sims, где конечные пользователи взаимодействуют с агентами на естественном языке.
Агенты просыпаются, готовят завтрак, идут на работу, формируют мнения, замечают друг друга и начинают разговоры. Архитектура расширяет большую языковую модель, чтобы хранить полную запись опыта агента на естественном языке, со временем синтезировать воспоминания в рефлексии более высокого уровня и динамически извлекать их для планирования поведения.
В оценке агенты демонстрируют правдоподобное индивидуальное и эмерджентное социальное поведение. Из единственного заданного пользователем намерения одного агента устроить вечеринку на День святого Валентина агенты за следующие два дня автономно распространяют приглашения, заводят новые знакомства, приглашают друг друга на свидания и согласованно приходят на вечеринку вовремя. Чтобы проверить вклад отдельных частей архитектуры, авторы поочерёдно отключали их и сравнивали результат: абляцияметод оценки, при котором по очереди отключают отдельные компоненты системы и смотрят, как это меняет её поведение. Она показывает, что наблюдение, планирование и рефлексия — каждый из компонентов — критически влияют на правдоподобность поведения.
Память, рефлексия и планирование
Согласованность поведения во времени держится на трёх механизмах. Память хранит полную запись опыта агента на естественном языке. Со временем воспоминания синтезируются в рефлексии более высокого уровняобобщения, которые агент выводит из накопленных воспоминаний, а не просто хранит их по отдельности. Для планирования поведения они извлекаются динамически. Агенты помнят и размышляют о прошедших днях, планируя следующий.
Предыстория: что было до агентных паттернов
До агентных паттернов применялись workflow — системы с заранее заданными путями кода — и отдельные оптимизированные вызовы LLM с retrieval и примерами в контексте. Workflow дают предсказуемость и согласованность для хорошо определённых задач, но не дают гибкости и принятия решений моделью, которые нужны в масштабе.
Фреймворки для агентных систем упрощают низкоуровневые задачи, но создают лишние слои абстракции: они могут скрывать промпты и ответы, затрудняя отладку, и провоцируют добавлять сложность там, где достаточно более простой конфигурации. Поэтому рекомендация — начинать с прямого использования LLM API, поскольку многие паттерны реализуются в несколько строк кода.
Среди более ранних работ упоминаются две. AutoGen (arXiv 2308.08155) — открытый фреймворк для построения LLM-приложений через нескольких агентов, которые общаются друг с другом для выполнения задач; агенты настраиваемы, способны вести беседу и работать в режимах, комбинирующих LLM, человеческий ввод и инструменты. Generative Agents (arXiv 2304.03442) — работа о программных агентах, симулирующих правдоподобное человеческое поведение.
Почему это сделали
Авторы «Building effective agents» описывают конкретную проблему: наиболее успешные реализации используют простые, компонуемые паттерны, а не сложные фреймворки. Фреймворки скрывают промпты и ответы, затрудняя отладку, и подталкивают к лишней сложности. Отдельно названа распространённая ошибка клиентов — неверные предположения о том, как фреймворк устроен внутри. Отсюда совет: начинать с прямого использования LLM API, а если применяется фреймворк — понимать лежащий в его основе код.
В Generative Agents мотивация другая: правдоподобные прокси человеческого поведения нужны для интерактивных приложений — сред погружения, пространств для репетиции межличностной коммуникации и инструментов прототипирования. Агенты не просто отвечают, а ведут повседневную деятельность, что и требует моделирования множества персонажей, а не одного ассистента.
Что это меняет на практике
При переходе от одиночного ассистента к оркестрации множества агентов разработчику нужны новые навыки.
Оркестрация — это умение строить систему, где центральная LLM динамически разбивает задачу, делегирует её рабочим LLM и синтезирует результаты. Цикл «генератор-оценщик» требует организации обратной связи между двумя вызовами LLM; он эффективен при ясных критериях оценки и когда итеративное уточнение даёт измеримую пользу. Для параллельной работы нужно уметь разделять задачу на независимые подзадачи и запускать одну задачу многократно ради разных результатов — например, для проверки кода на уязвимости несколькими промптами или оценки неуместности контента с разными порогами голосования.
Отдельный навык — проектирование инструментов и их документации с той же тщательностью, что и промптов: агенты обычно представляют собой LLM, использующие инструменты на основе обратной связи из среды в цикле, и им нужна ground truthсведения о фактическом состоянии среды, получаемые агентом на каждом шаге, например результаты вызовов инструментов или исполнения кода на каждом шаге.
В приложении о prompt engineering для инструментов авторы отмечают, что одно и то же действие можно задать разными способами, и некоторые форматы модели писать существенно труднее. Написание diff требует знать, сколько строк меняется в заголовке чанка, ещё до написания нового кода; код внутри JSON требует дополнительного экранирования переводов строк и кавычек. Рекомендации: давать модели достаточно токенов, чтобы «подумать», прежде чем она загонит себя в угол; держать формат близким к тому, что модель естественно видела в текстах интернета; избегать форматных накладных расходов вроде точного подсчёта тысяч строк кода или экранирования строк. Авторы предлагают вкладывать в agent-computer interfaceинтерфейсы, через которые агент взаимодействует с компьютером и инструментами, — по аналогии с человеко-компьютерными интерфейсами столько же усилий, сколько уходит на человеко-компьютерные интерфейсы.
Наконец, при автономной работе агентов следует закладывать условия остановки, например максимальное число итераций, тестировать в песочницах и предусматривать паузы для обратной связи от человека на контрольных точках или при блокировках.
Ограничения и открытые вопросы
Авторы прямо признают: автономность агентов означает более высокие затраты и риск накопления ошибок, поэтому рекомендуют обширное тестирование в изолированных средах и защитные ограничения. Агентные системы часто обменивают задержку и стоимость на лучшее качество выполнения задачи, и этот компромисс нужно оценивать.
Для оценки качества предлагается измерять производительность и итерировать по реализациям. В поддержке клиентов успех можно чётко измерить через определяемые пользователем решения, в кодинге качество вывода можно измерить объективно.
Ответственность и надзор распределяются через возврат к человеку за информацией или суждением и через паузы на обратную связь. Надёжность подаётся как следствие принципов простоты, прозрачности и документирования инструментов.
Возможность задать максимальное число итераций названа, но без значения.