Переслати оригінальний заголовок: Я бачу наступне покоління агентської рамки в Project89
Щоб перейти безпосередньо до справи, @project_89приймає абсолютно новий підхід до проектування рамок Агента. Це високопродуктивна рамка Агента, спеціально розроблена для розробки ігор. Порівняно з використовуваними наразі рамками Агента, вона є більш модульною та має кращу продуктивність.
Ця стаття була написана довгою митьою, намагаючись дати всім зрозуміти, які архітектурні оновлення зроблено в цьому фреймворку порівняно з традиційним фреймворком Agent. Вона була багато разів перероблена до цієї версії, але все ще є деякі частини в статті, які є занадто заплутаними. Через технічні труднощі я не зміг розповсюдити це далі. Якщо у вас є які-небудь пропозиції щодо покращення статті, будь ласка, залишайте свої коментарі.
Перед тим, як працювати над Проектом89, засновник розробив цей проект: https://github.com/Oneirocom/Magick, який також є програмним забезпеченням на основі штучного інтелекту. Крім того, Шоу займає четверте місце серед провідних розробників цього проекту. Ви також можете побачити цей проект у портфоліо Шоу.



Зліва вгорі: засновник проекту89; Внизу справа: ‘lalaune’ - Шоу з ai16z
Сьогодні ми в основному представимо високопродуктивний агентський фреймворк у project89:
https://github.com/project-89/argOS
Гри, які в даний час використовують архітектуру ECS, включають:
Блокчейн-ігри: Mud, Dojo
Традиційні ігри: Overwatch, Star Citizen, та інші.
Крім того, основні гральні двигуни розвиваються в напрямку архітектури ECS, такої як Unity.
Сутність
• Просто ідентифікатор (число або рядок), який не містить даних або логіки.
• Ви можете монтувати різні компоненти, щоб надати йому різні властивості або можливості за потреби.
Компонент
• Використовується для зберігання конкретних даних або стану сутності.
Система
• Відповідальний за виконання логіки, пов'язаної з певними компонентами.
Давайте скористаємося конкретним прикладом дії агента, щоб зрозуміти цю систему:
У ArgOS кожен Агент розглядається як Сутність, яка може реєструвати різні компоненти. Наприклад, на наведеному нижче зображенні наш Агент має наступні чотири компоненти:
Компонент агента: головним чином зберігає основну інформацію, таку як ім'я агента, назва моделі тощо.
Компонент сприйняття: Головним чином використовується для зберігання сприйнятих зовнішніх даних
Компонент пам'яті: В основному використовується для зберігання даних пам'яті агентської сутності, подібних речей, які вже були зроблені і т. д.
Action Component: Головним чином зберігає дані про дії, які потрібно виконати
Робочий процес системи:

І очевидно, що в project89 це світ, наповнений різними видами Агентів. Наприклад, деякі Агенти не тільки володіють перерахованими вище базовими здібностями, але і мають здатність будувати плани.
Тоді це буде, як показано на малюнку нижче:

А ArgOS ділить Систему на "три рівні" (AwarenessLevel):
Містить RoomSystem, PerceptionSystem, ExperienceSystem, ThinkingSystem, ActionSystem, CleanupSystem)- Частота оновлення зазвичай вища (наприклад, кожні 10 секунд).- Обробка наближається до рівня «реального часу» або «свідомого» рівня, таких як сприйняття оточення, миттєва думка, виконання дій тощо.2) Субсвідома (СУБСВІДОМА) система
GoalPlanningSystem, PlanningSystem- Частота оновлення відносно низька (наприклад, кожні 25 секунди).- Обробляє логіку «мислення», таку як періодична перевірка / генерація цілей та планів.3) Безсвідома (БЕЗСВІДОМА) система
Ще не активовано- Частота оновлення повільніша (наприклад, більше 50 секунд),Отже, в ArgOS різні системи розділені за рівнем свідомості, щоб визначити, як часто ця система буде виконуватися.
Чому це спроектовано саме так?
Тому що взаємодія між різними системами в ArgOS надзвичайно складна, як показано нижче:

На кінець, дані «поточного сприйняття» надаються для подальшої системи досвіду, системи мислення тощо.
LLM або правило логіки (extractExperiences) викликається для визначення нових досвідів та зберігається в компоненті Пам'яті.
Видаліть дублікати, відфільтруйте та перевірте досвід, спровокуючи події "досвіду" в інші системи або зовнішні слухачі через eventBus.
Видобути поточний статус з компонентів, таких як Пам'ять та Сприйняття, і згенерувати "ThoughtResult" через generateThought(...) та LLM/логіку правил.
На основі результату думки це може:
• Актуалізація думок в пам'яті (історія мислення).
• Запустіть нову дію (покласти в Action.pendingAction[eid]).
• Змінити зовнішній вигляд агента (вираз, постава і т.д.) та створити відповідний стимул, щоб дозволити іншим сутностям «побачити» зміну.
Після виконання, результат записується назад у Action.lastActionResult та повідомляється кімнаті або іншим сутностям.
Це також виробляє когнітивний стимул (когнітивну стимуляцію), щоб наступні системи «знали», що дія була виконана, або може бути включена в пам'ять.
Коли потрібно створити нову мету або внести коригування до мети, створіть та запишіть Goal.current[eid] за допомогою generateGoals(…).
У той же час, оновлюється ціль, що перебуває в процесі (in_progress). Якщо виконуються умови завершення або невдачі, статус змінюється, і відповідному плану надсилається сигнал про завершення/невдачу.
Якщо виявлено, що деякі цілі не мають відповідних активних планів, згенеруйте план виконання, що містить кілька кроків через generatePlan(…) та запишіть його в Plan.plans[eid].
Коли ціль виконана або не вдалася, статус плану, пов'язаний з нею, також буде оновлений, і буде згенерована відповідна когнітивна стимуляція.
7.RoomSystem обробляє оновлення, пов'язані з кімнатами:
• Отримати список мешканців у кімнаті (жителі) та створити "вигляд" подразник для кожного агента, щоб інші сутності "бачили" його зовнішній вигляд або дії.
• Створіть та корелюйте стимули середовища кімнати (наприклад, відповідну інформацію про "атмосферу кімнати").
Переконайтеся, що коли Агент знаходиться в певному просторовому середовищі, інші сутності, які відчувають цей простір, можуть сприймати зміни в його зовнішності.
8.CleanupSystem періодично знаходить та видаляє сутності, позначені компонентом Cleanup. Використовується для переробки стимулю або інших об'єктів, які більше не потрібні, щоб уникнути залишку великої кількості недійсних сутностей в ECS.
Підготовка сцени: В світі є Агент (EID=1), який знаходиться в стані "Активний" і знаходиться в Кімнаті (EID=100).
У цій кімнаті з'явилася нова реквізит «MagicSword», і згенерований відповідний стимул.
ThinkingSystem writes this Action to Action.pendingAction[1].
Якщо з'являється зміна зовнішнього вигляду (наприклад, "обличчя з цікавим виразом"), оновлюється вигляд, і візуальна стимуляція генерується.
Виконайте логіку дії "pickup" через runtime.getActionManager().executeAction("pickUpItem", 1, { itemName: "MagicSword" }, runtime). Отримайте результат: { success: true, message: "Ви підібрали чарівний меч" }, оновіть до Action.lastActionResult[1] і запустіть подію "action", яка транслюватиметься в кімнату (100).
У той самий час генерується пізнавальний стимул (тип = "результат_дії"), який записується в пам'ять або захоплюється системою мислення в наступному ході.
Система планування цілей (якщо у агента є цілі) періодично оцінює цілі агента. Якщо одна з цілей агента на даний момент - "отримати потужну зброю", і виявляє, що було отримано Магічний Меч, цю ціль може бути відзначено як виконану. Якщо відбуваються нові зміни (наприклад, "в кімнаті з'являється новий об'єкт") впливають на ціль, яку переслідує агент?), створюйте нову ціль або відмітьте стару ціль на основі виявлених значущих змін.
Система планування (якщо є відповідна ціль) перевіряє, чи потрібен новий план або оновлюється існуючий план для досягнутих або новостворених цілей, таких як «Отримання потужної зброї».Якщо завершено, встановіть пов'язаний план [статус] на "завершений", або згенеруйте більше кроків, якщо мета полягає в розширенні наступного процесу ("Дослідження Магічного Меча").
Система кімнати оновлює список мешканців та видимих сутностей у кімнаті (100) (кожен кадр або раунд).
Якщо змінюється зовнішній вигляд агента(1) (наприклад, Appearance.currentAction = "тримає меч"), створіть новий візуальний стимул "зовнішній вигляд", щоб повідомити іншого Агента2 та Агента3 в тій самій кімнаті, що "агент1 підібрав меч".
8.CleanupSystem видаляє об'єкти або стимули, які були позначені (Очищення). Якщо вам більше не потрібно зберігати стимул «MagicSword» після того, як ви його підібрали, ви можете видалити відповідну сутність «Стимулу» в CleanupSystem.

• Агент / Профіль гравця / Профіль NPC тощо.
• Використовується для унікальної ідентифікації сутностей, зберігання основних ролей або інформації про одиниці, і, як правило, потребує збереження в базі даних.
• Дія, Ціль, План, Стан обробки, тощо.
• Представляє, що сутність намагається зробити в даний момент або які є її цілі, а також її статус відповіді на зовнішні команди та внутрішнє мислення.
• Містить pendingAction, goalsInProgress, plans, та думки або завдання в черзі, тощо.
• Типово середньо-короткострокові стани, багато з них динамічно змінюються протягом ігрових раундів або бізнес-циклів.
• Потреба в зберіганні залежить від ситуації. Якщо ви хочете продовжити роботу після зупинки, ви можете періодично записувати дані в базу даних.
• Сприйняття, пам'ять, стимул, досвід тощо.
• Записує зовнішню інформацію (Стимули), сприйняту сутністю, та досвід, який вона здобула після сприйняття (Досвіди).
• Пам'ять часто може накопичувати великі обсяги даних, такі як записи розмов, історію подій і т.д .; часто потрібна постійність.
• Сприйняття може бути інформацією в реальному часі або тимчасовою, переважно актуальною в короткостроковій перспективі. Ви можете вирішити, чи записувати його в базу даних відповідно до ваших потреб (наприклад, зберігаються тільки важливі події сприйняття).
• Представляє інформацію, таку як кімнати, середовища, місця, контейнери об'єктів тощо.
• Room.id, Займає кімнату, середовище та інші поля часто потрібно зберігати, наприклад, опис головної сторінки кімнати, структура карти тощо.
• Зміна компонентів (наприклад, сутності, яка переміщується між кімнатами), може бути описана подійно або періодично.
• Записати зовнішні «видимі» або «інтерактивні» частини сутності, такі як аватар, поза, вираз обличчя, соціальна мережа відносин з іншими сутностями тощо.
• Деякі частини можуть бути оброблені лише у пам'яті (представлення в реальному часі), тоді як інші частини (наприклад, ключові соціальні відносини) можуть бути збережені.
• Використовується для позначення сутностей, які потрібно відновити (Cleanup), або запису відлагоджувальної інформації (DebugInfo) для використання в моніторингу та аналізі.
• Зазвичай існує тільки в пам'яті та рідко синхронізується з базою даних, якщо це необхідно для ведення журналування або аудитування.

Ліва сторона: Системи (Система сприйняття, Система досвіду, Система мислення та інші):
• Кожна система запланована для виконання SimulationRuntime у циклі ECS, запитуючи та обробляючи сутності, які їй цікаві (через умови компонентів).
• Під час виконання логіки вам потрібно спілкуватися з менеджерами, наприклад:
• Надавати функції на рівні системи, які, в основному, не активно «приводять» логіку, але викликаються Системами або Рантаймом.
• Типові приклади:
• Менеджери також створюються під час фази будівництва і передаються кожній системі для використання.
На завершення:
Кожна система буде читати та записувати дані або викликати сервіси через відповідного менеджера, коли це потрібно, а Runtime буде єдинообразно розподіляти життєвий цикл та поведінку всіх систем та менеджерів на вищому рівні.
• Наприклад, прочитайте пакет записів агента та вставте їх у світ ECS, та ініціалізуйте для них компоненти Агента, Пам'яті, Цілей та інші.
• Система робить речі у кожному кадрі (або раунді): PerceptionSystem збирає «перцепції» і записує їх у компонент Perception (в основному короткостроково з бібліотеки).
ExperienceSystem writes the new “cognitive experience” into Memory.experiences. If it is a key experience, it may also call StateManager for immediate storage, or mark it with “needsPersistence” for subsequent batch writing.
ThinkingSystem / ActionSystem / GoalPlanningSystem тощо роблять рішення на основі вмісту компонентів та оновлюють поля в ECS.
Якщо деякі компоненти (наприклад, Goal.current) зазнають значних змін і вимагають постійності (наприклад, нова довгострокова ціль), повідомте StateManager, щоб записати це поле в базу даних за допомогою прослуховування компонентів або системних подій.
3.Періодична або подійно-орієнтована стійкість
• Ви можете викликати інтерфейси, такі як PersistenceManager.storeComponentData(eid, “Goal”), щоб викинути бібліотеку в певних ключових точках системи (наприклад, коли оновлюється цільовий план або коли відбувається важлива подія на Агенті).
• Ви також можете зробити так, щоб StateManager сканував компоненти або сутності з тегом "needsPersistence" в CleanupSystem або таймері, та одразу записав їх у базу даних.
• Крім того, дані журналу або аудиту (такі як історія дій, журнал думок) також можуть бути збережені та зберігатися тут.
• Коли сервер або процес має бути вимкнений, використовуйте StateManager.saveAll(), щоб одноразово записати незаписані дані в базу даних, щоб забезпечити можливість відновлення стану ECS при наступному завантаженні.
• Для деяких автономних/офлайн-сценаріїв також можна вручну запускати архіви.
У той же час завантажте інформацію про кімнату з таблиці "кімнати" та створіть сутність Room.
Операції часу виконання: Система сприйняття виявляє подію «З'являється магічний меч» у певній кімнаті та записує 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, а також перевагами постійності, відновлення після переривання, та аналізу даних, які надає база даних.

Основні особливості всієї архітектури:

Водночас, якщо ви хочете додати нові функції під час процесу розробки, це не буде мати жодного впливу на інші системи, і ви зможете легко завантажити потрібні функції.





