Encaminhar o Título Original: Vejo a Estrutura de Agente da Próxima Geração no Project89
Para ir direto ao ponto, @project_89adota uma abordagem completamente nova ao projetar um Framework de Agente. Este é um Framework de Agente de alto desempenho especificamente para o desenvolvimento de jogos. Comparado aos Frameworks de Agente atualmente utilizados, ele é mais modular e oferece melhor desempenho.
Este artigo levou muito tempo para ser escrito, tentando fazer com que todos entendam que tipo de atualizações arquitetônicas este framework fez em comparação ao tradicional framework do Agente. Ele foi revisado muitas vezes antes desta versão, mas ainda há algumas partes no artigo que são muito confusas. Devido a dificuldades técnicas, não consegui popularizá-lo ainda mais. Se você tiver alguma sugestão para melhorar o artigo, por favor deixe seus comentários.
Uma vez que este é um blog técnico, vamos primeiro dar uma olhada na experiência técnica do fundador.
Antes de trabalhar no Project89, o fundador desenvolveu este projeto:https://github.com/Oneirocom/Magick, que também é um software de programação com inteligência artificial. Além disso, Shaw está classificado como o quarto principal desenvolvedor deste projeto. Você também pode ver este projeto no portfólio de Shaw.
Superior esquerdo: o fundador do project89; Inferior direito: 'lalaune' é Shaw da ai16z
Hoje iremos principalmente apresentar o Framework de Agente de alto desempenho no projeto89:
https://github.com/project-89/argOS
Do ponto de vista da aplicação no campo de jogo
Os jogos que atualmente usam a arquitetura ECS incluem:
Jogos de blockchain: Mud, Dojo
Jogos tradicionais: Overwatch, Star Citizen, etc.
Além disso, os motores de jogos mainstream estão evoluindo em direção à arquitetura ECS, como Unity.
ECS (Entity-Component-System) é um padrão arquitetural comummente utilizado no desenvolvimento de jogos e sistemas de simulação. Separa completamente os dados e a lógica para gerir eficientemente várias entidades e seus comportamentos em cenários escaláveis em grande escala:
Entidade
• Apenas um ID (número ou string), sem dados ou lógica.
• Você pode montar diferentes componentes para dar-lhe várias propriedades ou capacidades conforme necessário.
Componente
• Usado para armazenar dados específicos ou estado de uma entidade.
Sistema
• Responsável pela execução da lógica relacionada a certos componentes.
Vamos usar um exemplo específico de ação do Agente para entender este sistema:
No ArgOS, cada Agente é considerado uma Entidade, que pode registar diferentes componentes. Por exemplo, na imagem abaixo, o nosso Agente tem os seguintes quatro componentes:
Componente do Agente: armazena principalmente informações básicas como nome do Agente, nome do modelo, etc.
Componente de Percepção: Principalmente utilizado para armazenar dados externos percebidos
Componente de Memória: Usado principalmente para armazenar os dados de memória da Entidade Agente, coisas semelhantes que já foram feitas, etc.
Componente de Ação: Armazena principalmente dados de Ação a serem executados
Fluxo do sistema:
Em seguida, obtemos uma Entidade de Agente de Atualização na qual cada dado do Componente é atualizado.
4.Assim, podemos ver que o Sistema aqui é principalmente responsável por definir quais Componentes executar a lógica de processamento correspondente.
E é óbvio que no projeto89 é um mundo cheio de vários tipos de Agents. Por exemplo, alguns Agents não só têm as habilidades básicas acima, mas também têm a capacidade de fazer planos.
Então ficará como mostrado na imagem abaixo:
No entanto, ao contrário dos frameworks tradicionais em que um sistema aciona diretamente outro (por exemplo, o Sistema de Percepção chamando o Sistema de Memória), no Project89, os sistemas não se chamam diretamente. Em vez disso, cada sistema é executado independentemente em intervalos de tempo fixos. Por exemplo:
Até agora, este artigo simplificou significativamente a arquitetura do ArgOS para torná-lo mais fácil de entender. Agora, vamos dar uma olhada mais de perto no sistema real do ArgOS.
Para permitir que o Agente pense mais profundamente e realize tarefas mais complexas, a ArgOS projetou muitos Componentes e muitos Sistemas.
E o ArgOS divide o Sistema em "três níveis" (ConsciousnessLevel):
1) sistema CONSCIOUS
2) Sistema Subconsciente (SUBCONSCIENTE)
3) Sistema inconsciente (INCONSCIENTE)
Portanto, no ArgOS, diferentes Sistemas são divididos de acordo com o Nível de Consciência para estipular com que frequência esse Sistema será executado.
Por que foi projetado dessa maneira?
Porque a relação entre vários sistemas em ArgOS é extremamente complexa, como mostrado abaixo:
Determine se o estímulo muda significativamente e atualize-o de acordo com a estabilidade, modo de processamento (ATIVO/REFLEXIVO/ESPERANDO), etc.
Em última análise, os dados de "percepção atual" são fornecidos para o subsequente ExperienceSystem, ThinkingSystem, etc.
2. O sistema de experiência converte os estímulos coletados pelo sistema de percepção em uma "experiência" mais abstrata.
LLM ou lógica de regras (extractExperiences) é chamado para identificar novas experiências e armazenado no componente de Memória.
Deduplicar, filtrar e verificar experiências, ao mesmo tempo que aciona eventos de “experiência” para outros sistemas ou ouvintes externos através do eventBus.
3. ThinkingSystem representa o processo de pensamento interno do agente.
Extrair o estado atual de componentes como Memória e Percepção e gerar “ThoughtResult” através de generateThought(…) e lógica LLM/regra.
Com base no resultado do pensamento, pode:
• Atualizar pensamentos na Memória (histórico de pensamento).
• Desencadear uma nova ação (colocar em Action.pendingAction[eid]).
• Alterar a Aparência externa do agente (expressão, postura, etc.) e gerar Estímulos relacionados para permitir que outras entidades "vejam" a mudança.
4. O sistema de ação executa ações seAção.pendentenão está vazio, usandoruntime.getActionManager().executeAction(…).
Após a execução, escreva o resultado de volta para Action.lastActionResult e notifique a sala ou outras entidades.
Isto também produz um Estímulo Cognitivo (estimulação cognitiva) para que sistemas subsequentes “saibam” que a ação foi concluída, ou possa ser incorporada à memória.
5. O Sistema de Planeamento de Objetivos avalia periodicamente o progresso dos objetivos na lista Goal.current[eid], ou verifica a memória externa/própria por alterações significativas (detectarAlteraçõesSignificativas).
Quando um novo objetivo ou ajuste de objetivo é necessário, gerar e escrever Goal.current[eid] através de generateGoals(…).
Ao mesmo tempo, o objetivo em progresso (in_progress) é atualizado. Se as condições de conclusão ou falha forem atendidas, o status é alterado e um sinal de conclusão/falha é enviado para o Plano correspondente.
6. O sistema de planeamento gera ou atualiza o Plano (plano de execução) para o "objetivo existente" (Goal.current[eid]).
Se for detetado que alguns objetivos não têm planos ativos correspondentes, gerar uma rota de execução contendo vários passos através de generatePlan(…) e escrevê-la em Plan.plans[eid].
Quando o objetivo for concluído ou falhado, o estado do Plano associado a ele também será atualizado e será gerada a estimulação cognitiva correspondente.
7. O RoomSystem lida com atualizações relacionadas ao quarto:
• Obter a lista de ocupantes no quarto (ocupantes) e gerar estímulos de “aparência” para cada agente para que outras entidades possam “ver” a sua aparência ou ações.
• Criar e correlacionar Estímulos do ambiente da sala (por exemplo, informações apropriadas sobre a "ambiente da sala").
Certifique-se de que, quando o Agente estiver em um ambiente espacial específico, outras entidades que estão sentido o espaço possam perceber mudanças em sua aparência.
8. O CleanupSystem encontra periodicamente e remove entidades marcadas com o componente de limpeza. Usado para reciclar estímulos ou outros objetos que não são mais necessários para evitar que um grande número de entidades inválidas fiquem na ECS.
O exemplo de cena a seguir mostra como cada sistema coopera para completar um processo completo em uma rodada (ou vários quadros).
Preparação da cena: Há um Agente (EID=1) no Mundo, que está no estado "Ativo" e está numa Sala (EID=100).
Uma nova prop "MagicSword" apareceu nesta sala e foi gerado o estímulo correspondente.
“Vi a MagicSword, talvez pegá-la e ver o que ela pode fazer…” O resultado do pensamento contém uma ação a ser executada: { ferramenta: “pegarItem”, parâmetros: { nomeDoItem: “MagicSword” } }
ThinkingSystem escreve esta Ação para Action.pendingAction[1].
Se houver uma mudança na aparência (por exemplo, 'rosto com expressão curiosa'), a Aparência é atualizada e é gerada estimulação visual.
4. O ActionSystem vê Action.pendingAction[1] = { ferramenta: "pickUpItem", parâmetros: ... }.
Execute a lógica de ação “pickup” através de runtime.getActionManager().executeAction(“pickUpItem”, 1, { itemName: “MagicSword” }, runtime). Obtenha o resultado: { success: true, message: “Você pegou a espada mágica” }, atualize para Action.lastActionResult[1] e ative o evento “action” para ser transmitido para a sala (100).
Ao mesmo tempo, um estímulo cognitivo (type=”action_result”) é gerado, escrito na Memória ou capturado pelo ThinkingSystem na próxima jogada.
5. O Sistema de Planeamento de Objetivos (se o agente tiver objetivos) avalia periodicamente os objetivos do agente. Se um dos objetivos do agente neste momento for "obter uma arma poderosa" e detetar que a Espada Mágica foi obtida, o objetivo pode ser marcado como concluído. Se ocorrerem novas mudanças (por exemplo, "novo objeto aparece na sala") que afetem o objetivo perseguido pelo agente, gera-se um novo objetivo ou abandona-se o objetivo antigo com base na deteção de mudanças significativas.
6.PlanningSystem (se houver um objetivo relacionado) verifica se é necessário um novo Plano ou se um Plano existente é atualizado para objetivos concluídos ou recém-gerados, como "Obter armas poderosas".
Se concluído, defina o Plano associado como [status] para “concluído”, ou gere mais etapas se o objetivo for expandir o processo subsequente (“Pesquisar a Espada Mágica”).
7. O sistema do quarto atualiza a lista de ocupantes e entidades visíveis no quarto (100) (a cada quadro ou rodada).
Se a aparência do agente(1) mudar (por exemplo, Appearance.currentAction = “segurando a espada”), crie um novo estímulo visual de “aparência” para que os Agentes 2 e 3 na mesma sala saibam que “o agente 1 pegou a espada”.
8.CleanupSystem remove entidades ou estímulos que foram marcados (Limpeza). Se já não precisar de manter o Estímulo “MagicSword” depois de o apanhar, pode eliminar a entidade de Estímulo correspondente em CleanupSystem.
• Perceber mudanças no ambiente (Percepção) → Registrar ou transformar em experiência interna (Experiência) → Auto-reflexão e tomada de decisão (Pensamento) → Colocar em ação (Ação) → Ajustar dinamicamente metas e planos (Planejamento de Metas + Planejamento) → Sincronizar o ambiente (Sala) → Reciclar entidades inúteis de forma oportuna (Limpeza)
Em ECS, cada entidade pode ter vários componentes. De acordo com sua natureza e ciclo de vida no sistema, os componentes podem ser grosseiramente divididos nas seguintes categorias:
1. Classes Principais de Identidade (Componentes de Nível de Identidade)
• Agente / Perfil do Jogador / Perfil do NPC, etc.
• Usado para identificar exclusivamente entidades, armazenar funções principais ou informações de unidades e geralmente precisam ser persistidos no banco de dados.
2. Componentes de Comportamento e Estado
• Ação, Objetivo, Plano, Estado de Processamento, etc.
• Representa o que a entidade está atualmente tentando fazer ou quais são seus objetivos, bem como seu status de resposta a comandos externos e pensamentos internos.
• Contém pendingAction, goalsInProgress, plans e pensamentos ou tarefas na fila, etc.
• Normalmente estados de médio/curto prazo, muitos mudando dinamicamente ao longo das rodadas do jogo ou ciclos de negócios.
• Se é necessário repor depende da situação. Se quiser continuar a executar após um ponto de interrupção, pode escrever periodicamente na base de dados.
3. Componentes de Perceção e Memória
• Percepção, Memória, Estímulo, Experiência, etc.
• Regista a informação externa (Estímulos) percebida pela entidade, e as experiências refinadas nela após a perceção (Experiências).
• A memória muitas vezes pode acumular grandes quantidades de dados, como registros de conversas, histórico de eventos, etc.; a persistência é frequentemente necessária.
• A percepção pode ser informações em tempo real ou temporárias, principalmente válidas a curto prazo. Você pode decidir se deseja gravá-la no banco de dados de acordo com suas necessidades (por exemplo, armazenar apenas eventos de percepção importantes).
4. Classes de ambiente e espaço (Sala, OcupaSala, Espacial, Ambiente, Inventário, etc.)
• Representa informações como quartos, ambientes, locais, contêineres de objetos, etc.
•Room.id, Ocupa quarto, ambiente e outros campos precisam ser persistidos com frequência, como descrição da página inicial do quarto, estrutura de mapa, etc.
• A alteração de componentes (como uma Entidade a mover-se entre salas) pode ser escrita por eventos ou periodicamente.
5. Classes de aparência e interação (Aparência, Estado da Interface, Relacionamento, etc.)
• Registar as partes externas "visíveis" ou "interativas" da entidade, tais como Avatar, pose, facialExpression, rede de relacionamento social com outras entidades, etc.
• Algumas partes podem ser processadas apenas na memória (representação em tempo real), enquanto outras partes (como relacionamentos sociais chave) podem ser persistidas.
6. Componentes de Utilidade e Manutenção (Limpeza, DebugInfo, Dados de Perfis, etc.)
• Usado para marcar quais entidades precisam ser recicladas (Limpeza), ou registrar informações de depuração (DebugInfo) para uso em monitoramento e análise.
• Normalmente, só existe na memória e raramente é sincronizado com o banco de dados, a menos que seja necessário para registo ou auditoria.
Já apresentado acima
Além de Componentes e Sistemas, é necessária uma camada adicional de gestão de recursos. Esta camada trata do acesso à base de dados, conflitos de estado e outras operações essenciais.
Lado esquerdo: Sistemas (PerceptionSystem, ExperienceSystem, ThinkingSystem, etc.):
• Cada sistema é programado para execução pelo SimulationRuntime no loop do ECS, consultando e processando as entidades que lhe interessam (através de condições de componente).
• Ao executar lógica, precisa de interagir com Gestores, por exemplo:
Lado Direito: Gestores (EventBus, RoomManager, StateManager, EventManager, ActionManager, PromptManager, etc):
• Fornecer funções no nível do sistema, que basicamente não "conduzem" ativamente a lógica, mas são chamadas por Sistemas ou Tempo de Execução.
• Exemplos típicos:
• É o "agendador" de todos os Sistemas, iniciando ou interrompendo ciclos do sistema em diferentes níveis (Consciente/Subconsciente, etc.);
• Os gestores também são criados durante a fase de construção e passados para cada sistema para uso.
• Note em particular que também interage com ComponentSync (CS), que é usado para remover componentes ou inscrições em eventos de forma síncrona ao reciclar entidades.
Em conclusão:
Cada Sistema lerá e escreverá dados ou chamará serviços através do Gestor correspondente quando necessário, e o Tempo de Execução agendará uniformemente o ciclo de vida e o comportamento de todos os Sistemas e Gestores a um nível mais elevado.
Num sistema ECS, os sistemas lidam com a execução lógica real, enquanto as operações de banco de dados (leitura/escrita) são geridas através de um Gestor de Persistência (PersistenceManager / DatabaseManager) ou um Gestor de Estado (StateManager). O processo geral é o seguinte:
• O StateManager / PersistenceManager carrega os dados dos componentes de persistência principais, como Agents, Rooms, Goals, entre outros, do banco de dados, cria entidades correspondentes (Entidades) e inicializa os campos de componentes relacionados.
• Por exemplo, leia um lote de registros de agentes e insira-os no mundo ECS e inicialize Agente, Memória, Objetivo e outros componentes para eles.
2. Tempo de Execução do ECS (Loop de Atualização de Sistemas)
• O sistema realiza ações em cada quadro (ou rodada): o PerceptionSystem coleta 'percepções' e as escreve no componente de Percepção (principalmente de curto prazo fora da biblioteca).
ExperienceSystem escreve a nova "experiência cognitiva" em Memory.experiences. Se for uma experiência chave, também pode chamar StateManager para armazenamento imediato, ou marcá-la com "needsPersistence" para escrita em lote subsequente.
ThinkingSystem / ActionSystem / GoalPlanningSystem, etc. tomam decisões com base no conteúdo do componente e atualizam os campos no ECS.
Se alguns componentes (como o Goal.current) sofrerem grandes alterações e exigirem persistência (como um novo objetivo de longo prazo), notifique o StateManager para escrever esse campo no banco de dados por meio de escuta de componentes ou eventos do sistema.
3. Persistência Periódica ou Orientada por Eventos
• Você pode chamar interfaces como PersistenceManager.storeComponentData(eid, 'Goal') para descartar a biblioteca em certos pontos-chave do sistema (como quando o plano de destino é atualizado ou quando ocorre um evento importante no Agente).
• Você também pode fazer com que o StateManager verifique componentes ou entidades com a marca 'needsPersistence' no CleanupSystem ou no temporizador e as escreva de volta no banco de dados de uma vez.
• Além disso, os dados de registro ou auditoria (como histórico de ações, registro de pensamentos) também podem ser arquivados e armazenados aqui.
4. Salvar manualmente ou desligar (Checkpointing & Persistência na saída)
• Quando o servidor ou processo deve ser desligado, use StateManager.saveAll() para escrever os dados não escritos no banco de dados de forma uniforme para garantir que o estado do ECS possa ser restaurado na próxima vez que for carregado.
• Para alguns cenários autónomos/offline, os arquivos também podem ser acionados manualmente.
O seguinte é um cenário simples para demonstrar as possíveis formas nas quais os componentes e bancos de dados interagem:
1. Fase de arranque: StateManager.queryDB("SELECT * FROM agents") → Obter um lote de registos de agentes, criar Entidade (EID=x) para cada registo sequencialmente e inicializar os campos do Agente, Memória, Objetivo e outros componentes.
Ao mesmo tempo, carregue informações do quarto a partir da tabela "rooms" e crie uma entidade de Quarto.
2. Operações em Tempo de Execução: O PerceptionSystem detecta o evento 'aparecimento de MagicSword' em um determinado quarto e escreve Perception.currentStimuli[eid]. O ExperienceSystem converte os estímulos em Experiências e os atribui a Memory.experiences[eid]. O ThinkingSystem determina a próxima ação com base na Memória, Objetivo e outras informações e gera Action.pendingAction[eid]. Após a execução da ação pelo ActionSystem, o resultado é gravado em Memory ou Action.lastActionResult. Se este for um evento importante da trama, a parte mais recente de Memory.experiences[eid] será marcada como needsPersistence. Após algum tempo, o StateManager verifica que Memory.experiences[eid] tem 'needsPersistence' e o grava no banco de dados (INSERT INTO memory_experiences...).
3.Parar ou Verificar Ponto de Controlo: Com base no agendamento do ECS ou do sistema, o StateManager.saveAll() é chamado quando o “servidor é desligado” para escrever o estado mais recente dos campos de componentes-chave (Agente, Memória, Objetivo, etc.) ainda em memória para a base de dados. Da próxima vez que reiniciar, o estado do mundo ECS pode ser carregado e restaurado a partir da base de dados.
• A categorização de componentes não só facilita a gestão clara de dados de entidades no projeto, mas também nos ajuda a controlar os limites de dados entre 'requer persistência' e 'existe apenas na memória'.
• A interação com o banco de dados geralmente é tratada por um Gerenciador especializado (como o StateManager), e os Sistemas operam por meio dele quando precisam ler e escrever no banco de dados, evitando escrever diretamente instruções SQL ou similares de baixo nível no Sistema.
• Dessa forma, você pode desfrutar simultaneamente da eficiência lógica e flexibilidade do ECS, bem como das vantagens de persistência, retomada de ponto de interrupção e análise estatística de dados proporcionadas pelo banco de dados.
Os destaques de toda a arquitetura são:
Como mostrado abaixo:
Ao mesmo tempo, se desejar adicionar novas funções durante o processo de desenvolvimento, isso não terá qualquer impacto sobre outros sistemas e poderá facilmente carregar as funções que deseja.
Do meu ponto de vista pessoal, este é um framework extremamente modular com excelente desempenho. A qualidade do código também é muito alta e contém bons documentos de design. Infelizmente, o Project89 tem faltado visibilidade e promoção para este framework, razão pela qual passei quatro dias escrevendo este artigo para destacar os seus pontos fortes. Acredito que grandes tecnologias merecem reconhecimento e, amanhã, pretendo lançar uma versão em inglês deste artigo para aumentar a conscientização entre as equipes de jogos e desenvolvedores de DeFi (Finanças Descentralizadas). Espero que mais equipes explorem este framework como uma escolha arquitetônica potencial para seus projetos!
Encaminhar o Título Original: Vejo a Estrutura de Agente da Próxima Geração no Project89
Para ir direto ao ponto, @project_89adota uma abordagem completamente nova ao projetar um Framework de Agente. Este é um Framework de Agente de alto desempenho especificamente para o desenvolvimento de jogos. Comparado aos Frameworks de Agente atualmente utilizados, ele é mais modular e oferece melhor desempenho.
Este artigo levou muito tempo para ser escrito, tentando fazer com que todos entendam que tipo de atualizações arquitetônicas este framework fez em comparação ao tradicional framework do Agente. Ele foi revisado muitas vezes antes desta versão, mas ainda há algumas partes no artigo que são muito confusas. Devido a dificuldades técnicas, não consegui popularizá-lo ainda mais. Se você tiver alguma sugestão para melhorar o artigo, por favor deixe seus comentários.
Uma vez que este é um blog técnico, vamos primeiro dar uma olhada na experiência técnica do fundador.
Antes de trabalhar no Project89, o fundador desenvolveu este projeto:https://github.com/Oneirocom/Magick, que também é um software de programação com inteligência artificial. Além disso, Shaw está classificado como o quarto principal desenvolvedor deste projeto. Você também pode ver este projeto no portfólio de Shaw.
Superior esquerdo: o fundador do project89; Inferior direito: 'lalaune' é Shaw da ai16z
Hoje iremos principalmente apresentar o Framework de Agente de alto desempenho no projeto89:
https://github.com/project-89/argOS
Do ponto de vista da aplicação no campo de jogo
Os jogos que atualmente usam a arquitetura ECS incluem:
Jogos de blockchain: Mud, Dojo
Jogos tradicionais: Overwatch, Star Citizen, etc.
Além disso, os motores de jogos mainstream estão evoluindo em direção à arquitetura ECS, como Unity.
ECS (Entity-Component-System) é um padrão arquitetural comummente utilizado no desenvolvimento de jogos e sistemas de simulação. Separa completamente os dados e a lógica para gerir eficientemente várias entidades e seus comportamentos em cenários escaláveis em grande escala:
Entidade
• Apenas um ID (número ou string), sem dados ou lógica.
• Você pode montar diferentes componentes para dar-lhe várias propriedades ou capacidades conforme necessário.
Componente
• Usado para armazenar dados específicos ou estado de uma entidade.
Sistema
• Responsável pela execução da lógica relacionada a certos componentes.
Vamos usar um exemplo específico de ação do Agente para entender este sistema:
No ArgOS, cada Agente é considerado uma Entidade, que pode registar diferentes componentes. Por exemplo, na imagem abaixo, o nosso Agente tem os seguintes quatro componentes:
Componente do Agente: armazena principalmente informações básicas como nome do Agente, nome do modelo, etc.
Componente de Percepção: Principalmente utilizado para armazenar dados externos percebidos
Componente de Memória: Usado principalmente para armazenar os dados de memória da Entidade Agente, coisas semelhantes que já foram feitas, etc.
Componente de Ação: Armazena principalmente dados de Ação a serem executados
Fluxo do sistema:
Em seguida, obtemos uma Entidade de Agente de Atualização na qual cada dado do Componente é atualizado.
4.Assim, podemos ver que o Sistema aqui é principalmente responsável por definir quais Componentes executar a lógica de processamento correspondente.
E é óbvio que no projeto89 é um mundo cheio de vários tipos de Agents. Por exemplo, alguns Agents não só têm as habilidades básicas acima, mas também têm a capacidade de fazer planos.
Então ficará como mostrado na imagem abaixo:
No entanto, ao contrário dos frameworks tradicionais em que um sistema aciona diretamente outro (por exemplo, o Sistema de Percepção chamando o Sistema de Memória), no Project89, os sistemas não se chamam diretamente. Em vez disso, cada sistema é executado independentemente em intervalos de tempo fixos. Por exemplo:
Até agora, este artigo simplificou significativamente a arquitetura do ArgOS para torná-lo mais fácil de entender. Agora, vamos dar uma olhada mais de perto no sistema real do ArgOS.
Para permitir que o Agente pense mais profundamente e realize tarefas mais complexas, a ArgOS projetou muitos Componentes e muitos Sistemas.
E o ArgOS divide o Sistema em "três níveis" (ConsciousnessLevel):
1) sistema CONSCIOUS
2) Sistema Subconsciente (SUBCONSCIENTE)
3) Sistema inconsciente (INCONSCIENTE)
Portanto, no ArgOS, diferentes Sistemas são divididos de acordo com o Nível de Consciência para estipular com que frequência esse Sistema será executado.
Por que foi projetado dessa maneira?
Porque a relação entre vários sistemas em ArgOS é extremamente complexa, como mostrado abaixo:
Determine se o estímulo muda significativamente e atualize-o de acordo com a estabilidade, modo de processamento (ATIVO/REFLEXIVO/ESPERANDO), etc.
Em última análise, os dados de "percepção atual" são fornecidos para o subsequente ExperienceSystem, ThinkingSystem, etc.
2. O sistema de experiência converte os estímulos coletados pelo sistema de percepção em uma "experiência" mais abstrata.
LLM ou lógica de regras (extractExperiences) é chamado para identificar novas experiências e armazenado no componente de Memória.
Deduplicar, filtrar e verificar experiências, ao mesmo tempo que aciona eventos de “experiência” para outros sistemas ou ouvintes externos através do eventBus.
3. ThinkingSystem representa o processo de pensamento interno do agente.
Extrair o estado atual de componentes como Memória e Percepção e gerar “ThoughtResult” através de generateThought(…) e lógica LLM/regra.
Com base no resultado do pensamento, pode:
• Atualizar pensamentos na Memória (histórico de pensamento).
• Desencadear uma nova ação (colocar em Action.pendingAction[eid]).
• Alterar a Aparência externa do agente (expressão, postura, etc.) e gerar Estímulos relacionados para permitir que outras entidades "vejam" a mudança.
4. O sistema de ação executa ações seAção.pendentenão está vazio, usandoruntime.getActionManager().executeAction(…).
Após a execução, escreva o resultado de volta para Action.lastActionResult e notifique a sala ou outras entidades.
Isto também produz um Estímulo Cognitivo (estimulação cognitiva) para que sistemas subsequentes “saibam” que a ação foi concluída, ou possa ser incorporada à memória.
5. O Sistema de Planeamento de Objetivos avalia periodicamente o progresso dos objetivos na lista Goal.current[eid], ou verifica a memória externa/própria por alterações significativas (detectarAlteraçõesSignificativas).
Quando um novo objetivo ou ajuste de objetivo é necessário, gerar e escrever Goal.current[eid] através de generateGoals(…).
Ao mesmo tempo, o objetivo em progresso (in_progress) é atualizado. Se as condições de conclusão ou falha forem atendidas, o status é alterado e um sinal de conclusão/falha é enviado para o Plano correspondente.
6. O sistema de planeamento gera ou atualiza o Plano (plano de execução) para o "objetivo existente" (Goal.current[eid]).
Se for detetado que alguns objetivos não têm planos ativos correspondentes, gerar uma rota de execução contendo vários passos através de generatePlan(…) e escrevê-la em Plan.plans[eid].
Quando o objetivo for concluído ou falhado, o estado do Plano associado a ele também será atualizado e será gerada a estimulação cognitiva correspondente.
7. O RoomSystem lida com atualizações relacionadas ao quarto:
• Obter a lista de ocupantes no quarto (ocupantes) e gerar estímulos de “aparência” para cada agente para que outras entidades possam “ver” a sua aparência ou ações.
• Criar e correlacionar Estímulos do ambiente da sala (por exemplo, informações apropriadas sobre a "ambiente da sala").
Certifique-se de que, quando o Agente estiver em um ambiente espacial específico, outras entidades que estão sentido o espaço possam perceber mudanças em sua aparência.
8. O CleanupSystem encontra periodicamente e remove entidades marcadas com o componente de limpeza. Usado para reciclar estímulos ou outros objetos que não são mais necessários para evitar que um grande número de entidades inválidas fiquem na ECS.
O exemplo de cena a seguir mostra como cada sistema coopera para completar um processo completo em uma rodada (ou vários quadros).
Preparação da cena: Há um Agente (EID=1) no Mundo, que está no estado "Ativo" e está numa Sala (EID=100).
Uma nova prop "MagicSword" apareceu nesta sala e foi gerado o estímulo correspondente.
“Vi a MagicSword, talvez pegá-la e ver o que ela pode fazer…” O resultado do pensamento contém uma ação a ser executada: { ferramenta: “pegarItem”, parâmetros: { nomeDoItem: “MagicSword” } }
ThinkingSystem escreve esta Ação para Action.pendingAction[1].
Se houver uma mudança na aparência (por exemplo, 'rosto com expressão curiosa'), a Aparência é atualizada e é gerada estimulação visual.
4. O ActionSystem vê Action.pendingAction[1] = { ferramenta: "pickUpItem", parâmetros: ... }.
Execute a lógica de ação “pickup” através de runtime.getActionManager().executeAction(“pickUpItem”, 1, { itemName: “MagicSword” }, runtime). Obtenha o resultado: { success: true, message: “Você pegou a espada mágica” }, atualize para Action.lastActionResult[1] e ative o evento “action” para ser transmitido para a sala (100).
Ao mesmo tempo, um estímulo cognitivo (type=”action_result”) é gerado, escrito na Memória ou capturado pelo ThinkingSystem na próxima jogada.
5. O Sistema de Planeamento de Objetivos (se o agente tiver objetivos) avalia periodicamente os objetivos do agente. Se um dos objetivos do agente neste momento for "obter uma arma poderosa" e detetar que a Espada Mágica foi obtida, o objetivo pode ser marcado como concluído. Se ocorrerem novas mudanças (por exemplo, "novo objeto aparece na sala") que afetem o objetivo perseguido pelo agente, gera-se um novo objetivo ou abandona-se o objetivo antigo com base na deteção de mudanças significativas.
6.PlanningSystem (se houver um objetivo relacionado) verifica se é necessário um novo Plano ou se um Plano existente é atualizado para objetivos concluídos ou recém-gerados, como "Obter armas poderosas".
Se concluído, defina o Plano associado como [status] para “concluído”, ou gere mais etapas se o objetivo for expandir o processo subsequente (“Pesquisar a Espada Mágica”).
7. O sistema do quarto atualiza a lista de ocupantes e entidades visíveis no quarto (100) (a cada quadro ou rodada).
Se a aparência do agente(1) mudar (por exemplo, Appearance.currentAction = “segurando a espada”), crie um novo estímulo visual de “aparência” para que os Agentes 2 e 3 na mesma sala saibam que “o agente 1 pegou a espada”.
8.CleanupSystem remove entidades ou estímulos que foram marcados (Limpeza). Se já não precisar de manter o Estímulo “MagicSword” depois de o apanhar, pode eliminar a entidade de Estímulo correspondente em CleanupSystem.
• Perceber mudanças no ambiente (Percepção) → Registrar ou transformar em experiência interna (Experiência) → Auto-reflexão e tomada de decisão (Pensamento) → Colocar em ação (Ação) → Ajustar dinamicamente metas e planos (Planejamento de Metas + Planejamento) → Sincronizar o ambiente (Sala) → Reciclar entidades inúteis de forma oportuna (Limpeza)
Em ECS, cada entidade pode ter vários componentes. De acordo com sua natureza e ciclo de vida no sistema, os componentes podem ser grosseiramente divididos nas seguintes categorias:
1. Classes Principais de Identidade (Componentes de Nível de Identidade)
• Agente / Perfil do Jogador / Perfil do NPC, etc.
• Usado para identificar exclusivamente entidades, armazenar funções principais ou informações de unidades e geralmente precisam ser persistidos no banco de dados.
2. Componentes de Comportamento e Estado
• Ação, Objetivo, Plano, Estado de Processamento, etc.
• Representa o que a entidade está atualmente tentando fazer ou quais são seus objetivos, bem como seu status de resposta a comandos externos e pensamentos internos.
• Contém pendingAction, goalsInProgress, plans e pensamentos ou tarefas na fila, etc.
• Normalmente estados de médio/curto prazo, muitos mudando dinamicamente ao longo das rodadas do jogo ou ciclos de negócios.
• Se é necessário repor depende da situação. Se quiser continuar a executar após um ponto de interrupção, pode escrever periodicamente na base de dados.
3. Componentes de Perceção e Memória
• Percepção, Memória, Estímulo, Experiência, etc.
• Regista a informação externa (Estímulos) percebida pela entidade, e as experiências refinadas nela após a perceção (Experiências).
• A memória muitas vezes pode acumular grandes quantidades de dados, como registros de conversas, histórico de eventos, etc.; a persistência é frequentemente necessária.
• A percepção pode ser informações em tempo real ou temporárias, principalmente válidas a curto prazo. Você pode decidir se deseja gravá-la no banco de dados de acordo com suas necessidades (por exemplo, armazenar apenas eventos de percepção importantes).
4. Classes de ambiente e espaço (Sala, OcupaSala, Espacial, Ambiente, Inventário, etc.)
• Representa informações como quartos, ambientes, locais, contêineres de objetos, etc.
•Room.id, Ocupa quarto, ambiente e outros campos precisam ser persistidos com frequência, como descrição da página inicial do quarto, estrutura de mapa, etc.
• A alteração de componentes (como uma Entidade a mover-se entre salas) pode ser escrita por eventos ou periodicamente.
5. Classes de aparência e interação (Aparência, Estado da Interface, Relacionamento, etc.)
• Registar as partes externas "visíveis" ou "interativas" da entidade, tais como Avatar, pose, facialExpression, rede de relacionamento social com outras entidades, etc.
• Algumas partes podem ser processadas apenas na memória (representação em tempo real), enquanto outras partes (como relacionamentos sociais chave) podem ser persistidas.
6. Componentes de Utilidade e Manutenção (Limpeza, DebugInfo, Dados de Perfis, etc.)
• Usado para marcar quais entidades precisam ser recicladas (Limpeza), ou registrar informações de depuração (DebugInfo) para uso em monitoramento e análise.
• Normalmente, só existe na memória e raramente é sincronizado com o banco de dados, a menos que seja necessário para registo ou auditoria.
Já apresentado acima
Além de Componentes e Sistemas, é necessária uma camada adicional de gestão de recursos. Esta camada trata do acesso à base de dados, conflitos de estado e outras operações essenciais.
Lado esquerdo: Sistemas (PerceptionSystem, ExperienceSystem, ThinkingSystem, etc.):
• Cada sistema é programado para execução pelo SimulationRuntime no loop do ECS, consultando e processando as entidades que lhe interessam (através de condições de componente).
• Ao executar lógica, precisa de interagir com Gestores, por exemplo:
Lado Direito: Gestores (EventBus, RoomManager, StateManager, EventManager, ActionManager, PromptManager, etc):
• Fornecer funções no nível do sistema, que basicamente não "conduzem" ativamente a lógica, mas são chamadas por Sistemas ou Tempo de Execução.
• Exemplos típicos:
• É o "agendador" de todos os Sistemas, iniciando ou interrompendo ciclos do sistema em diferentes níveis (Consciente/Subconsciente, etc.);
• Os gestores também são criados durante a fase de construção e passados para cada sistema para uso.
• Note em particular que também interage com ComponentSync (CS), que é usado para remover componentes ou inscrições em eventos de forma síncrona ao reciclar entidades.
Em conclusão:
Cada Sistema lerá e escreverá dados ou chamará serviços através do Gestor correspondente quando necessário, e o Tempo de Execução agendará uniformemente o ciclo de vida e o comportamento de todos os Sistemas e Gestores a um nível mais elevado.
Num sistema ECS, os sistemas lidam com a execução lógica real, enquanto as operações de banco de dados (leitura/escrita) são geridas através de um Gestor de Persistência (PersistenceManager / DatabaseManager) ou um Gestor de Estado (StateManager). O processo geral é o seguinte:
• O StateManager / PersistenceManager carrega os dados dos componentes de persistência principais, como Agents, Rooms, Goals, entre outros, do banco de dados, cria entidades correspondentes (Entidades) e inicializa os campos de componentes relacionados.
• Por exemplo, leia um lote de registros de agentes e insira-os no mundo ECS e inicialize Agente, Memória, Objetivo e outros componentes para eles.
2. Tempo de Execução do ECS (Loop de Atualização de Sistemas)
• O sistema realiza ações em cada quadro (ou rodada): o PerceptionSystem coleta 'percepções' e as escreve no componente de Percepção (principalmente de curto prazo fora da biblioteca).
ExperienceSystem escreve a nova "experiência cognitiva" em Memory.experiences. Se for uma experiência chave, também pode chamar StateManager para armazenamento imediato, ou marcá-la com "needsPersistence" para escrita em lote subsequente.
ThinkingSystem / ActionSystem / GoalPlanningSystem, etc. tomam decisões com base no conteúdo do componente e atualizam os campos no ECS.
Se alguns componentes (como o Goal.current) sofrerem grandes alterações e exigirem persistência (como um novo objetivo de longo prazo), notifique o StateManager para escrever esse campo no banco de dados por meio de escuta de componentes ou eventos do sistema.
3. Persistência Periódica ou Orientada por Eventos
• Você pode chamar interfaces como PersistenceManager.storeComponentData(eid, 'Goal') para descartar a biblioteca em certos pontos-chave do sistema (como quando o plano de destino é atualizado ou quando ocorre um evento importante no Agente).
• Você também pode fazer com que o StateManager verifique componentes ou entidades com a marca 'needsPersistence' no CleanupSystem ou no temporizador e as escreva de volta no banco de dados de uma vez.
• Além disso, os dados de registro ou auditoria (como histórico de ações, registro de pensamentos) também podem ser arquivados e armazenados aqui.
4. Salvar manualmente ou desligar (Checkpointing & Persistência na saída)
• Quando o servidor ou processo deve ser desligado, use StateManager.saveAll() para escrever os dados não escritos no banco de dados de forma uniforme para garantir que o estado do ECS possa ser restaurado na próxima vez que for carregado.
• Para alguns cenários autónomos/offline, os arquivos também podem ser acionados manualmente.
O seguinte é um cenário simples para demonstrar as possíveis formas nas quais os componentes e bancos de dados interagem:
1. Fase de arranque: StateManager.queryDB("SELECT * FROM agents") → Obter um lote de registos de agentes, criar Entidade (EID=x) para cada registo sequencialmente e inicializar os campos do Agente, Memória, Objetivo e outros componentes.
Ao mesmo tempo, carregue informações do quarto a partir da tabela "rooms" e crie uma entidade de Quarto.
2. Operações em Tempo de Execução: O PerceptionSystem detecta o evento 'aparecimento de MagicSword' em um determinado quarto e escreve Perception.currentStimuli[eid]. O ExperienceSystem converte os estímulos em Experiências e os atribui a Memory.experiences[eid]. O ThinkingSystem determina a próxima ação com base na Memória, Objetivo e outras informações e gera Action.pendingAction[eid]. Após a execução da ação pelo ActionSystem, o resultado é gravado em Memory ou Action.lastActionResult. Se este for um evento importante da trama, a parte mais recente de Memory.experiences[eid] será marcada como needsPersistence. Após algum tempo, o StateManager verifica que Memory.experiences[eid] tem 'needsPersistence' e o grava no banco de dados (INSERT INTO memory_experiences...).
3.Parar ou Verificar Ponto de Controlo: Com base no agendamento do ECS ou do sistema, o StateManager.saveAll() é chamado quando o “servidor é desligado” para escrever o estado mais recente dos campos de componentes-chave (Agente, Memória, Objetivo, etc.) ainda em memória para a base de dados. Da próxima vez que reiniciar, o estado do mundo ECS pode ser carregado e restaurado a partir da base de dados.
• A categorização de componentes não só facilita a gestão clara de dados de entidades no projeto, mas também nos ajuda a controlar os limites de dados entre 'requer persistência' e 'existe apenas na memória'.
• A interação com o banco de dados geralmente é tratada por um Gerenciador especializado (como o StateManager), e os Sistemas operam por meio dele quando precisam ler e escrever no banco de dados, evitando escrever diretamente instruções SQL ou similares de baixo nível no Sistema.
• Dessa forma, você pode desfrutar simultaneamente da eficiência lógica e flexibilidade do ECS, bem como das vantagens de persistência, retomada de ponto de interrupção e análise estatística de dados proporcionadas pelo banco de dados.
Os destaques de toda a arquitetura são:
Como mostrado abaixo:
Ao mesmo tempo, se desejar adicionar novas funções durante o processo de desenvolvimento, isso não terá qualquer impacto sobre outros sistemas e poderá facilmente carregar as funções que deseja.
Do meu ponto de vista pessoal, este é um framework extremamente modular com excelente desempenho. A qualidade do código também é muito alta e contém bons documentos de design. Infelizmente, o Project89 tem faltado visibilidade e promoção para este framework, razão pela qual passei quatro dias escrevendo este artigo para destacar os seus pontos fortes. Acredito que grandes tecnologias merecem reconhecimento e, amanhã, pretendo lançar uma versão em inglês deste artigo para aumentar a conscientização entre as equipes de jogos e desenvolvedores de DeFi (Finanças Descentralizadas). Espero que mais equipes explorem este framework como uma escolha arquitetônica potencial para seus projetos!