Generative Agents: Interactive Simulacra of Human Behavior
Joon Sung Park, Joseph C. O'Brien, Carrie J. Cai, Meredith Ringel Morris, Percy Liang, Michael S. Bernstein
Статья:
https://arxiv.org/abs/2304.03442
Недавно упоминал эту прикольную работу (
https://t.center/gonzo_ML/1467) от команды из Стэнфорда и Гугла, она прям классная, хочется её рассмотреть.
В работе создают генеративных агентов, симулирующих человеческое поведение. Агенты живут своей жизнью: просыпаются, готовят завтрак, идут на работу и т.п., общаются с другими агентами, сохраняют воспоминания, планируют следующий день.
Для агентов собрали сэндбокс под именем Smallville в виде маленького городка. Там есть дома, колледж, магазины, парк, кафе и т.п. В домах есть отдельные комнаты, в них есть предметы типа столов и шкафов. Этот мир описывается деревом, где в листьях отдельные предметы.
Отображается всё в виде спрайтовой 2D-игры (собрана на Phaser,
https://phaser.io/). Написанный сервер обеспечивает передачу состояния мира агентам и отвечает за перемещение агентов и их взаимодействия. Внутри себя он поддерживает JSON-структуру с состояниями агентов.
Агентом является аугментированная памятью событий LLM, в данном случае ChatGPT (gpt3.5-turbo), GPT-4 в момент написания статьи была invite-only, поэтому её использовать не смогли (но должно быть лучше и дороже).
В основе архитектуры агента три компонента:
1)
Memory stream для хранения жизненного опыта (experiences) агента.
2)
Reflection, синтезирующий воспоминания в более высокоуровневые выводы.
3)
Planning, транслирующий умозаключения агента и состояние среды в верхнеуровневые планы и детальные поведения.
Memory stream, база жизненного опыта агента, по сути центральный элемент архитектуры агента. Записи в базе и умозаключения агента идут на естественном языке, для этого и используется LLM. В случае когда агент участвует в куче событий челленджем является поднятие из памяти наиболее релевантных, иначе можно тупо перестать влезать в промпт. Суммаризацией тоже не всегда можно добиться нужного результата, важные вещи могут выпасть, тем более что важность может меняться в зависимости от ситуации. Поэтому важно вытягивать релевантное.
У каждого объекта в памяти есть текстовое содержимое, дата создания и дата последнего обращения. Самый базовый тип элемента в памяти -- это
наблюдение (
observation), то что агент напрямую воспринимает. Это могут быть действия самого агента или наблюдаемые поведения других агентов или предметов.
Пример наблюдений из памяти Изабеллы Родригес, работающей в кофейне: "
(1) Isabella Rodriguez is setting out the pastries, (2) Maria Lopez is studying for a Chemistry test while drinking coffee, (3) Isabella Rodriguez and Maria Lopez are conversing about planning a Valentine’s day party at Hobbs Cafe, (4) The refrigerator is empty".
Специальная retrieval-функция получает на вход текущую ситуацию агента и возвращает подмножество событий из памяти, чтобы передать в LLM. Скор каждого элемента зависит от трёх факторов:
-
Recency, экспоненциально затухающая свежесть, вычисляемая из времени последнего обращения к элементу.
-
Importance, что прикольно, получаемая из LLM по целочисленной шкале от 1 до 10, где 1 это что-то совсем бытовое и незначительное (чистил зубы), а 10 что-то очень важное (развод, поступление в колледж).
-
Relevance, которая считается через косинусную близость полученных через LLM эмбеддингов запроса и элемента памяти.
Все три фактора нормализуются к диапазону [0, 1] и суммируются с весами (в текущей работе веса одинаковые). Лучшие кандидаты из памяти, что влезают в промпт, оставляются.
Reflection это второй тип памяти после observation, более высокоуровневый и абстрактный, генерируемый агентом. Они тоже хранятся в memory stream и достаются retrieval’ом. Рефлексии генерируются периодически, когда сумма importance скоров для последних событий агента превосходит некоторый порог. На практике это происходит два-три раза в день.