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.
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
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.
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:
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:

E o ArgOS divide o Sistema em "três níveis" (ConsciousnessLevel):
Incluindo RoomSystem, PerceptionSystem, ExperienceSystem, ThinkingSystem, ActionSystem, CleanupSystem)- A frequência de atualização é geralmente maior (como a cada 10 segundos).- Processamento mais próximo do nível "tempo real" ou "consciente", como percepção ambiental, pensamento em tempo real, execução de ações, etc.2) Sistema Subconsciente (SUBCONSCIENTE)
GoalPlanningSystem, PlanningSystem- A frequência de atualização é relativamente baixa (por exemplo, a cada 25 segundos).- Lida com lógica de "pensamento" como verificar/gerar periodicamente metas e planos.3) Sistema inconsciente (INCONSCIENTE)
Ainda não está habilitado- A frequência de atualização é mais lenta (como mais de 50 segundos),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:

Em última análise, os dados de "percepção atual" são fornecidos para o subsequente ExperienceSystem, ThinkingSystem, etc.
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.
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.
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.
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.
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.
• 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.
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.
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.
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.
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”).
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.

• 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.
• 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.
• 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).
• 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.
• 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.
• 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.

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:
• 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:
• Os gestores também são criados durante a fase de construção e passados para cada sistema para uso.
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.
• 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.
• 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.
• 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.
• 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.
Ao mesmo tempo, carregue informações do quarto a partir da tabela "rooms" e crie uma entidade de Quarto.
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:

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.





