Transférer le titre original : Je vois le cadre d’agent de la prochaine génération dans le projet89
Pour aller droit au but, @project_89adopte une approche entièrement nouvelle pour concevoir un cadre d’agent. Il s’agit d’un cadre d’agent haute performance spécifiquement pour le développement de jeux. Par rapport aux cadres d’agent actuellement utilisés, il est plus modulaire et offre de meilleures performances.
Cet article a pris beaucoup de temps à rédiger, essayant de permettre à tous de comprendre quelles mises à niveau architecturales ce framework a apportées par rapport au framework Agent traditionnel. Il a été révisé plusieurs fois avant cette version, mais il y a encore des parties de l’article qui sont trop confuses. En raison de difficultés techniques, je n’ai pas pu le populariser davantage. Si vous avez des suggestions pour améliorer l’article, veuillez laisser vos commentaires.
Étant donné que c’est un blog technique, regardons d’abord l’expertise technique du fondateur.
Avant de travailler sur le Projet89, le fondateur a développé ce projet : https://github.com/Oneirocom/Magick, qui est également un logiciel de programmation alimenté par l’IA. De plus, Shaw est classé quatrième développeur de ce projet. Vous pouvez également voir ce projet dans le portefeuille de Shaw.
En haut à gauche: le fondateur de project89; En bas à droite: ‘lalaune’ est Shaw d’ai16z
Aujourd’hui, nous allons principalement présenter le Framework Agent haute performance dans le projet89 :
https://github.com/project-89/argOS
Du point de vue de l’application dans le domaine des jeux
Les jeux utilisant actuellement l’architecture ECS comprennent :
Jeux blockchain : Mud, Dojo
Jeux traditionnels : Overwatch, Star Citizen, etc.
De plus, les moteurs de jeu grand public évoluent vers une architecture ECS, tels que Unity.
ECS (Entity-Component-System) est un modèle architectural couramment utilisé dans le développement de jeux et les systèmes de simulation. Il sépare complètement les données et la logique pour gérer efficacement les différentes entités et leurs comportements dans des scénarios à grande échelle et évolutifs :
Entité
• Juste un identifiant (numéro ou chaîne de caractères), ne contenant aucune donnée ou logique.
• Vous pouvez monter différents composants pour lui donner différentes propriétés ou capacités selon les besoins.
Composant
• Utilisé pour stocker des données spécifiques ou l’état d’une entité.
Système
• Responsable de l’exécution de la logique liée à certains composants.
Utilisons un exemple spécifique d’action de l’Agent pour comprendre ce système :
Dans ArgOS, chaque Agent est considéré comme une Entité, qui peut enregistrer différents composants. Par exemple, dans l’image ci-dessous, notre Agent a les quatre composants suivants :
Composant Agent: stocke principalement des informations de base telles que le nom de l’Agent, le nom du modèle, etc.
Composant de perception : principalement utilisé pour stocker les données externes perçues
Composant de mémoire : principalement utilisé pour stocker les données de mémoire de l’entité agent, les choses similaires qui ont été réalisées, etc.
Composant d’action : Stocke principalement les données d’action à exécuter
Flux de travail du système :
Ensuite, nous obtenons une Entité d’Agent de Mise à Jour dans laquelle chaque donnée de Composant est mise à jour.
4. Donc, nous pouvons voir que le système ici est principalement responsable de définir quelles composantes exécutent la logique de traitement correspondante.
Et il est évident que dans project89, c’est un monde rempli de différents types d’Agents. Par exemple, certains Agents ont non seulement les capacités de base mentionnées ci-dessus, mais ont également la capacité de faire des plans.
Alors ce sera comme indiqué sur l’image ci-dessous :
Cependant, contrairement aux frameworks traditionnels où un système déclenche directement un autre (par exemple, le système de perception appelant le système de mémoire), dans le Projet89, les systèmes ne s’appellent pas directement les uns les autres. Au lieu de cela, chaque système s’exécute indépendamment à des intervalles de temps fixes. Par exemple :
Jusqu’à présent, cet article a considérablement simplifié l’architecture d’ArgOS pour la rendre plus facile à comprendre. Maintenant, examinons de plus près le véritable système ArgOS.
Afin de permettre à l’Agent de réfléchir plus profondément et d’accomplir des tâches plus complexes, ArgOS a conçu de nombreux Composants et de nombreux Systèmes.
Et ArgOS divise le système en “trois niveaux” (Niveau de conscience):
1) système CONSCIENT
2) Système Subconscient (SUBCONSCIENT)
3) Système inconscient (INCONSCIOUS)
Par conséquent, dans ArgOS, différents systèmes sont divisés en fonction du niveau de conscience pour stipuler à quelle fréquence ce système sera exécuté.
Pourquoi est-il conçu de cette manière?
Parce que la relation entre les différents systèmes dans ArgOS est extrêmement complexe, comme le montre ci-dessous :
Déterminer si le stimulus change de manière significative et mettre à jour en conséquence en fonction de la stabilité, du mode de traitement (ACTIF/RÉFLECTIF/EN ATTENTE), etc.
En fin de compte, des données de « perception actuelle » sont fournies pour les systèmes ultérieurs d’expérience, de réflexion, etc.
2.ExperienceSystem convertit les stimuli collectés par PerceptionSystem en une « expérience » plus abstraite.
La logique LLM ou règle (extractExperiences) est appelée pour identifier de nouvelles expériences et les stocker dans le composant Memory.
Dédoublonnez, filtrez et vérifiez les expériences, tout en déclenchant des événements «expérience» vers d’autres systèmes ou des écouteurs externes via eventBus.
3. ThinkingSystem représente le processus de réflexion interne de l’agent.
Extraire l’état actuel des composants tels que la Mémoire et la Perception, et générer le “ThoughtResult” grâce à la génération de la pensée (…) et à la logique LLM/règle.
En fonction du résultat de la réflexion, cela peut :
• Mettre à jour les pensées dans la mémoire (historique des réflexions).
• Déclencher une nouvelle action (mettre dans Action.pendingAction[eid]).
• Modifier l’apparence externe de l’agent (expression, posture, etc.) et générer des stimuli connexes pour permettre à d’autres entités de «voir» le changement.
4. Le système d’action exécute des actions siAction.pendingActionn’est pas vide, en utilisantruntime.getActionManager().executeAction(…).
Après l’exécution, écrivez le résultat dans Action.lastActionResult et notifiez la salle ou d’autres entités.
Cela produit également un CognitiveStimulus (stimulation cognitive) de sorte que les systèmes ultérieurs ‘sachent’ que l’action a été achevée, ou peut être incorporée dans la mémoire.
5.GoalPlanningSystem évalue périodiquement la progression des objectifs de la liste Goal.current[eid] ou vérifie la mémoire externe/propre pour détecter les changements significatifs (detectSignificant Changes).
Lorsqu’un nouvel objectif ou un ajustement d’objectif est requis, générer et écrire Goal.current[eid] via generateGoals(…).
En même temps, l’objectif en cours (in_progress) est mis à jour. Si les conditions de réussite ou d’échec sont remplies, le statut est modifié et un signal de réussite/échec est envoyé au Plan correspondant.
6.PlanningSystem génère ou met à jour le plan (plan d’exécution) pour le “but existant” (Goal.current[eid]).
S’il est détecté que certains objectifs n’ont pas de plans actifs correspondants, générer une feuille de route d’exécution contenant plusieurs étapes via generatePlan(…) et l’écrire dans Plan.plans[eid].
Lorsque l’objectif est atteint ou échoué, le statut du plan associé sera également mis à jour et une stimulation cognitive correspondante sera générée.
7. Le système de gestion des chambres gère les mises à jour liées aux chambres:
• Obtenir la liste des occupants de la chambre (occupants) et générer des stimuli “d’apparence” pour chaque agent afin de permettre à d’autres entités de “voir” son apparence ou ses actions.
• Créez et corrélez les stimuli de l’environnement de la pièce (par exemple, des informations appropriées sur l’« ambiance de la pièce »).
Veillez à ce que lorsque l’Agent se trouve dans un certain environnement spatial, d’autres entités qui perçoivent l’espace puissent percevoir des changements dans son apparence.
8.CleanupSystem trouve périodiquement et supprime les entités marquées avec le composant Cleanup. Utilisé pour recycler les Stimulus ou d’autres objets qui ne sont plus nécessaires afin d’éviter qu’un grand nombre d’entités invalides ne restent dans ECS.
L’exemple de scène suivant montre comment chaque système coopère pour compléter un processus complet en une seule ronde (ou plusieurs images).
Préparation de la scène : Il y a un Agent (EID=1) dans le Monde, qui est dans l’état “Actif” et est dans une Pièce (EID=100).
Une nouvelle propriété “MagicSword” est apparue dans cette pièce, et le stimulus correspondant a été généré.
« J’ai vu la MagicSword, peut-être la prendre et voir ce qu’elle peut faire… » Le résultat de la réflexion contient une Action à exécuter: {outil: « pickUpItem », paramètres: {nom de l’article: « MagicSword »}}
ThinkingSystem écrit cette Action à Action.pendingAction[1].
Si il y a un changement d’apparence (par exemple, “visage avec une expression curieuse”), l’apparence est mise à jour et une stimulation visuelle est générée.
4. ActionSystem voit Action.pendingAction[1] = { outil : “pickUpItem”, paramètres : … }.
Exécutez la logique de l’action “pickup” via runtime.getActionManager().executeAction(“pickUpItem”, 1, { nomObjet: “MagicSword” }, runtime). Obtenez le résultat : { success: true, message: “Vous avez ramassé l’épée magique” }, mettez à jour Action.lastActionResult[1] et déclenchez l’événement “action” à diffuser dans la salle (100).
En même temps, un stimulus cognitif (type=”action_result”) est généré, écrit dans la mémoire ou capturé par ThinkingSystem au prochain tour.
5. Le système de planification des objectifs (si l’agent a des objectifs) évalue périodiquement les objectifs de l’agent. Si l’un des objectifs de l’agent à ce moment est “obtenir une arme puissante” et détecte que l’Épée Magique a été obtenue, l’objectif peut être marqué comme terminé. Si de nouveaux changements surviennent (par exemple, “un nouvel objet apparaît dans la pièce” affecte l’objectif poursuivi par l’agent?), générer un nouvel objectif ou abandonner l’ancien objectif en fonction de la détection des changements significatifs.
6. Le système de planification (s’il y a un objectif associé) vérifie s’il est nécessaire de créer un nouveau plan ou de mettre à jour un plan existant pour les objectifs terminés ou nouvellement générés tels que «Obtenir des armes puissantes».
Si terminé, définissez le Plan associé [status] sur “terminé”, ou générez plus d’étapes si le but est d’élargir le processus ultérieur (“Recherchez l’Épée Magique”).
7.RoomSystem met à jour la liste des occupants et des entités visibles dans la salle (100) (à chaque image ou tour).
Si l’apparence de l’agent(1) change (par exemple, Appearance.currentAction = “tenant une épée”), créez un nouveau stimulus visuel “apparence” pour permettre à l’agent2 et à l’agent3 dans la même pièce de savoir que “l’agent1 a ramassé l’épée”.
8.CleanupSystem supprime les entités ou stimuli qui ont été marqués (Nettoyage). Si vous n’avez plus besoin de conserver le stimulus “MagicSword” après l’avoir ramassé, vous pouvez supprimer l’entité de stimulus correspondante dans CleanupSystem.
• Percevoir les changements dans l’environnement (Perception) → Enregistrer ou transformer en expérience interne (Expérience) → Auto-réflexion et prise de décision (Réflexion) → Mettre en action (Action) → Ajuster dynamiquement les objectifs et les plans (Planification des objectifs + Planification) → Synchroniser l’environnement (Salle) → Recycler en temps opportun les entités inutiles (Nettoyage)
Dans ECS, chaque entité peut avoir plusieurs composants. Selon leur nature et leur cycle de vie dans le système, les composants peuvent être grossièrement divisés en les catégories suivantes:
1. Classes d’identité de base (composants au niveau de l’identité)
• Profil de l’Agent / du Joueur / du PNJ, etc.
• Utilisé pour identifier de manière unique des entités, stocker des rôles principaux ou des informations sur les unités, et généralement besoin d’être persisté dans la base de données.
2. Composants de comportement et d’état
• Action, Goal, Plan, État de traitement, etc.
• Représente ce que l’entité essaie actuellement de faire ou quels sont ses objectifs, ainsi que son statut de réponse aux commandes externes et à la réflexion interne.
• Contient pendingAction, goalsInProgress, plans et réflexions ou tâches en attente, etc.
• Typiquement des états à moyen/ court terme, nombreux changeant dynamiquement au fil des rounds de jeu ou des cycles d’affaires.
• Que la mise en stock soit nécessaire dépend de la situation. Si vous souhaitez continuer à exécuter après un point d’arrêt, vous pouvez écrire dans la base de données périodiquement.
3. Composants de perception & mémoire
• Perception, Memory, Stimulus, Experience, etc.
• Enregistre les informations externes (stimuli) perçues par l’entité et les expériences raffinées en elle après la perception (expériences).
• La mémoire peut souvent accumuler de grandes quantités de données, telles que des enregistrements de conversations, l’historique des événements, etc.; la persistance est souvent requise.
• La perception peut être une information en temps réel ou temporaire, principalement valable à court terme. Vous pouvez décider de l’écrire dans la base de données en fonction de vos besoins (par exemple, seuls les événements de perception importants sont stockés).
4. Classes d’environnement et d’espace (Salle, OccupiesRoom, Spatial, Environnement, Inventaire, etc.)
• Représente des informations telles que les chambres, les environnements, les emplacements, les conteneurs d’objets, etc.
•Room.id, Les champs OccupiesRoom, Environment et autres doivent souvent être persistés, tels que la description de la page d’accueil de la chambre, la structure de la carte, etc.
• Le changement de composants (comme le déplacement d’une entité entre les pièces) peut être écrit de manière événementielle ou périodique.
5. Classes d’apparence et d’interaction (Apparence, État de l’interface utilisateur, Relation, etc.)
• Enregistrer les parties externes «visibles» ou «interactives» de l’entité, telles que l’avatar, la pose, l’expression faciale, le réseau de relations sociales avec d’autres entités, etc.
• Certaines parties peuvent être traitées uniquement en mémoire (représentation en temps réel), tandis que d’autres parties (comme les relations sociales clés) peuvent être persistées.
6. Composants d’utilité et de maintenance (Nettoyage, DebugInfo, ProfilingData, etc.)
• Utilisé pour marquer les entités à recycler (Nettoyage), ou enregistrer les informations de débogage (InfosDebug) à utiliser dans la surveillance et l’analyse.
• Généralement, il n’existe qu’en mémoire et n’est que rarement synchronisé avec la base de données, sauf si cela est nécessaire pour l’enregistrement ou l’audit.
Déjà présenté ci-dessus
Outre les composants et les systèmes, une couche de gestion des ressources supplémentaire est requise. Cette couche gère l’accès à la base de données, les conflits d’état et d’autres opérations essentielles.
Côté gauche : Systèmes (PerceptionSystem, ExperienceSystem, ThinkingSystem, etc.) :
• Chaque système est programmé pour être exécuté par SimulationRuntime dans la boucle ECS, interrogeant et traitant les entités qui l’intéressent (à travers des conditions de composants).
• Lors de l’exécution de la logique, vous devez interagir avec les gestionnaires, par exemple :
Côté droit: Managers (EventBus, RoomManager, StateManager, EventManager, ActionManager, PromptManager, etc):
• Fournir des fonctions de niveau système, qui ne « pilotent » pas activement la logique, mais qui sont appelées par les systèmes ou l’exécution.
• Exemples typiques :
• Est l’”ordonnanceur” de tous les systèmes, lançant ou arrêtant les cycles du système à différents niveaux (conscient/subconscient, etc.);
• Les gestionnaires sont également créés pendant la phase de construction et transmis à chaque système pour utilisation.
• Notez en particulier qu’il interagit également avec ComponentSync (CS), qui est utilisé pour supprimer de manière synchrone les composants ou les abonnements aux événements lors du recyclage des entités.
En conclusion:
Chaque système lira et écrira des données ou appellera des services via le gestionnaire correspondant lorsque cela est nécessaire, et le runtime planifiera uniformément le cycle de vie et le comportement de tous les systèmes et gestionnaires à un niveau supérieur.
Dans un système ECS, les systèmes gèrent l’exécution logique réelle, tandis que les opérations de base de données (lecture/écriture) sont gérées via un gestionnaire de persistance (PersistenceManager / DatabaseManager) ou un gestionnaire d’état (StateManager). Le processus général est le suivant :
• StateManager / PersistenceManager charge les données des composants de persistance principaux tels que les Agents, les Salles, les Objectifs, etc. à partir de la base de données, crée les entités correspondantes (Entités) et initialise les champs de composants associés.
• Par exemple, lisez un lot d’enregistrements d’agents et insérez-les dans le monde ECS, et initialisez pour eux les composants Agent, Memory, Goal et autres.
2.Runtime ECS (Boucle de mise à jour des systèmes)
• Le système effectue des actions à chaque frame (ou tour) : PerceptionSystem collecte des « perceptions » et les écrit dans le composant Perception (principalement à court terme hors de la bibliothèque).
ExperienceSystem écrit la nouvelle « expérience cognitive » dans Memory.experiences. S’il s’agit d’une expérience clé, il peut également appeler StateManager pour un stockage immédiat, ou la marquer avec « needsPersistence » pour une écriture ultérieure en lot.
ThinkingSystem / ActionSystem / GoalPlanningSystem, etc., prennent des décisions basées sur le contenu des composants et mettent à jour les champs dans ECS.
Si certains composants (comme Goal.current) subissent des changements majeurs et nécessitent une persistance (comme un nouvel objectif à long terme), informez le StateManager d’écrire ce champ dans la base de données via l’écoute des composants ou des événements système.
3. Persistance périodique ou déclenchée par un événement
• Vous pouvez appeler des interfaces telles que PersistenceManager.storeComponentData(eid, “Goal”) pour supprimer la bibliothèque à certains points clés du système (comme lorsque le plan cible est mis à jour ou lorsqu’un événement important se produit sur l’Agent).
• Vous pouvez également demander à StateManager de scanner les composants ou entités avec l’étiquette “needsPersistence” dans CleanupSystem ou timer, et de les écrire une fois dans la base de données.
• De plus, les données de journalisation ou d’audit (telles que l’historique des actions, le journal des pensées) peuvent également être archivées et stockées ici.
4. Sauvegarde manuelle ou arrêt (Checkpointing et persistance à la sortie)
• Lorsque le serveur ou le processus doit être arrêté, utilisez StateManager.saveAll() pour écrire les données non écrites de manière uniforme dans la base de données afin de garantir que l’état de l’ECS peut être restauré la prochaine fois qu’il est chargé.
• Pour certains scénarios autonomes/hors ligne, les archives peuvent également être déclenchées manuellement.
Ce qui suit est un scénario simple pour démontrer les façons possibles dont les composants et les bases de données interagissent :
1.Phase de démarrage: StateManager.queryDB(“SELECT * FROM agents”) → Obtenir un lot d’enregistrements d’agent, créer une entité (EID=x) pour chaque enregistrement à tour de rôle, et initialiser les champs de l’agent, de la mémoire, des objectifs et d’autres composants.
En même temps, chargez les informations de la chambre à partir de la table “rooms” et créez une entité Room.
2. Opérations d’exécution : PerceptionSystem détecte l’événement ‘MagicSword appears’ dans une certaine pièce et écrit Perception.currentStimuli[eid].ExperienceSystem convertit les Stimuli en Expérience et l’attribue à Memory.experiences[eid].ThinkingSystem détermine la prochaine action en se basant sur la mémoire, les objectifs et d’autres informations et génère Action.pendingAction[eid].Après l’exécution de l’action par ActionSystem, le résultat est écrit dans Memory ou dans Action.lastActionResult. Si c’est un événement important pour l’intrigue, la dernière partie de Memory.experiences[eid] sera marquée comme ayant besoin de Persistence.Après un certain temps, StateManager trouve que Memory.experiences[eid] a besoin de Persistence et l’écrit dans la base de données (INSERT INTO memory_experiences…).
3. Arrêt ou sauvegarde de la checkpoint : Basé sur l’ECS ou la planification système, StateManager.saveAll() est appelé lorsque le « serveur est arrêté » pour écrire le dernier état des champs de composants clés (Agent, Memory, Goal, etc.) encore en mémoire dans la base de données. La prochaine fois que vous redémarrez, l’état du monde ECS peut être chargé et restauré à partir de la base de données.
• La catégorisation des composants facilite non seulement la gestion claire des données d’entité dans le projet, mais nous aide également à contrôler les limites de données entre “nécessite une persistance” et “existe uniquement en mémoire”.
• L’interaction avec la base de données est généralement gérée par un gestionnaire spécialisé (tel que StateManager), et les systèmes opèrent à travers lui lorsqu’ils ont besoin de lire et d’écrire dans la base de données, évitant d’écrire directement des instructions SQL ou similaires de bas niveau dans le système.
• De cette manière, vous pouvez simultanément profiter de l’efficacité logique et de la flexibilité de ECS, ainsi que des avantages de la persistance, de la reprise après pause et de l’analyse statistique des données apportées par la base de données.
Les points forts de l’ensemble de l’architecture sont:
Comme indiqué ci-dessous :
En même temps, si vous souhaitez ajouter de nouvelles fonctions pendant le processus de développement, cela n’aura aucun impact sur les autres systèmes et vous pourrez facilement charger les fonctions souhaitées.
De mon point de vue personnel, il s’agit d’un cadre extrêmement modulaire avec d’excellentes performances. La qualité du code est également très élevée et contient de bons documents de conception. Malheureusement, Project89 a manqué de visibilité et de promotion pour ce cadre, c’est pourquoi j’ai passé quatre jours à écrire cet article pour mettre en évidence ses points forts. Je crois que les grandes technologies méritent une reconnaissance, et demain, je prévois de publier une version anglaise de cet article pour sensibiliser les équipes de jeu et les développeurs de DeFi (finance décentralisée). Espérons que plus d’équipes exploreront ce cadre comme choix d’architecture potentiel pour leurs projets!
Transférer le titre original : Je vois le cadre d’agent de la prochaine génération dans le projet89
Pour aller droit au but, @project_89adopte une approche entièrement nouvelle pour concevoir un cadre d’agent. Il s’agit d’un cadre d’agent haute performance spécifiquement pour le développement de jeux. Par rapport aux cadres d’agent actuellement utilisés, il est plus modulaire et offre de meilleures performances.
Cet article a pris beaucoup de temps à rédiger, essayant de permettre à tous de comprendre quelles mises à niveau architecturales ce framework a apportées par rapport au framework Agent traditionnel. Il a été révisé plusieurs fois avant cette version, mais il y a encore des parties de l’article qui sont trop confuses. En raison de difficultés techniques, je n’ai pas pu le populariser davantage. Si vous avez des suggestions pour améliorer l’article, veuillez laisser vos commentaires.
Étant donné que c’est un blog technique, regardons d’abord l’expertise technique du fondateur.
Avant de travailler sur le Projet89, le fondateur a développé ce projet : https://github.com/Oneirocom/Magick, qui est également un logiciel de programmation alimenté par l’IA. De plus, Shaw est classé quatrième développeur de ce projet. Vous pouvez également voir ce projet dans le portefeuille de Shaw.
En haut à gauche: le fondateur de project89; En bas à droite: ‘lalaune’ est Shaw d’ai16z
Aujourd’hui, nous allons principalement présenter le Framework Agent haute performance dans le projet89 :
https://github.com/project-89/argOS
Du point de vue de l’application dans le domaine des jeux
Les jeux utilisant actuellement l’architecture ECS comprennent :
Jeux blockchain : Mud, Dojo
Jeux traditionnels : Overwatch, Star Citizen, etc.
De plus, les moteurs de jeu grand public évoluent vers une architecture ECS, tels que Unity.
ECS (Entity-Component-System) est un modèle architectural couramment utilisé dans le développement de jeux et les systèmes de simulation. Il sépare complètement les données et la logique pour gérer efficacement les différentes entités et leurs comportements dans des scénarios à grande échelle et évolutifs :
Entité
• Juste un identifiant (numéro ou chaîne de caractères), ne contenant aucune donnée ou logique.
• Vous pouvez monter différents composants pour lui donner différentes propriétés ou capacités selon les besoins.
Composant
• Utilisé pour stocker des données spécifiques ou l’état d’une entité.
Système
• Responsable de l’exécution de la logique liée à certains composants.
Utilisons un exemple spécifique d’action de l’Agent pour comprendre ce système :
Dans ArgOS, chaque Agent est considéré comme une Entité, qui peut enregistrer différents composants. Par exemple, dans l’image ci-dessous, notre Agent a les quatre composants suivants :
Composant Agent: stocke principalement des informations de base telles que le nom de l’Agent, le nom du modèle, etc.
Composant de perception : principalement utilisé pour stocker les données externes perçues
Composant de mémoire : principalement utilisé pour stocker les données de mémoire de l’entité agent, les choses similaires qui ont été réalisées, etc.
Composant d’action : Stocke principalement les données d’action à exécuter
Flux de travail du système :
Ensuite, nous obtenons une Entité d’Agent de Mise à Jour dans laquelle chaque donnée de Composant est mise à jour.
4. Donc, nous pouvons voir que le système ici est principalement responsable de définir quelles composantes exécutent la logique de traitement correspondante.
Et il est évident que dans project89, c’est un monde rempli de différents types d’Agents. Par exemple, certains Agents ont non seulement les capacités de base mentionnées ci-dessus, mais ont également la capacité de faire des plans.
Alors ce sera comme indiqué sur l’image ci-dessous :
Cependant, contrairement aux frameworks traditionnels où un système déclenche directement un autre (par exemple, le système de perception appelant le système de mémoire), dans le Projet89, les systèmes ne s’appellent pas directement les uns les autres. Au lieu de cela, chaque système s’exécute indépendamment à des intervalles de temps fixes. Par exemple :
Jusqu’à présent, cet article a considérablement simplifié l’architecture d’ArgOS pour la rendre plus facile à comprendre. Maintenant, examinons de plus près le véritable système ArgOS.
Afin de permettre à l’Agent de réfléchir plus profondément et d’accomplir des tâches plus complexes, ArgOS a conçu de nombreux Composants et de nombreux Systèmes.
Et ArgOS divise le système en “trois niveaux” (Niveau de conscience):
1) système CONSCIENT
2) Système Subconscient (SUBCONSCIENT)
3) Système inconscient (INCONSCIOUS)
Par conséquent, dans ArgOS, différents systèmes sont divisés en fonction du niveau de conscience pour stipuler à quelle fréquence ce système sera exécuté.
Pourquoi est-il conçu de cette manière?
Parce que la relation entre les différents systèmes dans ArgOS est extrêmement complexe, comme le montre ci-dessous :
Déterminer si le stimulus change de manière significative et mettre à jour en conséquence en fonction de la stabilité, du mode de traitement (ACTIF/RÉFLECTIF/EN ATTENTE), etc.
En fin de compte, des données de « perception actuelle » sont fournies pour les systèmes ultérieurs d’expérience, de réflexion, etc.
2.ExperienceSystem convertit les stimuli collectés par PerceptionSystem en une « expérience » plus abstraite.
La logique LLM ou règle (extractExperiences) est appelée pour identifier de nouvelles expériences et les stocker dans le composant Memory.
Dédoublonnez, filtrez et vérifiez les expériences, tout en déclenchant des événements «expérience» vers d’autres systèmes ou des écouteurs externes via eventBus.
3. ThinkingSystem représente le processus de réflexion interne de l’agent.
Extraire l’état actuel des composants tels que la Mémoire et la Perception, et générer le “ThoughtResult” grâce à la génération de la pensée (…) et à la logique LLM/règle.
En fonction du résultat de la réflexion, cela peut :
• Mettre à jour les pensées dans la mémoire (historique des réflexions).
• Déclencher une nouvelle action (mettre dans Action.pendingAction[eid]).
• Modifier l’apparence externe de l’agent (expression, posture, etc.) et générer des stimuli connexes pour permettre à d’autres entités de «voir» le changement.
4. Le système d’action exécute des actions siAction.pendingActionn’est pas vide, en utilisantruntime.getActionManager().executeAction(…).
Après l’exécution, écrivez le résultat dans Action.lastActionResult et notifiez la salle ou d’autres entités.
Cela produit également un CognitiveStimulus (stimulation cognitive) de sorte que les systèmes ultérieurs ‘sachent’ que l’action a été achevée, ou peut être incorporée dans la mémoire.
5.GoalPlanningSystem évalue périodiquement la progression des objectifs de la liste Goal.current[eid] ou vérifie la mémoire externe/propre pour détecter les changements significatifs (detectSignificant Changes).
Lorsqu’un nouvel objectif ou un ajustement d’objectif est requis, générer et écrire Goal.current[eid] via generateGoals(…).
En même temps, l’objectif en cours (in_progress) est mis à jour. Si les conditions de réussite ou d’échec sont remplies, le statut est modifié et un signal de réussite/échec est envoyé au Plan correspondant.
6.PlanningSystem génère ou met à jour le plan (plan d’exécution) pour le “but existant” (Goal.current[eid]).
S’il est détecté que certains objectifs n’ont pas de plans actifs correspondants, générer une feuille de route d’exécution contenant plusieurs étapes via generatePlan(…) et l’écrire dans Plan.plans[eid].
Lorsque l’objectif est atteint ou échoué, le statut du plan associé sera également mis à jour et une stimulation cognitive correspondante sera générée.
7. Le système de gestion des chambres gère les mises à jour liées aux chambres:
• Obtenir la liste des occupants de la chambre (occupants) et générer des stimuli “d’apparence” pour chaque agent afin de permettre à d’autres entités de “voir” son apparence ou ses actions.
• Créez et corrélez les stimuli de l’environnement de la pièce (par exemple, des informations appropriées sur l’« ambiance de la pièce »).
Veillez à ce que lorsque l’Agent se trouve dans un certain environnement spatial, d’autres entités qui perçoivent l’espace puissent percevoir des changements dans son apparence.
8.CleanupSystem trouve périodiquement et supprime les entités marquées avec le composant Cleanup. Utilisé pour recycler les Stimulus ou d’autres objets qui ne sont plus nécessaires afin d’éviter qu’un grand nombre d’entités invalides ne restent dans ECS.
L’exemple de scène suivant montre comment chaque système coopère pour compléter un processus complet en une seule ronde (ou plusieurs images).
Préparation de la scène : Il y a un Agent (EID=1) dans le Monde, qui est dans l’état “Actif” et est dans une Pièce (EID=100).
Une nouvelle propriété “MagicSword” est apparue dans cette pièce, et le stimulus correspondant a été généré.
« J’ai vu la MagicSword, peut-être la prendre et voir ce qu’elle peut faire… » Le résultat de la réflexion contient une Action à exécuter: {outil: « pickUpItem », paramètres: {nom de l’article: « MagicSword »}}
ThinkingSystem écrit cette Action à Action.pendingAction[1].
Si il y a un changement d’apparence (par exemple, “visage avec une expression curieuse”), l’apparence est mise à jour et une stimulation visuelle est générée.
4. ActionSystem voit Action.pendingAction[1] = { outil : “pickUpItem”, paramètres : … }.
Exécutez la logique de l’action “pickup” via runtime.getActionManager().executeAction(“pickUpItem”, 1, { nomObjet: “MagicSword” }, runtime). Obtenez le résultat : { success: true, message: “Vous avez ramassé l’épée magique” }, mettez à jour Action.lastActionResult[1] et déclenchez l’événement “action” à diffuser dans la salle (100).
En même temps, un stimulus cognitif (type=”action_result”) est généré, écrit dans la mémoire ou capturé par ThinkingSystem au prochain tour.
5. Le système de planification des objectifs (si l’agent a des objectifs) évalue périodiquement les objectifs de l’agent. Si l’un des objectifs de l’agent à ce moment est “obtenir une arme puissante” et détecte que l’Épée Magique a été obtenue, l’objectif peut être marqué comme terminé. Si de nouveaux changements surviennent (par exemple, “un nouvel objet apparaît dans la pièce” affecte l’objectif poursuivi par l’agent?), générer un nouvel objectif ou abandonner l’ancien objectif en fonction de la détection des changements significatifs.
6. Le système de planification (s’il y a un objectif associé) vérifie s’il est nécessaire de créer un nouveau plan ou de mettre à jour un plan existant pour les objectifs terminés ou nouvellement générés tels que «Obtenir des armes puissantes».
Si terminé, définissez le Plan associé [status] sur “terminé”, ou générez plus d’étapes si le but est d’élargir le processus ultérieur (“Recherchez l’Épée Magique”).
7.RoomSystem met à jour la liste des occupants et des entités visibles dans la salle (100) (à chaque image ou tour).
Si l’apparence de l’agent(1) change (par exemple, Appearance.currentAction = “tenant une épée”), créez un nouveau stimulus visuel “apparence” pour permettre à l’agent2 et à l’agent3 dans la même pièce de savoir que “l’agent1 a ramassé l’épée”.
8.CleanupSystem supprime les entités ou stimuli qui ont été marqués (Nettoyage). Si vous n’avez plus besoin de conserver le stimulus “MagicSword” après l’avoir ramassé, vous pouvez supprimer l’entité de stimulus correspondante dans CleanupSystem.
• Percevoir les changements dans l’environnement (Perception) → Enregistrer ou transformer en expérience interne (Expérience) → Auto-réflexion et prise de décision (Réflexion) → Mettre en action (Action) → Ajuster dynamiquement les objectifs et les plans (Planification des objectifs + Planification) → Synchroniser l’environnement (Salle) → Recycler en temps opportun les entités inutiles (Nettoyage)
Dans ECS, chaque entité peut avoir plusieurs composants. Selon leur nature et leur cycle de vie dans le système, les composants peuvent être grossièrement divisés en les catégories suivantes:
1. Classes d’identité de base (composants au niveau de l’identité)
• Profil de l’Agent / du Joueur / du PNJ, etc.
• Utilisé pour identifier de manière unique des entités, stocker des rôles principaux ou des informations sur les unités, et généralement besoin d’être persisté dans la base de données.
2. Composants de comportement et d’état
• Action, Goal, Plan, État de traitement, etc.
• Représente ce que l’entité essaie actuellement de faire ou quels sont ses objectifs, ainsi que son statut de réponse aux commandes externes et à la réflexion interne.
• Contient pendingAction, goalsInProgress, plans et réflexions ou tâches en attente, etc.
• Typiquement des états à moyen/ court terme, nombreux changeant dynamiquement au fil des rounds de jeu ou des cycles d’affaires.
• Que la mise en stock soit nécessaire dépend de la situation. Si vous souhaitez continuer à exécuter après un point d’arrêt, vous pouvez écrire dans la base de données périodiquement.
3. Composants de perception & mémoire
• Perception, Memory, Stimulus, Experience, etc.
• Enregistre les informations externes (stimuli) perçues par l’entité et les expériences raffinées en elle après la perception (expériences).
• La mémoire peut souvent accumuler de grandes quantités de données, telles que des enregistrements de conversations, l’historique des événements, etc.; la persistance est souvent requise.
• La perception peut être une information en temps réel ou temporaire, principalement valable à court terme. Vous pouvez décider de l’écrire dans la base de données en fonction de vos besoins (par exemple, seuls les événements de perception importants sont stockés).
4. Classes d’environnement et d’espace (Salle, OccupiesRoom, Spatial, Environnement, Inventaire, etc.)
• Représente des informations telles que les chambres, les environnements, les emplacements, les conteneurs d’objets, etc.
•Room.id, Les champs OccupiesRoom, Environment et autres doivent souvent être persistés, tels que la description de la page d’accueil de la chambre, la structure de la carte, etc.
• Le changement de composants (comme le déplacement d’une entité entre les pièces) peut être écrit de manière événementielle ou périodique.
5. Classes d’apparence et d’interaction (Apparence, État de l’interface utilisateur, Relation, etc.)
• Enregistrer les parties externes «visibles» ou «interactives» de l’entité, telles que l’avatar, la pose, l’expression faciale, le réseau de relations sociales avec d’autres entités, etc.
• Certaines parties peuvent être traitées uniquement en mémoire (représentation en temps réel), tandis que d’autres parties (comme les relations sociales clés) peuvent être persistées.
6. Composants d’utilité et de maintenance (Nettoyage, DebugInfo, ProfilingData, etc.)
• Utilisé pour marquer les entités à recycler (Nettoyage), ou enregistrer les informations de débogage (InfosDebug) à utiliser dans la surveillance et l’analyse.
• Généralement, il n’existe qu’en mémoire et n’est que rarement synchronisé avec la base de données, sauf si cela est nécessaire pour l’enregistrement ou l’audit.
Déjà présenté ci-dessus
Outre les composants et les systèmes, une couche de gestion des ressources supplémentaire est requise. Cette couche gère l’accès à la base de données, les conflits d’état et d’autres opérations essentielles.
Côté gauche : Systèmes (PerceptionSystem, ExperienceSystem, ThinkingSystem, etc.) :
• Chaque système est programmé pour être exécuté par SimulationRuntime dans la boucle ECS, interrogeant et traitant les entités qui l’intéressent (à travers des conditions de composants).
• Lors de l’exécution de la logique, vous devez interagir avec les gestionnaires, par exemple :
Côté droit: Managers (EventBus, RoomManager, StateManager, EventManager, ActionManager, PromptManager, etc):
• Fournir des fonctions de niveau système, qui ne « pilotent » pas activement la logique, mais qui sont appelées par les systèmes ou l’exécution.
• Exemples typiques :
• Est l’”ordonnanceur” de tous les systèmes, lançant ou arrêtant les cycles du système à différents niveaux (conscient/subconscient, etc.);
• Les gestionnaires sont également créés pendant la phase de construction et transmis à chaque système pour utilisation.
• Notez en particulier qu’il interagit également avec ComponentSync (CS), qui est utilisé pour supprimer de manière synchrone les composants ou les abonnements aux événements lors du recyclage des entités.
En conclusion:
Chaque système lira et écrira des données ou appellera des services via le gestionnaire correspondant lorsque cela est nécessaire, et le runtime planifiera uniformément le cycle de vie et le comportement de tous les systèmes et gestionnaires à un niveau supérieur.
Dans un système ECS, les systèmes gèrent l’exécution logique réelle, tandis que les opérations de base de données (lecture/écriture) sont gérées via un gestionnaire de persistance (PersistenceManager / DatabaseManager) ou un gestionnaire d’état (StateManager). Le processus général est le suivant :
• StateManager / PersistenceManager charge les données des composants de persistance principaux tels que les Agents, les Salles, les Objectifs, etc. à partir de la base de données, crée les entités correspondantes (Entités) et initialise les champs de composants associés.
• Par exemple, lisez un lot d’enregistrements d’agents et insérez-les dans le monde ECS, et initialisez pour eux les composants Agent, Memory, Goal et autres.
2.Runtime ECS (Boucle de mise à jour des systèmes)
• Le système effectue des actions à chaque frame (ou tour) : PerceptionSystem collecte des « perceptions » et les écrit dans le composant Perception (principalement à court terme hors de la bibliothèque).
ExperienceSystem écrit la nouvelle « expérience cognitive » dans Memory.experiences. S’il s’agit d’une expérience clé, il peut également appeler StateManager pour un stockage immédiat, ou la marquer avec « needsPersistence » pour une écriture ultérieure en lot.
ThinkingSystem / ActionSystem / GoalPlanningSystem, etc., prennent des décisions basées sur le contenu des composants et mettent à jour les champs dans ECS.
Si certains composants (comme Goal.current) subissent des changements majeurs et nécessitent une persistance (comme un nouvel objectif à long terme), informez le StateManager d’écrire ce champ dans la base de données via l’écoute des composants ou des événements système.
3. Persistance périodique ou déclenchée par un événement
• Vous pouvez appeler des interfaces telles que PersistenceManager.storeComponentData(eid, “Goal”) pour supprimer la bibliothèque à certains points clés du système (comme lorsque le plan cible est mis à jour ou lorsqu’un événement important se produit sur l’Agent).
• Vous pouvez également demander à StateManager de scanner les composants ou entités avec l’étiquette “needsPersistence” dans CleanupSystem ou timer, et de les écrire une fois dans la base de données.
• De plus, les données de journalisation ou d’audit (telles que l’historique des actions, le journal des pensées) peuvent également être archivées et stockées ici.
4. Sauvegarde manuelle ou arrêt (Checkpointing et persistance à la sortie)
• Lorsque le serveur ou le processus doit être arrêté, utilisez StateManager.saveAll() pour écrire les données non écrites de manière uniforme dans la base de données afin de garantir que l’état de l’ECS peut être restauré la prochaine fois qu’il est chargé.
• Pour certains scénarios autonomes/hors ligne, les archives peuvent également être déclenchées manuellement.
Ce qui suit est un scénario simple pour démontrer les façons possibles dont les composants et les bases de données interagissent :
1.Phase de démarrage: StateManager.queryDB(“SELECT * FROM agents”) → Obtenir un lot d’enregistrements d’agent, créer une entité (EID=x) pour chaque enregistrement à tour de rôle, et initialiser les champs de l’agent, de la mémoire, des objectifs et d’autres composants.
En même temps, chargez les informations de la chambre à partir de la table “rooms” et créez une entité Room.
2. Opérations d’exécution : PerceptionSystem détecte l’événement ‘MagicSword appears’ dans une certaine pièce et écrit Perception.currentStimuli[eid].ExperienceSystem convertit les Stimuli en Expérience et l’attribue à Memory.experiences[eid].ThinkingSystem détermine la prochaine action en se basant sur la mémoire, les objectifs et d’autres informations et génère Action.pendingAction[eid].Après l’exécution de l’action par ActionSystem, le résultat est écrit dans Memory ou dans Action.lastActionResult. Si c’est un événement important pour l’intrigue, la dernière partie de Memory.experiences[eid] sera marquée comme ayant besoin de Persistence.Après un certain temps, StateManager trouve que Memory.experiences[eid] a besoin de Persistence et l’écrit dans la base de données (INSERT INTO memory_experiences…).
3. Arrêt ou sauvegarde de la checkpoint : Basé sur l’ECS ou la planification système, StateManager.saveAll() est appelé lorsque le « serveur est arrêté » pour écrire le dernier état des champs de composants clés (Agent, Memory, Goal, etc.) encore en mémoire dans la base de données. La prochaine fois que vous redémarrez, l’état du monde ECS peut être chargé et restauré à partir de la base de données.
• La catégorisation des composants facilite non seulement la gestion claire des données d’entité dans le projet, mais nous aide également à contrôler les limites de données entre “nécessite une persistance” et “existe uniquement en mémoire”.
• L’interaction avec la base de données est généralement gérée par un gestionnaire spécialisé (tel que StateManager), et les systèmes opèrent à travers lui lorsqu’ils ont besoin de lire et d’écrire dans la base de données, évitant d’écrire directement des instructions SQL ou similaires de bas niveau dans le système.
• De cette manière, vous pouvez simultanément profiter de l’efficacité logique et de la flexibilité de ECS, ainsi que des avantages de la persistance, de la reprise après pause et de l’analyse statistique des données apportées par la base de données.
Les points forts de l’ensemble de l’architecture sont:
Comme indiqué ci-dessous :
En même temps, si vous souhaitez ajouter de nouvelles fonctions pendant le processus de développement, cela n’aura aucun impact sur les autres systèmes et vous pourrez facilement charger les fonctions souhaitées.
De mon point de vue personnel, il s’agit d’un cadre extrêmement modulaire avec d’excellentes performances. La qualité du code est également très élevée et contient de bons documents de conception. Malheureusement, Project89 a manqué de visibilité et de promotion pour ce cadre, c’est pourquoi j’ai passé quatre jours à écrire cet article pour mettre en évidence ses points forts. Je crois que les grandes technologies méritent une reconnaissance, et demain, je prévois de publier une version anglaise de cet article pour sensibiliser les équipes de jeu et les développeurs de DeFi (finance décentralisée). Espérons que plus d’équipes exploreront ce cadre comme choix d’architecture potentiel pour leurs projets!