Пересылаю оригинальный заголовок: В проекте 89 вижу следующее поколение агентской платформы
Чтобы перейти к делу,@project_89принимает совершенно новый подход к проектированию агентской среды. Это высокопроизводительный агентский фреймворк, специально разработанный для разработки игр. По сравнению с текущими использованными агентскими фреймворками, он более модульный и обеспечивает лучшую производительность.
Эта статья была написана долгое время, пытаясь дать всем понять, какие архитектурные обновления были сделаны в этой раме по сравнению с традиционной агентской рамой. Она была пересмотрена много раз до этой версии, но все еще есть некоторые части в статье, которые слишком запутаны. Из-за технических трудностей мне не удалось дополнительно распространить ее. Если у вас есть предложения по улучшению статьи, пожалуйста, оставьте свои комментарии.
Перед тем как приступить к работе над проектом89, основатель разработал этот проект:https://github.com/Oneirocom/Magick, который также является программным обеспечением для программирования на основе искусственного интеллекта. Кроме того, Шоу занимает четвёртое место среди лучших разработчиков этого проекта. Вы также можете увидеть этот проект в портфолио Шоу.



Вверху слева: основатель проекта 89; Внизу справа: ‘lalaune’ - Шоу из ai16z
Сегодня мы в основном расскажем о высокопроизводительной среде Agent Framework в project89:
https://github.com/project-89/argOS
Игры, в настоящее время использующие архитектуру ECS, включают:
Игры на блокчейне: Mud, Dojo
Традиционные игры: Overwatch, Star Citizen и т. д.
Кроме того, основные игровые движки развиваются в направлении архитектуры ECS, такой как Unity.
Сущность
• Просто идентификатор (число или строка), не содержащий данных или логики.
• Вы можете установить различные компоненты, чтобы дать ему различные свойства или возможности по мере необходимости.
Компонент
• Используется для хранения конкретных данных или состояния сущности.
Система
• Ответственный за выполнение логики, связанной с определенными компонентами.
Давайте воспользуемся конкретным примером действия агента, чтобы понять эту систему:
В ArgOS каждый агент рассматривается как сущность, которая может зарегистрировать различные компоненты. Например, на рисунке ниже наш агент имеет следующие четыре компонента:
Компонент Агента: в основном хранит базовую информацию, такую как имя агента, название модели и т.д.
Компонент восприятия: в основном используется для хранения воспринимаемых внешних данных
Компонент памяти: главным образом используется для хранения данных памяти агентской сущности, аналогичных вещей, которые были сделаны и т. д.
Компонент действия: в основном хранит данные действия для выполнения
Системный рабочий процесс:

И очевидно, что в project89 это мир, наполненный различными типами Агентов. Например, некоторые Агенты не только обладают вышеупомянутыми базовыми способностями, но и имеют способность к составлению планов.
Затем это будет выглядеть как показано на картинке ниже:

И ArgOS разделяет System на «три уровня» (ConsciousnessLevel):
Содержит RoomSystem, PerceptionSystem, ExperienceSystem, ThinkingSystem, ActionSystem, CleanupSystem)- Частота обновления обычно выше (например, каждые 10 секунд).- Обработка ближе к уровню «реального времени» или «осознания», такая как восприятие окружающей среды, мышление в режиме реального времени, выполнение действий и т. д.2) Система подсознания (SUBCONSCIOUS)
GoalPlanningSystem, PlanningSystem- Частота обновления относительно низкая (например, каждые 25 секунд).- Обрабатывает "мыслительную" логику, такую как периодическая проверка/генерация целей и планов.3) Система бессознательного (БЕССОЗНАТЕЛЬНОЙ)
Еще не включено- Частота обновления медленнее (например, более 50 секунд),Поэтому в ArgOS различные системы разделяются в соответствии с уровнем сознания, чтобы определить, как часто будет выполняться этот система.
Почему это сделано таким образом?
Поскольку взаимосвязь различных систем в ArgOS чрезвычайно сложна, как показано ниже:

В конечном итоге данные о "текущем восприятии" предоставляются для последующей системы опыта, системы мышления и т. д.
LLM или правила логики (extractExperiences) вызываются для определения новых опытов и сохраняются в компоненте Memory.
Удаление дубликатов, фильтрация и проверка опыта, с одновременной генерацией событий «опыт» в других системах или внешних слушателях через eventBus.
Извлеките текущий статус из компонентов, таких как Память и Восприятие, и сгенерируйте "РезультатМысли" через generateThought(…) и логику LLM/правило.
Исходя из результата мысли, это может:
• Обновить мысли в Памяти (история мыслей).
• Активируйте новое действие (поместите в Action.pendingAction[eid]).
• Измените внешний вид агента (выражение лица, позу и т. д.) и создайте связанный стимул, чтобы позволить другим сущностям «увидеть» изменение.
После выполнения записать результат обратно в Action.lastActionResult и уведомить комнату или другие сущности.
Это также порождает CognitiveStimulus (когнитивное стимулирование), чтобы последующие системы «знали», что действие было выполнено или может быть включено в память.
При необходимости создания новой цели или корректировки цели сгенерируйте и запишите Goal.current[eid] с помощью generateGoals(...).
В то же время обновляется цель в процессе выполнения (in_progress). Если выполняются условия завершения или отказа, изменяется статус, и отправляется сигнал о завершении/отказе соответствующему Плану.
Если обнаружено, что некоторые цели не имеют соответствующих активных планов, сгенерируйте дорожную карту выполнения, содержащую несколько шагов через generatePlan(…) и запишите ее в Plan.plans[eid].
Когда цель достигнута или не удалось, связанный с ней статус плана также будет обновлен, и будет сгенерировано соответствующее когнитивное стимулирование.
7.RoomSystem обрабатывает обновления, связанные с комнатой:
• Получить список жильцов в комнате (занятые места) и сгенерировать «появление» стимулов для каждого агента, чтобы другие сущности могли «видеть» его внешний вид или действия.
• Создавайте и связывайте стимулы в комнатной среде (например, соответствующую информацию о 'атмосфере комнаты').
Убедитесь, что когда Агент находится в определенной пространственной среде, другие сущности, ощущающие пространство, могут воспринимать изменения в его внешности.
8.CleanupSystem периодически находит и удаляет сущности, помеченные компонентом Cleanup. Используется для утилизации стимулов или других объектов, которые больше не нужны, чтобы предотвратить образование большого количества недействительных сущностей в ECS.
Подготовка сцены: В мире есть Агент (EID=1), который находится в состоянии «Активный» и находится в Комнате (EID=100).
В этой комнате появился новый реквизит «MagicSword», и был создан соответствующий стимул.
ThinkingSystem записывает это действие в Action.pendingAction[1].
Если происходит изменение внешности (например, "лицо с любопытным выражением"), то внешность обновляется, и генерируется визуальное воздействие.
4.ActionSystem видит Action.pendingAction[1] = { tool: "pickUpItem", параметры: ... }。
Выполните логику действия «pickup» с помощью runtime.getActionManager().executeAction(«pickUpItem», 1, { itemName: «MagicSword» }, runtime). Получите результат: { success: true, message: «Вы подобрали магический меч» }, обновите Action.lastActionResult[1] и запустите событие «action», чтобы оно было передано в комнату (100).
В то же время генерируется когнитивный стимул (тип="результат_действия"), записанный в Память или захваченный ThinkingSystem в следующем ходу.
7.RoomSystem обновляет список жильцов и видимых сущностей в комнате (100) (каждый кадр или раунд).
Если внешний вид агента(1) изменяется (например, Appearance.currentAction = «держит меч»), создайте новый визуальный стимул «внешности», чтобы сообщить другим агентам2 и агентам3 в одной комнате, что «агент1 поднял меч».
8.CleanupSystem удаляет сущности или стимулы, которые были помечены (Cleanup). Если вам больше не нужно сохранять стимул "Магический меч" после его подбора, вы можете удалить соответствующую сущность стимула в CleanupSystem.

• Агент / Игрок / ПрофильNPC / ПрофильNPC и т. д.
• Используется для уникальной идентификации сущностей, хранения основных ролей или информации об единицах и, как правило, требует сохранения в базе данных.
• Действие, Цель, План, Состояние обработки и т. д.
• Представляет, что сущность в данный момент пытается делать или какие у нее цели, а также ее статус ответа на внешние команды и внутреннее мышление.
• Содержит ожидающие действия, текущие цели, планы и мысли или задачи в очереди и т. д.
• Обычно среднесрочные/краткосрочные состояния, многие из которых динамически изменяются в течение раундов игры или бизнес-циклов.
• Необходимо ли запастись зависит от ситуации. Если вы хотите продолжить работу после остановки, вы можете периодически записывать данные в базу данных.
• Восприятие, Память, Стимул, Опыт и т.д.
• Записывает внешнюю информацию (стимулы), воспринятую субъектом, и переработанные в ней после восприятия опыты (опыт).
• Память часто может накапливать большие объемы данных, такие как записи разговоров, история событий и т. д .; часто требуется сохранение.
• Восприятие может быть в режиме реального времени или временной информацией, в основном действительной в краткосрочной перспективе. Вы можете решить, нужно ли записывать его в базу данных в соответствии с вашими потребностями (например, хранить только важные события восприятия).
• Представляет информацию, такую как комнаты, окружение, местоположение, контейнеры объектов и т. д.
•Room.id, OccupiesRoom, Environment and other fields often need to be persisted, such as room homepage description, map structure, etc.
• Изменение компонентов (например, сущности, перемещающейся между комнатами) может быть записано событийно или периодически.
• Записывайте внешние «видимые» или «интерактивные» части сущности, такие как аватар, поза, выражение лица, социальная сеть взаимоотношений с другими сущностями и т. д.
• Некоторые части могут быть обработаны только в памяти (в виде реального времени), в то время как другие части (например, ключевые социальные отношения) могут быть сохранены.
• Используется для обозначения сущностей, которые требуется утилизировать (Cleanup), или записи отладочной информации (DebugInfo) для использования в мониторинге и анализе.
• Обычно существует только в памяти и редко синхронизируется с базой данных, если это необходимо для ведения журнала или аудита.

Левая сторона: Системы (PerceptionSystem, ExperienceSystem, ThinkingSystem и т. д.):
• Каждая система запланирована для выполнения SimulationRuntime в цикле ECS, опрашивая и обрабатывая интересующие ее сущности (через условия компонентов).
• При выполнении логики вам необходимо взаимодействовать с менеджерами, например:
• Предоставление функций на уровне системы, которые в основном не активно «управляют» логикой, но вызываются Системами или Runtime.
• Типичные примеры:
• Менеджеры также создаются на этапе строительства и передаются каждой Системе для использования.
В заключение:
Каждая Система будет читать и записывать данные или вызывать сервисы через соответствующего Менеджера при необходимости, а Рантайм будет единообразно планировать жизненный цикл и поведение всех Систем и Менеджеров на более высоком уровне.
• Например, прочитайте пакет записей агента и вставьте их в мир ECS, а также инициализируйте для них компоненты Agent, Memory, Goal и другие.
• Система выполняет действия в каждом кадре (или раунде): PerceptionSystem собирает «восприятия» и записывает их в компонент Perception (в основном краткосрочные из библиотеки).
ExperienceSystem записывает новый «когнитивный опыт» в Memory.experiences. Если это ключевой интерфейс, он также может вызвать StateManager для немедленного хранения или пометить его "needsPersistence" для последующей пакетной записи.
ThinkingSystem / ActionSystem / GoalPlanningSystem и т. д. принимают решения на основе содержимого компонента и обновляют поля в ECS.
Если некоторые компоненты (например, Goal.current) претерпевают крупные изменения и требуют сохранения (например, новая долгосрочная цель), уведомляйте StateManager, чтобы записать это поле в базу данных через прослушивание компонентов или системные события.
3.Периодическое или событийно-ориентированное хранение
• Вы можете вызывать интерфейсы, такие как PersistenceManager.storeComponentData(eid, “Goal”) , чтобы убрать библиотеку в определенных ключевых точках в системе (например, когда целевой план обновляется или когда важное событие происходит на Агенте).
• Вы также можете позволить StateManager сканировать компоненты или сущности с тегом «needsPersistence» в CleanupSystem или таймере и записывать их обратно в базу данных сразу.
• Кроме того, данные журнала или аудита (например, история действий, журнал мыслей) также могут быть сохранены и храниться здесь.
• При выключении сервера или процесса используйте StateManager.saveAll(), чтобы записать несохраненные данные в базу данных единообразно, чтобы обеспечить возможность восстановления состояния ECS при следующей загрузке.
• Для некоторых автономных/оффлайн-сценариев архивы также могут быть запущены вручную.
Load room information from the “rooms” table at the same time and create a Room entity.
Операции во время выполнения: PerceptionSystem обнаруживает событие «Появление Волшебного Меча» в определенной комнате и записывает Perception.currentStimuli[eid].ExperienceSystem преобразует стимулы в опыт и присваивает его Memory.experiences[eid].ThinkingSystem определяет следующее действие на основе Memory, Goal и другой информации и генерирует Action.pendingAction[eid]. После выполнения действия ActionSystem записывает результат в Memory или Action.lastActionResult. Если это событие важного сюжета, последняя часть Memory.experiences[eid] будет помечена как needsPersistence. Через некоторое время StateManager обнаруживает, что Memory.experiences[eid] имеет «needsPersistence» и записывает его в базу данных (INSERT INTO memory_experiences…).
Остановка или сохранение контрольной точки: на основе планирования ECS или системы StateManager.saveAll() вызывается при «выключении сервера», чтобы записать последний статус ключевых компонентов (агент, память, цель и т. д.), все еще находящихся в памяти, в базу данных. При следующем перезапуске мир ECS можно загрузить и восстановить из базы данных.
• Категоризация компонентов не только облегчает ясное управление данными сущности в проекте, но и помогает контролировать границы данных между «требуется сохранение» и «существует только в памяти».
• Взаимодействие с базой данных обычно обрабатывается специализированным менеджером (например, StateManager), и система работает через него, когда ей нужно читать и записывать в базу данных, избегая прямой записи SQL или аналогичных низкоуровневых операторов в системе.
• Таким образом, вы можете одновременно наслаждаться логической эффективностью и гибкостью ECS, а также преимуществами устойчивости, возобновления работы после остановки и анализа статистики данных, предоставленных базой данных.

Основные моменты всей архитектуры:

В то же время, если вы хотите добавить новые функции в процессе разработки, это не повлияет на другие системы, и вы легко сможете загрузить нужные функции.





