Reenviar Título Original: Veo el Marco de Agente de Próxima Generación en Project89
Para ir al grano, @project_89adopta un enfoque completamente nuevo para diseñar un Marco de Agente. Este es un Marco de Agente de alto rendimiento específicamente para el desarrollo de juegos. En comparación con los Marcos de Agente utilizados actualmente, es más modular y ofrece un mejor rendimiento.
Este artículo tomó mucho tiempo escribirlo, tratando de hacer que todos entiendan qué tipo de mejoras arquitectónicas ha realizado este marco en comparación con el marco tradicional del Agente. Ha sido revisado muchas veces antes de esta versión, pero todavía hay algunas partes en el artículo que son demasiado confusas. Debido a dificultades técnicas, no pude popularizarlo más. Si tienes alguna sugerencia para mejorar el artículo, por favor deja tus comentarios.
Antes de trabajar en el Proyecto89, el fundador desarrolló este proyecto:https://github.com/Oneirocom/Magick, que también es un software de programación impulsado por IA. Además, Shaw ocupa el cuarto lugar como desarrollador principal de este proyecto. También puedes ver este proyecto en el portafolio de Shaw.



Superior izquierda: el fundador de project89; Inferior derecha: 'lalaune' es Shaw de ai16z
Hoy presentaremos principalmente el Framework de Agente de alto rendimiento en project89:
https://github.com/project-89/argOS
Los juegos que actualmente utilizan la arquitectura ECS incluyen:
Juegos de blockchain: Mud, Dojo
Juegos tradicionales: Overwatch, Star Citizen, etc.
Además, los motores de juego principales están evolucionando hacia la arquitectura ECS, como Unity.
Entidad
• Solo un ID (número o cadena), sin contener datos ni lógica.
• Puede montar diferentes componentes para darle diversas propiedades o capacidades según sea necesario.
Componente
• Utilizado para almacenar datos específicos o el estado de una entidad.
Sistema
• Responsable de ejecutar la lógica relacionada con ciertos componentes.
Usemos un ejemplo específico de la acción del Agente para entender este sistema:
En ArgOS, cada Agente es considerado como una Entidad, la cual puede registrar diferentes componentes. Por ejemplo, en la imagen de abajo, nuestro Agente tiene los siguientes cuatro componentes:
Componente del Agente: almacena principalmente información básica como el nombre del Agente, el nombre del modelo, etc.
Componente de Percepción: Principalmente utilizado para almacenar datos externos percibidos
Componente de memoria: Principalmente utilizado para almacenar los datos de memoria de la Entidad Agente, cosas similares que se hayan hecho, etc.
Componente de Acción: Almacena principalmente los datos de Acción a ejecutar
Flujo de trabajo del sistema:

Y es obvio que en el proyecto89 es un mundo lleno de varios tipos de Agentes. Por ejemplo, algunos Agentes no solo tienen las habilidades básicas mencionadas anteriormente, sino que también tienen la capacidad de hacer planes.
Luego se mostrará como se muestra en la imagen a continuación:

Y ArgOS divide System en "tres niveles" (ConsciousnessLevel):
Incluye RoomSystem, PerceptionSystem, ExperienceSystem, ThinkingSystem, ActionSystem, CleanupSystem)- La frecuencia de actualización suele ser más alta (como cada 10 segundos).- Procesamiento más cercano al nivel "en tiempo real" o "consciente", como la percepción ambiental, el pensamiento en tiempo real, la ejecución de acciones, etc.2) Sistema subconsciente (SUBCONSCIENTE)
Sistema de Planificación de Objetivos, Sistema de Planificación- La frecuencia de actualización es relativamente baja (por ejemplo, cada 25 segundos).- Maneja la lógica de "pensamiento", como verificar/generar periódicamente metas y planes.3) Sistema inconsciente (UNCONSCIOUS)
Todavía no habilitado- La frecuencia de actualización es más lenta (como más de 50 segundos),Por lo tanto, en ArgOS, los distintos Sistemas se dividen según el Nivel de Conciencia para estipular con qué frecuencia se ejecutará dicho Sistema.
¿Por qué está diseñado de esta manera?
Debido a que la relación entre varios sistemas en ArgOS es extremadamente compleja, como se muestra a continuación:

En última instancia, se proporcionan datos de "percepción actual" para el subsiguiente ExperienceSystem, ThinkingSystem, etc.
LLM o lógica de reglas (extractExperiences) se llama para identificar nuevas experiencias y almacenarlas en el componente de Memoria.
Deduplicar, filtrar y verificar experiencias, al tiempo que se activan eventos de "experiencia" en otros sistemas o escuchantes externos a través del eventBus.
Extrae el estado actual de componentes como la Memoria y la Percepción, y genera "ThoughtResult" a través de generateThought(...) y lógica LLM/regla.
Basado en el resultado del pensamiento, puede:
• Actualizar pensamientos en la Memoria (historial de pensamiento).
• Activar una nueva acción (colocar en Action.pendingAction[eid]).
• Cambiar la Apariencia externa del agente (expresión, postura, etc.) y generar Estímulos relacionados para que otras entidades puedan "ver" el cambio.
Después de la ejecución, escriba el resultado en Action.lastActionResult y notifique a la sala u otras entidades.
Esto también produce un EstímuloCognitivo (estimulación cognitiva) para que los sistemas posteriores “sepan” que la acción se ha completado o se pueda incorporar a la memoria.
Cuando se requiere una nueva meta o ajuste de meta, genere y escriba Goal.current[eid] a través de generateGoals(...)
Al mismo tiempo, el objetivo en progreso (in_progress) se actualiza. Si se cumplen las condiciones de finalización o fracaso, se cambia el estado y se envía una señal de finalización/fracaso al Plan correspondiente.
Si se detecta que algunos objetivos no tienen planes activos correspondientes, genere un plan de ejecución que contenga varios pasos a través de generatePlan(...) y escríbalo en Plan.plans[eid].
Cuando se completa o falla el objetivo, también se actualizará el estado del Plan asociado a él y se generará la estimulación cognitiva correspondiente.
7.RoomSystem maneja actualizaciones relacionadas con la habitación:
• Obtener la lista de ocupantes en la habitación (ocupantes) y generar estímulos de “apariencia” para cada agente para permitir que otras entidades “vean” su apariencia o acciones.
• Crear y correlacionar el estímulo del entorno de la habitación (por ejemplo, información adecuada sobre la "ambiente de la habitación").
Asegúrate de que cuando el Agente esté en un entorno espacial específico, otras entidades que estén sintiendo el espacio puedan percibir cambios en su apariencia.
8.CleanupSystem encuentra y elimina periódicamente entidades marcadas con el componente de limpieza. Se utiliza para reciclar Estímulo u otros objetos que ya no son necesarios para evitar que un gran número de entidades inválidas queden en ECS.
Preparación de la escena: Hay un Agente (EID=1) en el Mundo, que está en estado 'Activo' y se encuentra en una Habitación (EID=100).
Una nueva prop “MagicSword” apareció en esta Sala, y se generó el Estímulo correspondiente.
ThinkingSystem escribe esta Acción en Action.pendingAction[1].
Si hay un cambio en la apariencia (por ejemplo, 'cara con expresión curiosa'), se actualiza la Apariencia y se genera estimulación visual.
Ejecute la lógica de la acción 'pickup' a través de runtime.getActionManager().executeAction('pickUpItem', 1, { itemName: 'MagicSword' }, runtime). Obtenga el resultado: { success: true, message: 'Has recogido la espada mágica' }, actualice a Action.lastActionResult[1] y active el evento 'action' para que se transmita a la habitación (100).
Al mismo tiempo, se genera un estímulo cognitivo (type=”action_result”), se escribe en la Memoria o se captura por el ThinkingSystem en el siguiente turno.
El Sistema de Planificación de Objetivos (si el agente tiene objetivos) evalúa periódicamente los objetivos del agente. Si uno de los objetivos del agente en este momento es "obtener un arma poderosa" y detecta que se ha obtenido la Espada Mágica, el objetivo puede ser marcado como completado. Si ocurren cambios nuevos (por ejemplo, "aparece un nuevo objeto en la habitación") que afecten al objetivo perseguido por el agente, generar un nuevo objetivo o abandonar el objetivo antiguo según detecte cambios significativos. 6.PlanningSystem (si hay un objetivo relacionado) verifica si se requiere un nuevo Plan o se actualiza un Plan existente para objetivos completados o recién generados como "Obtener armas poderosas".Si se completa, establezca el Plan asociado [status] en "completado", o genere más pasos si el objetivo es expandir el proceso posterior ("Investigar la Espada Mágica").
RoomSystem actualiza la lista de ocupantes y entidades visibles en la habitación (100) (en cada fotograma o ronda).
Si la apariencia del agente (1) cambia (por ejemplo, Appearance.currentAction = “holding sword”), crea un nuevo estímulo visual de “apariencia” para que otros Agent2 y Agent3 en la misma habitación sepan que “el agente1 recogió la espada”.

• Agente / Perfil de jugador / Perfil de NPC, etc.
• Utilizado para identificar de manera única entidades, almacenar roles principales o información de unidades, y generalmente deben persistir en la base de datos.
2.Componentes de Comportamiento y Estado
• Acción, Objetivo, Plan, Estado de Procesamiento, etc.
• Representa lo que la entidad está intentando hacer o cuáles son sus objetivos actuales, así como su estado de respuesta a los comandos externos y el pensamiento interno.
• Contiene pendingAction, goalsInProgress, planes y pensamientos o tareas en la cola, etc.
• Normalmente estados a medio/corto plazo, muchos cambian dinámicamente a lo largo de las rondas del juego o ciclos comerciales.
• Si es necesario hacer inventario depende de la situación. Si desea continuar ejecutando después de un punto de interrupción, puede escribir en la base de datos periódicamente.
• Percepción, Memoria, Estímulo, Experiencia, etc.
• Registra la información externa (Estímulos) percibida por la entidad y las experiencias refinadas en ella después de la percepción (Experiencias).
• La memoria a menudo puede acumular grandes cantidades de datos, como registros de conversaciones, historial de eventos, etc.; a menudo se requiere persistencia.
• La percepción puede ser información en tiempo real o temporal, en su mayoría válida a corto plazo. Puedes decidir si escribirla en la base de datos según tus necesidades (por ejemplo, solo se almacenan eventos de percepción importantes).
• Representa información como habitaciones, entornos, ubicaciones, contenedores de objetos, etc.
•Room.id, Los campos de OcupaHabitación, Ambiente y otros a menudo necesitan ser persistidos, como la descripción de la página de inicio de la habitación, la estructura del mapa, etc.
• Cambiar componentes (como una Entidad que se mueve entre habitaciones) puede ser escrito evento a evento o periódicamente.
• Registrar las partes externas "visibles" o "interactivas" de la entidad, como Avatar, pose, expresión facial, red de relaciones sociales con otras entidades, etc.
• Algunas partes pueden ser procesadas solo en la memoria (representación en tiempo real), mientras que otras partes (como las relaciones sociales clave) pueden persistir.
6.Componentes de Utilidad y Mantenimiento (Limpieza, DebugInfo, Datos de Perfil, etc.)
• Se utiliza para marcar qué entidades deben ser recicladas (Cleanup), o para registrar información de depuración (DebugInfo) para su uso en monitoreo y análisis.
• Típicamente solo existe en memoria y rara vez se sincroniza con la base de datos a menos que sea necesario para el registro o la auditoría.

Lado izquierdo: Sistemas (Sistema de percepción, Sistema de experiencia, Sistema de pensamiento, etc.):
• Cada sistema está programado para su ejecución por SimulationRuntime en el bucle ECS, consultando y procesando las entidades de las que se preocupa (a través de condiciones de componentes).
• Al ejecutar la lógica, necesitas interactuar con los Managers, por ejemplo:
• Proporcionar funciones a nivel de sistema, que básicamente no "impulsan" activamente la lógica, sino que son llamadas por Systems o Runtime.
• Ejemplos típicos:
• Los gerentes también se crean durante la fase de construcción y se pasan a cada Sistema para su uso.
En conclusión:
Cada Sistema leerá y escribirá datos o llamará a los servicios a través del Manager correspondiente cuando sea necesario, y el Runtime programará uniformemente el ciclo de vida y el comportamiento de todos los Sistemas y Managers a un nivel superior.
• Por ejemplo, lea un lote de registros de agentes e insértelos en el mundo ECS, e inicialice el Agente, la Memoria, la Meta y otros componentes para ellos.
• El sistema hace cosas en cada fotograma (o ronda): PerceptionSystem recopila "percepciones" y las escribe en el componente Perception (principalmente a corto plazo fuera de la biblioteca).
ExperienceSystem escribe la nueva experiencia cognitiva en Memory.experiences. Si es una experiencia clave, también puede llamar a StateManager para su almacenamiento inmediato o marcarla con “needsPersistence” para su escritura en lotes posterior.
ThinkingSystem / ActionSystem / GoalPlanningSystem, etc. toman decisiones basadas en el contenido de los componentes y actualizan los campos en ECS.
Si algunos componentes (como Goal.current) experimentan cambios importantes y requieren persistencia (como un nuevo objetivo a largo plazo), notifique al StateManager para que escriba este campo en la base de datos a través de la escucha de componentes o eventos del sistema.
• Puede llamar a interfaces como PersistenceManager.storeComponentData(eid, “Goal”) para dejar la biblioteca en ciertos puntos clave del sistema (como cuando se actualiza el plan objetivo o cuando ocurre un evento importante en el Agente).
• También puede hacer que StateManager escanee componentes o entidades con la etiqueta “needsPersistence” en CleanupSystem o temporizador, y escribirlos de una sola vez en la base de datos.
• Además, los datos de registro o auditoría (como el historial de acciones, el registro de pensamientos) también se pueden archivar y almacenar aquí.
• Cuando el servidor o el proceso se van a apagar, use StateManager.saveAll() para escribir los datos no escritos en la base de datos de manera uniforme, asegurando que el estado del ECS pueda ser restaurado la próxima vez que se cargue.
• Para algunos escenarios independientes/desconectados, los archivos también se pueden activar manualmente.
Al mismo tiempo, cargar información de la habitación desde la tabla "rooms" y crear una entidad de Room.
Operaciones en tiempo de ejecución: PerceptionSystem detecta el evento 'aparición de MagicSword' en una cierta habitación y escribe Perception.currentStimuli[eid]. ExperienceSystem convierte los estímulos en Experiencia y los asigna a Memory.experiences[eid]. ThinkingSystem determina la próxima acción basada en Memory, Goal y otra información y genera Action.pendingAction[eid]. Después de que ActionSystem ejecuta la acción, escribe el resultado en Memory o Action.lastActionResult. Si este es un evento principal de la trama, la última parte de Memory.experiences[eid] se marcará como needsPersistence. Después de un tiempo, StateManager encuentra que Memory.experiences[eid] tiene 'needsPersistence' y lo escribe en la base de datos (INSERT INTO memory_experiences...).
Detener o guardar el punto de control: Basado en la programación de ECS o del sistema, se llama a StateManager.saveAll() cuando se "apaga el servidor" para escribir el estado más reciente de los campos de los componentes clave (Agente, Memoria, Objetivo, etc.) todavía en memoria en la base de datos. La próxima vez que se reinicie, el estado del mundo ECS se puede cargar y restaurar desde la base de datos.
• La categorización de componentes no solo facilita la gestión clara de los datos de la entidad en el proyecto, sino que también nos ayuda a controlar los límites de los datos entre "requiere persistencia" y "solo existe en memoria".
• La interacción con la base de datos generalmente la maneja un Manager especializado (como StateManager), y los Sistemas operan a través de él cuando necesitan leer y escribir en la base de datos, evitando escribir directamente SQL u otras declaraciones de bajo nivel en el Sistema.
• De esta manera, puedes disfrutar simultáneamente de la eficiencia lógica y la flexibilidad de ECS, así como de las ventajas de la persistencia, la reanudación de puntos de interrupción y el análisis estadístico de datos que ofrece la base de datos.

Los aspectos más destacados de toda la arquitectura son:

Al mismo tiempo, si desea agregar nuevas funciones durante el proceso de desarrollo, no tendrá ningún impacto en otros sistemas y podrá cargar fácilmente las funciones que desee.





