転送元のオリジナルタイトル:プロジェクト89で次世代エージェントフレームワークを見る
要点をお伝えすると、@project_89エージェントフレームワークを設計するためのまったく新しいアプローチを採用しています。これは、ゲーム開発専用の高性能エージェントフレームワークです。現在使用されているエージェントフレームワークと比較して、よりモジュール化され、より優れたパフォーマンスを提供します。
この記事は書くのに長い時間がかかり、従来のエージェントフレームワークと比較してこのフレームワークがどのようなアーキテクチャのアップグレードを行ったかを皆に理解してもらおうとしています。このバージョン以前に何度も改訂されてきましたが、記事の中にはまだわかりにくい部分があります。技術的な問題により、さらに普及させることができませんでした。記事の改善についてご意見がありましたら、コメントを残してください。
この技術ブログであるため、まず創設者の技術的な専門知識を見てみましょう。
Project89に取り組む前に、創設者はこのプロジェクトを開発しました:https://github.com/Oneirocom/Magick, これはまた、AIパワードのプログラミングソフトウェアでもあります。さらに、ショーはこのプロジェクトの第4位のトップ開発者としてランク付けされています。また、ショーのポートフォリオでもこのプロジェクトを見ることができます。
左上: project89の創設者;右下: 'lalaune'はai16zのショーです
本日は、プロジェクト89の高パフォーマンスエージェントフレームワークについて主に紹介します:
https://github.com/project-89/argOS
ゲーム分野での応用の観点から
ECSアーキテクチャを現在使用しているゲームには、次のものが含まれています:
ブロックチェーンゲーム:Mud、Dojo
伝統的なゲーム:Overwatch、Star Citizenなど
さらに、主流のゲームエンジンはUnityなどのECSアーキテクチャに向かって進化しています。
ECS(Entity-Component-System)は、ゲーム開発やシミュレーションシステムで一般的に使用されるアーキテクチャパターンです。大規模なスケーラブルなシナリオで、データとロジックを効率的に分離して、さまざまなエンティティとその振る舞いを管理します。
エンティティ
• 単なるID(数値または文字列)で、データまたはロジックを含んでいません。
• 必要に応じて、さまざまなプロパティや機能を持つように、異なるコンポーネントをマウントすることができます。
コンポーネント
・特定のデータまたはエンティティの状態を保存するために使用されます。
システム
• あるコンポーネントに関連するロジックの実行を担当します。
このシステムを理解するために、エージェントアクションの具体的な例を使いましょう。
ArgOSでは、各エージェントはエンティティと見なされ、異なるコンポーネントを登録できます。例えば、下の画像では、当社のエージェントには次の4つのコンポーネントがあります:
エージェントコンポーネント:エージェントの名前、モデル名などの基本情報を主に保存します。
知覚コンポーネント:主に外部の知覚データを保存するために使用されます
メモリコンポーネント:エージェントエンティティのメモリデータ、同様のことが行われたものなどを主に保存するために使用されます。
アクションコンポーネント:主に実行されるアクションデータを保存します
システムのワークフロー:
次に、各コンポーネントのデータが更新されたUpdate Agent Entityを取得します。
4. そのため、ここではシステムが主に、どのコンポーネントに対して対応する処理ロジックを実行するかを定義する責任があります。
そして、project89ではさまざまな種類のエージェントで満ちた世界であることは明らかです。例えば、一部のエージェントは上記の基本的な能力だけでなく、計画を立てる能力も持っています。
その後、下の画像のようになります:
しかし、あるシステムが別のシステムを直接トリガーする従来のフレームワーク(例えば、記憶システムを呼び出す知覚システム)とは異なり、Project89では、システムは互いに直接呼び出さない。代わりに、各システムは一定の時間間隔で独立して実行されます。例えば:
これまで、この記事ではArgOSのアーキテクチャを大幅に簡略化して理解しやすくしてきました。さて、実際のArgOSシステムをもう少し詳しく見てみましょう。
Agentがより深く考えることや、より複雑なタスクを実行するために、ArgOSは多くのコンポーネントと多くのシステムを設計しています。
そして、ArgOSはシステムを「三つのレベル」(ConsciousnessLevel)に分割します:
1) CONSCIOUS system
2) 潜在意識(SUBCONSCIOUS)システム
3) 無意識(UNCONSCIOUS)システム
そのため、ArgOSでは、意識レベルに応じて異なるシステムが分割され、そのシステムが実行される頻度が定められます。
なぜこのように設計されているのですか?
様々なシステム間の関係はArgOS内で非常に複雑であり、以下のように示されています:
刺激が大幅に変化するかどうかを判断し、安定性、処理モード(アクティブ/リフレクティブ/ウェイティング)に基づいて更新してください。
最終的に、「現在の知覚」データは、後続のExperienceSystem、ThinkingSystemなどに提供されます。
2.経験システムは、知覚システムによって収集された刺激をより抽象的な「経験」に変換します。
LLMまたはルールロジック(extractExperiences)は、新しい経験を特定してMemoryコンポーネントに保存するために呼び出されます。
重複排除、フィルタリング、および経験の検証を行いながら、eventBusを介して他のシステムや外部リスナーに「経験」イベントをトリガーします。
3. ThinkingSystemはエージェントの内部思考プロセスを表しています。
コンポーネント(MemoryおよびPerceptionなど)から現在の状態を抽出し、「generateThought(…)」およびLLM/ruleロジックを使用して「ThoughtResult」を生成します。
思考結果に基づいて、それは次のようになる可能性があります:
• メモリー(思考履歴)の中の思考を更新します。
• 新しいアクションをトリガーします(Action.pendingAction[eid]に入れます)。
・エージェントの外部の見た目(表情、姿勢など)を変更し、関連する刺激を生成して、他のエンティティに変更を「見せる」。
4.アクションシステムは、もし...なら、アクションを実行しますAction.pendingAction空ではありません、使用中ですruntime.getActionManager().executeAction(…).
実行後、結果を Action.lastActionResult に書き戻し、部屋や他のエンティティに通知します。
これにより、CognitiveStimulus(認知刺激)が生成され、その後のシステムが行動が完了したことを「知る」か、記憶に組み込むことができます。
5. GoalPlanningSystemは、Goal.current[eid]リストの目標の進捗を定期的に評価するか、外部/自己のメモリで重要な変更をチェックします(detectSignificantChanges)。
新しい目標または目標の調整が必要な場合は、generateGoals(...)を介してGoal.current [eid]を生成して書き込みます。
同時に、進行中の目標(in_progress)が更新されます。完了または失敗条件が満たされると、状態が変更され、対応するプランに完了/失敗の信号が送信されます。
6. PlanningSystemは、「既存の目標」(Goal.current[eid])のために計画(実行計画)を生成または更新します。
一部の目標に対応するアクティブな計画がないことが検出された場合は、generatePlan(...)を通じていくつかのステップを含む実行ロードマップを生成し、Plan.plans[eid]に書き込んでください。
目標が達成または失敗した場合、それに関連する計画のステータスも更新され、対応する認知刺激が生成されます。
7.RoomSystemは部屋に関連する更新を処理します:
• 部屋の居住者のリスト(居住者)を取得し、各エージェントのために「外見」の刺激を生成して他のエンティティに彼の外見や行動を「見せる」。
• ルーム環境の刺激(例:適切な「部屋の雰囲気」情報)を作成して相関させます。
エージェントが特定の空間環境にいるとき、その空間を感知している他のエンティティは、彼の外見の変化に気付くことができるようにしてください。
8.CleanupSystemは定期的にCleanupコンポーネントでマークされたエンティティを検出し、削除します。これは、不要になった刺激やその他のオブジェクトをリサイクルするために使用され、大量の無効なエンティティがECSに残されるのを防ぐためです。
以下のシーンの例では、各システムが1ラウンド(またはいくつかのフレーム)で完全なプロセスを完了するためにどのように協力するかを示しています。
シーンの準備:世界にはエージェント(EID=1)があり、それは「アクティブ」な状態で、部屋(EID=100)にいます。
この部屋には新しいプロップ「MagicSword」が現れ、それに対応する刺激が生成されました。
「マジックソードを見つけたので、拾って何ができるか見てみるかもしれません...」思考結果には、実行するアクションが含まれています: {tool: 'pickUpItem'、parameters: {itemName: 'MagicSword'}}
ThinkingSystemは、このActionをAction.pendingAction[1]に書き込みます。
外見に変化がある場合(例:“好奇心をそそる表情”など)、外見が更新され、視覚刺激が生成されます。
4.ActionSystemはAction.pendingAction[1] = { tool: "pickUpItem", parameters: ... }と認識します。
runtime.getActionManager().executeAction("pickUpItem", 1, { itemName: "MagicSword" }, runtime).Get the result: { success: true, message: "You picked up the magic sword" }, update to Action.lastActionResult[1], and trigger the "action" event to be broadcast to the room (100) を実行して、「pickup」アクションロジックを実行します。
同時に、認知刺激(type =”action_result”)が生成され、Memoryに書き込まれるか、次のターンでThinkingSystemによってキャプチャされます。
5. ゴール計画システム(エージェントに目標がある場合)は定期的にエージェントの目標を評価します。この時点でエージェントの目標の1つが「強力な武器を入手する」であり、マジックソードが入手されたことが検出された場合、目標は完了とマークされるかもしれません。もし新しい変更(例えば「部屋に新しいオブジェクトが現れる」がエージェントが追求している目標に影響を与える)が発生した場合、新しい目標を生成したり、古い目標を放棄することもあります。
6.計画システム(関連する目標がある場合)は、「強力な武器の入手」といった完了したまたは新たに生成された目標に対して、新しい計画が必要か、既存の計画を更新するかをチェックします。
完了した場合、関連するプランの[status]を「completed」に設定するか、目標が後続のプロセス(「魔剣の研究」)を拡大する場合は、さらなるステップを生成します。
7.RoomSystemは、部屋(100)の占有者および可視エンティティのリストを更新します(すべてのフレームまたはラウンドごとに)。
エージェント(1)の外観が変化した場合(例: Appearance.currentAction = “holding sword”)、同じ部屋にいる他のAgent2とAgent3に「エージェント1が剣を拾った」と知らせるために新しい「外観」視覚刺激を作成します。
8. CleanupSystemは、マークされたエンティティや刺激を削除します(クリーンアップ)。 “MagicSword”刺激を拾った後、もう必要ない場合は、CleanupSystemで対応する刺激エンティティを削除できます。
• 環境の変化を認識する(認知)→ 記録または内的な経験に変換する(経験)→ 自己の思考と意思決定(思考)→ 行動に移す(行動)→ 目標と計画を動的に調整する(ゴールプランニング+計画)→ 環境を同期させる(ルーム)→ 不要なエンティティを適時にリサイクルする(クリーンアップ)
ECSでは、各エンティティに複数のコンポーネントを持たせることができます。システム内での性質やライフサイクルに応じて、コンポーネントは大まかに以下のカテゴリに分けることができます:
1.コアアイデンティティクラス(アイデンティティレベルのコンポーネント)
• エージェント / プレイヤープロフィール / NPCプロフィールなど。
• エンティティを一意に識別し、コアロールまたはユニット情報を格納し、一般的にデータベースに永続化する必要があります。
2.動作と状態のコンポーネント
• アクション、ゴール、プラン、プロセス状態など。
• 現在のエンティティが試行していること、目標、および外部コマンドや内部思考への応答状態を表します。
• 保留中のアクション、進行中の目標、計画、キュー内の思考やタスクなどが含まれています。
• 典型的には中長期の状態であり、多くはゲームのラウンドやビジネスサイクルの間に動的に変化します。
• ストッキングが必要かどうかは状況によります。ブレークポイント後に実行を続けたい場合は、定期的にデータベースに書き込むことができます。
3. 感覚&記憶コンポーネント
• 感知、記憶、刺激、経験など。
• エンティティによって知覚された外部情報(刺激)と、知覚後にそれに洗練された体験(経験)を記録します。
• メモリはしばしば会話の記録、イベント履歴など大量のデータを蓄積することができます。それらを永続化することがしばしば必要です。
• 感覚はリアルタイムまたは一時的な情報であり、大部分は短期間に有効です。必要に応じてデータベースに書き込むかどうかを決定できます(たとえば、重要な感覚イベントのみを保存する場合など)。
4.環境と空間クラス(Room、OccupiesRoom、Spatial、Environment、Inventoryなど)
• 部屋、環境、場所、オブジェクトコンテナなどの情報を表します。
•Room.id, OccupiesRoom、環境などのフィールドはしばしば永続化する必要があります。たとえば、ルームのホームページの説明、地図構造などです。
• コンポーネントの変更(例えば、エンティティが部屋間を移動する場合)はイベント単位で、または定期的に記述することができます。
5.外観とインタラクションクラス(外観、UIState、関係など)
・アバターやポーズ、表情、他のエンティティとのソーシャルリレーションシップネットワークなど、エンティティの外部の「可視」または「インタラクティブ」な部分を記録します。
• 一部はメモリ内のみで処理される場合があります(リアルタイム表現)、一方、他の部分(たとえば主要な社会関係)は永続化される場合があります。
6.ユーティリティ&メンテナンスコンポーネント(クリーンアップ、DebugInfo、ProfilingDataなど)
• リサイクルが必要なエンティティ(クリーンアップ)をマークするために使用され、モニタリングおよび分析に使用するためのデバッグ情報(DebugInfo)を記録するために使用されます。
• 通常はメモリ上にのみ存在し、ログ記録や監査のために必要な場合を除いて、データベースとは同期されません。
既に上記で紹介されています
コンポーネントとシステムに加えて、追加のリソース管理層が必要です。この層はデータベースアクセス、状態の競合、およびその他の重要な操作を処理します。
左側: システム (PerceptionSystem, ExperienceSystem, ThinkingSystem, etc.):
• 各システムは、ECSループ内のSimulationRuntimeによる実行がスケジュールされ、それぞれが関心のあるエンティティ(コンポーネント条件を介して)のクエリと処理を行います。
• ロジックを実行する際には、次のようなマネージャーとやり取りする必要があります:
Right Side: マネージャー (EventBus、RoomManager、StateManager、EventManager、ActionManager、PromptManagerなど):
• システムレベルの機能を提供します。これらは基本的にはロジックを積極的に「駆動」するのではなく、システムまたはランタイムによって呼び出されます。
• 典型的な例:
• すべてのシステムの「スケジューラー」であり、異なるレベル(意識/無意識など)でシステムサイクルを開始または停止します;
• マネージャーは建設フェーズ中にも作成され、それぞれのシステムに渡されて使用されます。
• 特に、エンティティを再利用する際にコンポーネントまたはイベントの購読を同期的に削除するために使用されるComponentSync(CS)ともやり取りします。
結論として:
各システムは必要な時に対応するマネージャーを介してデータを読み書きしたりサービスを呼び出したりします。ランタイムは上位レベルですべてのシステムとマネージャーのライフサイクルと動作を一元的にスケジュールします。
ECSシステムでは、システムが実際のロジック実行を処理し、データベース操作(読み取り/書き込み)は永続性マネージャ(PersistenceManager / DatabaseManager)またはステートマネージャ(StateManager)を介して管理されます。一般的なプロセスは次のようになります。
• StateManager / PersistenceManager は、エージェント、ルーム、ゴールなどのコア永続化コンポーネントのデータをデータベースからロードし、対応するエンティティ (エンティティ) を作成し、関連するコンポーネントフィールドを初期化します。
• たとえば、エージェントレコードのバッチを読み込んでECSワールドに挿入し、それらのためにエージェント、メモリ、ゴールなどのコンポーネントを初期化します。
2.ECSランタイム(システムの更新ループ)
• システムは各フレーム(またはラウンド)で処理を行います:PerceptionSystemは「知覚」を収集し、それらをPerceptionコンポーネントに書き込みます(主にライブラリの短期的なもの)。
ExperienceSystemは、新しい「認知体験」をMemory.experiencesに書き込みます。それが重要な体験である場合、即時の保存のためにStateManagerを呼び出すか、「needsPersistence」でマークして後続のバッチ書き込みのためにマークする場合もあります。
ThinkingSystem / ActionSystem / GoalPlanningSystemなどは、コンポーネントの内容に基づいて決定を行い、ECSのフィールドを更新します。
いくつかのコンポーネント(Goal.currentなど)が大幅な変更を受け、永続性(新しい長期目標など)を必要とする場合は、コンポーネントのリスニングやシステムイベントを通じてこのフィールドをデータベースに書き込むためにStateManagerに通知してください。
3.定期的またはイベント駆動の永続性
• ターゲットの計画が更新された場合やエージェントで重要なイベントが発生した場合など、システム内の特定のキーポイントでPersistenceManager.storeComponentData(eid、”Goal”)などのインターフェースを呼び出すことで、ライブラリをドロップできます。
• StateManagerはCleanupSystemまたはタイマーで「needsPersistence」タグを持つコンポーネントまたはエンティティをスキャンし、一度にデータベースに書き込むこともできます。
• また、ログや監査データ(アクション履歴、思考ログなど)もここにアーカイブおよび保存できます。
4.マニュアルまたはシャットダウン保存(チェックポイントと終了時の永続性)
• サーバーまたはプロセスをシャットダウンする場合は、StateManager.saveAll()を使用して書き込まれていないデータを一括してデータベースに書き込み、次回ロードされるときにECSの状態を復元できるようにします。
• 一部のスタンドアロン/オフラインシナリオでは、アーカイブは手動でトリガーすることもできます。
以下は、コンポーネントとデータベースが相互作用する可能性のある方法を示すための簡単なシナリオです。
1.スタートアップフェーズ:StateManager.queryDB("SELECT * FROM agents")→エージェントレコードのバッチを取得し、順番に各レコードごとにエンティティ(EID=x)を作成し、エージェント、メモリ、ゴールなどのコンポーネントフィールドを初期化します。
同時に、「rooms」テーブルからルーム情報をロードし、Roomエンティティを作成します。
2.ランタイム操作:PerceptionSystemは、特定の部屋でイベント「MagicSwordが現れた」を検出し、Perception.currentStimuli[eid]に書き込みます。ExperienceSystemはStimuliをExperienceに変換し、それをMemory.experiences[eid]に割り当てます。ThinkingSystemはMemory、Goal、その他の情報に基づいて次のアクションを決定し、Action.pendingAction[eid]を生成します。ActionSystemがアクションを実行した後、その結果をMemoryまたはAction.lastActionResultに書き込みます。これが重要なプロットイベントである場合、Memory.experiences[eid]の最新部分がneedsPersistenceとしてマークされます。しばらくしてから、StateManagerはMemory.experiences[eid]が「needsPersistence」を持っていることを見つけ、それをデータベースに書き込みます(INSERT INTO memory_experiences…)。
3. 停止またはチェックポイント保存:ECSまたはシステムのスケジューリングに基づいて、StateManager.saveAll() が「サーバーがシャットダウン」されたときに呼び出され、メモリ内のまだ最新の状態である主要なコンポーネントフィールド(Agent、Memory、Goalなど)の最新の状態をデータベースに書き込みます。次回起動時には、ECSのワールド状態をデータベースからロードして復元できます。
• コンポーネントをカテゴリ別に分類することは、プロジェクト内のエンティティデータを明確に管理するだけでなく、「永続性が必要」および「メモリ内のみ存在」というデータ境界を制御するのにも役立ちます。
• データベースとのやり取りは通常、専用のマネージャ(StateManagerなど)によって処理され、システムがデータベースの読み書きが必要な場合にそれを介して操作されます。これにより、システムがSQLや類似の低レベルな文を直接書き込むことを避けることができます。
• このように、ECSの論理的な効率と柔軟性、およびデータベースによってもたらされる持続性、中断再開、およびデータ統計分析の利点を同時に享受することができます。
全体のアーキテクチャのハイライトは次のとおりです:
以下の通り:
同時に、開発プロセス中に新機能を追加したい場合、他のシステムに影響を与えることなく、必要な機能を簡単にロードすることができます。
私の個人的な視点からは、これは非常にモジュール化されたフレームワークであり、優れたパフォーマンスを発揮します。コードの品質も非常に高く、良い設計ドキュメントが含まれています。残念ながら、Project89はこのフレームワークに対する可視性とプロモーションが不足しており、そのために私はこの記事を書くのに4日間かかりました。優れた技術は認知される価値があると信じていますので、明日、この記事の英語版をリリースして、ゲームチームとDeFi(分散型金融)開発者の間での認識を高める予定です。より多くのチームが自身のプロジェクトの潜在的なアーキテクチャの選択肢としてこのフレームワークを探求することを願っています!
Mời người khác bỏ phiếu
転送元のオリジナルタイトル:プロジェクト89で次世代エージェントフレームワークを見る
要点をお伝えすると、@project_89エージェントフレームワークを設計するためのまったく新しいアプローチを採用しています。これは、ゲーム開発専用の高性能エージェントフレームワークです。現在使用されているエージェントフレームワークと比較して、よりモジュール化され、より優れたパフォーマンスを提供します。
この記事は書くのに長い時間がかかり、従来のエージェントフレームワークと比較してこのフレームワークがどのようなアーキテクチャのアップグレードを行ったかを皆に理解してもらおうとしています。このバージョン以前に何度も改訂されてきましたが、記事の中にはまだわかりにくい部分があります。技術的な問題により、さらに普及させることができませんでした。記事の改善についてご意見がありましたら、コメントを残してください。
この技術ブログであるため、まず創設者の技術的な専門知識を見てみましょう。
Project89に取り組む前に、創設者はこのプロジェクトを開発しました:https://github.com/Oneirocom/Magick, これはまた、AIパワードのプログラミングソフトウェアでもあります。さらに、ショーはこのプロジェクトの第4位のトップ開発者としてランク付けされています。また、ショーのポートフォリオでもこのプロジェクトを見ることができます。
左上: project89の創設者;右下: 'lalaune'はai16zのショーです
本日は、プロジェクト89の高パフォーマンスエージェントフレームワークについて主に紹介します:
https://github.com/project-89/argOS
ゲーム分野での応用の観点から
ECSアーキテクチャを現在使用しているゲームには、次のものが含まれています:
ブロックチェーンゲーム:Mud、Dojo
伝統的なゲーム:Overwatch、Star Citizenなど
さらに、主流のゲームエンジンはUnityなどのECSアーキテクチャに向かって進化しています。
ECS(Entity-Component-System)は、ゲーム開発やシミュレーションシステムで一般的に使用されるアーキテクチャパターンです。大規模なスケーラブルなシナリオで、データとロジックを効率的に分離して、さまざまなエンティティとその振る舞いを管理します。
エンティティ
• 単なるID(数値または文字列)で、データまたはロジックを含んでいません。
• 必要に応じて、さまざまなプロパティや機能を持つように、異なるコンポーネントをマウントすることができます。
コンポーネント
・特定のデータまたはエンティティの状態を保存するために使用されます。
システム
• あるコンポーネントに関連するロジックの実行を担当します。
このシステムを理解するために、エージェントアクションの具体的な例を使いましょう。
ArgOSでは、各エージェントはエンティティと見なされ、異なるコンポーネントを登録できます。例えば、下の画像では、当社のエージェントには次の4つのコンポーネントがあります:
エージェントコンポーネント:エージェントの名前、モデル名などの基本情報を主に保存します。
知覚コンポーネント:主に外部の知覚データを保存するために使用されます
メモリコンポーネント:エージェントエンティティのメモリデータ、同様のことが行われたものなどを主に保存するために使用されます。
アクションコンポーネント:主に実行されるアクションデータを保存します
システムのワークフロー:
次に、各コンポーネントのデータが更新されたUpdate Agent Entityを取得します。
4. そのため、ここではシステムが主に、どのコンポーネントに対して対応する処理ロジックを実行するかを定義する責任があります。
そして、project89ではさまざまな種類のエージェントで満ちた世界であることは明らかです。例えば、一部のエージェントは上記の基本的な能力だけでなく、計画を立てる能力も持っています。
その後、下の画像のようになります:
しかし、あるシステムが別のシステムを直接トリガーする従来のフレームワーク(例えば、記憶システムを呼び出す知覚システム)とは異なり、Project89では、システムは互いに直接呼び出さない。代わりに、各システムは一定の時間間隔で独立して実行されます。例えば:
これまで、この記事ではArgOSのアーキテクチャを大幅に簡略化して理解しやすくしてきました。さて、実際のArgOSシステムをもう少し詳しく見てみましょう。
Agentがより深く考えることや、より複雑なタスクを実行するために、ArgOSは多くのコンポーネントと多くのシステムを設計しています。
そして、ArgOSはシステムを「三つのレベル」(ConsciousnessLevel)に分割します:
1) CONSCIOUS system
2) 潜在意識(SUBCONSCIOUS)システム
3) 無意識(UNCONSCIOUS)システム
そのため、ArgOSでは、意識レベルに応じて異なるシステムが分割され、そのシステムが実行される頻度が定められます。
なぜこのように設計されているのですか?
様々なシステム間の関係はArgOS内で非常に複雑であり、以下のように示されています:
刺激が大幅に変化するかどうかを判断し、安定性、処理モード(アクティブ/リフレクティブ/ウェイティング)に基づいて更新してください。
最終的に、「現在の知覚」データは、後続のExperienceSystem、ThinkingSystemなどに提供されます。
2.経験システムは、知覚システムによって収集された刺激をより抽象的な「経験」に変換します。
LLMまたはルールロジック(extractExperiences)は、新しい経験を特定してMemoryコンポーネントに保存するために呼び出されます。
重複排除、フィルタリング、および経験の検証を行いながら、eventBusを介して他のシステムや外部リスナーに「経験」イベントをトリガーします。
3. ThinkingSystemはエージェントの内部思考プロセスを表しています。
コンポーネント(MemoryおよびPerceptionなど)から現在の状態を抽出し、「generateThought(…)」およびLLM/ruleロジックを使用して「ThoughtResult」を生成します。
思考結果に基づいて、それは次のようになる可能性があります:
• メモリー(思考履歴)の中の思考を更新します。
• 新しいアクションをトリガーします(Action.pendingAction[eid]に入れます)。
・エージェントの外部の見た目(表情、姿勢など)を変更し、関連する刺激を生成して、他のエンティティに変更を「見せる」。
4.アクションシステムは、もし...なら、アクションを実行しますAction.pendingAction空ではありません、使用中ですruntime.getActionManager().executeAction(…).
実行後、結果を Action.lastActionResult に書き戻し、部屋や他のエンティティに通知します。
これにより、CognitiveStimulus(認知刺激)が生成され、その後のシステムが行動が完了したことを「知る」か、記憶に組み込むことができます。
5. GoalPlanningSystemは、Goal.current[eid]リストの目標の進捗を定期的に評価するか、外部/自己のメモリで重要な変更をチェックします(detectSignificantChanges)。
新しい目標または目標の調整が必要な場合は、generateGoals(...)を介してGoal.current [eid]を生成して書き込みます。
同時に、進行中の目標(in_progress)が更新されます。完了または失敗条件が満たされると、状態が変更され、対応するプランに完了/失敗の信号が送信されます。
6. PlanningSystemは、「既存の目標」(Goal.current[eid])のために計画(実行計画)を生成または更新します。
一部の目標に対応するアクティブな計画がないことが検出された場合は、generatePlan(...)を通じていくつかのステップを含む実行ロードマップを生成し、Plan.plans[eid]に書き込んでください。
目標が達成または失敗した場合、それに関連する計画のステータスも更新され、対応する認知刺激が生成されます。
7.RoomSystemは部屋に関連する更新を処理します:
• 部屋の居住者のリスト(居住者)を取得し、各エージェントのために「外見」の刺激を生成して他のエンティティに彼の外見や行動を「見せる」。
• ルーム環境の刺激(例:適切な「部屋の雰囲気」情報)を作成して相関させます。
エージェントが特定の空間環境にいるとき、その空間を感知している他のエンティティは、彼の外見の変化に気付くことができるようにしてください。
8.CleanupSystemは定期的にCleanupコンポーネントでマークされたエンティティを検出し、削除します。これは、不要になった刺激やその他のオブジェクトをリサイクルするために使用され、大量の無効なエンティティがECSに残されるのを防ぐためです。
以下のシーンの例では、各システムが1ラウンド(またはいくつかのフレーム)で完全なプロセスを完了するためにどのように協力するかを示しています。
シーンの準備:世界にはエージェント(EID=1)があり、それは「アクティブ」な状態で、部屋(EID=100)にいます。
この部屋には新しいプロップ「MagicSword」が現れ、それに対応する刺激が生成されました。
「マジックソードを見つけたので、拾って何ができるか見てみるかもしれません...」思考結果には、実行するアクションが含まれています: {tool: 'pickUpItem'、parameters: {itemName: 'MagicSword'}}
ThinkingSystemは、このActionをAction.pendingAction[1]に書き込みます。
外見に変化がある場合(例:“好奇心をそそる表情”など)、外見が更新され、視覚刺激が生成されます。
4.ActionSystemはAction.pendingAction[1] = { tool: "pickUpItem", parameters: ... }と認識します。
runtime.getActionManager().executeAction("pickUpItem", 1, { itemName: "MagicSword" }, runtime).Get the result: { success: true, message: "You picked up the magic sword" }, update to Action.lastActionResult[1], and trigger the "action" event to be broadcast to the room (100) を実行して、「pickup」アクションロジックを実行します。
同時に、認知刺激(type =”action_result”)が生成され、Memoryに書き込まれるか、次のターンでThinkingSystemによってキャプチャされます。
5. ゴール計画システム(エージェントに目標がある場合)は定期的にエージェントの目標を評価します。この時点でエージェントの目標の1つが「強力な武器を入手する」であり、マジックソードが入手されたことが検出された場合、目標は完了とマークされるかもしれません。もし新しい変更(例えば「部屋に新しいオブジェクトが現れる」がエージェントが追求している目標に影響を与える)が発生した場合、新しい目標を生成したり、古い目標を放棄することもあります。
6.計画システム(関連する目標がある場合)は、「強力な武器の入手」といった完了したまたは新たに生成された目標に対して、新しい計画が必要か、既存の計画を更新するかをチェックします。
完了した場合、関連するプランの[status]を「completed」に設定するか、目標が後続のプロセス(「魔剣の研究」)を拡大する場合は、さらなるステップを生成します。
7.RoomSystemは、部屋(100)の占有者および可視エンティティのリストを更新します(すべてのフレームまたはラウンドごとに)。
エージェント(1)の外観が変化した場合(例: Appearance.currentAction = “holding sword”)、同じ部屋にいる他のAgent2とAgent3に「エージェント1が剣を拾った」と知らせるために新しい「外観」視覚刺激を作成します。
8. CleanupSystemは、マークされたエンティティや刺激を削除します(クリーンアップ)。 “MagicSword”刺激を拾った後、もう必要ない場合は、CleanupSystemで対応する刺激エンティティを削除できます。
• 環境の変化を認識する(認知)→ 記録または内的な経験に変換する(経験)→ 自己の思考と意思決定(思考)→ 行動に移す(行動)→ 目標と計画を動的に調整する(ゴールプランニング+計画)→ 環境を同期させる(ルーム)→ 不要なエンティティを適時にリサイクルする(クリーンアップ)
ECSでは、各エンティティに複数のコンポーネントを持たせることができます。システム内での性質やライフサイクルに応じて、コンポーネントは大まかに以下のカテゴリに分けることができます:
1.コアアイデンティティクラス(アイデンティティレベルのコンポーネント)
• エージェント / プレイヤープロフィール / NPCプロフィールなど。
• エンティティを一意に識別し、コアロールまたはユニット情報を格納し、一般的にデータベースに永続化する必要があります。
2.動作と状態のコンポーネント
• アクション、ゴール、プラン、プロセス状態など。
• 現在のエンティティが試行していること、目標、および外部コマンドや内部思考への応答状態を表します。
• 保留中のアクション、進行中の目標、計画、キュー内の思考やタスクなどが含まれています。
• 典型的には中長期の状態であり、多くはゲームのラウンドやビジネスサイクルの間に動的に変化します。
• ストッキングが必要かどうかは状況によります。ブレークポイント後に実行を続けたい場合は、定期的にデータベースに書き込むことができます。
3. 感覚&記憶コンポーネント
• 感知、記憶、刺激、経験など。
• エンティティによって知覚された外部情報(刺激)と、知覚後にそれに洗練された体験(経験)を記録します。
• メモリはしばしば会話の記録、イベント履歴など大量のデータを蓄積することができます。それらを永続化することがしばしば必要です。
• 感覚はリアルタイムまたは一時的な情報であり、大部分は短期間に有効です。必要に応じてデータベースに書き込むかどうかを決定できます(たとえば、重要な感覚イベントのみを保存する場合など)。
4.環境と空間クラス(Room、OccupiesRoom、Spatial、Environment、Inventoryなど)
• 部屋、環境、場所、オブジェクトコンテナなどの情報を表します。
•Room.id, OccupiesRoom、環境などのフィールドはしばしば永続化する必要があります。たとえば、ルームのホームページの説明、地図構造などです。
• コンポーネントの変更(例えば、エンティティが部屋間を移動する場合)はイベント単位で、または定期的に記述することができます。
5.外観とインタラクションクラス(外観、UIState、関係など)
・アバターやポーズ、表情、他のエンティティとのソーシャルリレーションシップネットワークなど、エンティティの外部の「可視」または「インタラクティブ」な部分を記録します。
• 一部はメモリ内のみで処理される場合があります(リアルタイム表現)、一方、他の部分(たとえば主要な社会関係)は永続化される場合があります。
6.ユーティリティ&メンテナンスコンポーネント(クリーンアップ、DebugInfo、ProfilingDataなど)
• リサイクルが必要なエンティティ(クリーンアップ)をマークするために使用され、モニタリングおよび分析に使用するためのデバッグ情報(DebugInfo)を記録するために使用されます。
• 通常はメモリ上にのみ存在し、ログ記録や監査のために必要な場合を除いて、データベースとは同期されません。
既に上記で紹介されています
コンポーネントとシステムに加えて、追加のリソース管理層が必要です。この層はデータベースアクセス、状態の競合、およびその他の重要な操作を処理します。
左側: システム (PerceptionSystem, ExperienceSystem, ThinkingSystem, etc.):
• 各システムは、ECSループ内のSimulationRuntimeによる実行がスケジュールされ、それぞれが関心のあるエンティティ(コンポーネント条件を介して)のクエリと処理を行います。
• ロジックを実行する際には、次のようなマネージャーとやり取りする必要があります:
Right Side: マネージャー (EventBus、RoomManager、StateManager、EventManager、ActionManager、PromptManagerなど):
• システムレベルの機能を提供します。これらは基本的にはロジックを積極的に「駆動」するのではなく、システムまたはランタイムによって呼び出されます。
• 典型的な例:
• すべてのシステムの「スケジューラー」であり、異なるレベル(意識/無意識など)でシステムサイクルを開始または停止します;
• マネージャーは建設フェーズ中にも作成され、それぞれのシステムに渡されて使用されます。
• 特に、エンティティを再利用する際にコンポーネントまたはイベントの購読を同期的に削除するために使用されるComponentSync(CS)ともやり取りします。
結論として:
各システムは必要な時に対応するマネージャーを介してデータを読み書きしたりサービスを呼び出したりします。ランタイムは上位レベルですべてのシステムとマネージャーのライフサイクルと動作を一元的にスケジュールします。
ECSシステムでは、システムが実際のロジック実行を処理し、データベース操作(読み取り/書き込み)は永続性マネージャ(PersistenceManager / DatabaseManager)またはステートマネージャ(StateManager)を介して管理されます。一般的なプロセスは次のようになります。
• StateManager / PersistenceManager は、エージェント、ルーム、ゴールなどのコア永続化コンポーネントのデータをデータベースからロードし、対応するエンティティ (エンティティ) を作成し、関連するコンポーネントフィールドを初期化します。
• たとえば、エージェントレコードのバッチを読み込んでECSワールドに挿入し、それらのためにエージェント、メモリ、ゴールなどのコンポーネントを初期化します。
2.ECSランタイム(システムの更新ループ)
• システムは各フレーム(またはラウンド)で処理を行います:PerceptionSystemは「知覚」を収集し、それらをPerceptionコンポーネントに書き込みます(主にライブラリの短期的なもの)。
ExperienceSystemは、新しい「認知体験」をMemory.experiencesに書き込みます。それが重要な体験である場合、即時の保存のためにStateManagerを呼び出すか、「needsPersistence」でマークして後続のバッチ書き込みのためにマークする場合もあります。
ThinkingSystem / ActionSystem / GoalPlanningSystemなどは、コンポーネントの内容に基づいて決定を行い、ECSのフィールドを更新します。
いくつかのコンポーネント(Goal.currentなど)が大幅な変更を受け、永続性(新しい長期目標など)を必要とする場合は、コンポーネントのリスニングやシステムイベントを通じてこのフィールドをデータベースに書き込むためにStateManagerに通知してください。
3.定期的またはイベント駆動の永続性
• ターゲットの計画が更新された場合やエージェントで重要なイベントが発生した場合など、システム内の特定のキーポイントでPersistenceManager.storeComponentData(eid、”Goal”)などのインターフェースを呼び出すことで、ライブラリをドロップできます。
• StateManagerはCleanupSystemまたはタイマーで「needsPersistence」タグを持つコンポーネントまたはエンティティをスキャンし、一度にデータベースに書き込むこともできます。
• また、ログや監査データ(アクション履歴、思考ログなど)もここにアーカイブおよび保存できます。
4.マニュアルまたはシャットダウン保存(チェックポイントと終了時の永続性)
• サーバーまたはプロセスをシャットダウンする場合は、StateManager.saveAll()を使用して書き込まれていないデータを一括してデータベースに書き込み、次回ロードされるときにECSの状態を復元できるようにします。
• 一部のスタンドアロン/オフラインシナリオでは、アーカイブは手動でトリガーすることもできます。
以下は、コンポーネントとデータベースが相互作用する可能性のある方法を示すための簡単なシナリオです。
1.スタートアップフェーズ:StateManager.queryDB("SELECT * FROM agents")→エージェントレコードのバッチを取得し、順番に各レコードごとにエンティティ(EID=x)を作成し、エージェント、メモリ、ゴールなどのコンポーネントフィールドを初期化します。
同時に、「rooms」テーブルからルーム情報をロードし、Roomエンティティを作成します。
2.ランタイム操作:PerceptionSystemは、特定の部屋でイベント「MagicSwordが現れた」を検出し、Perception.currentStimuli[eid]に書き込みます。ExperienceSystemはStimuliをExperienceに変換し、それをMemory.experiences[eid]に割り当てます。ThinkingSystemはMemory、Goal、その他の情報に基づいて次のアクションを決定し、Action.pendingAction[eid]を生成します。ActionSystemがアクションを実行した後、その結果をMemoryまたはAction.lastActionResultに書き込みます。これが重要なプロットイベントである場合、Memory.experiences[eid]の最新部分がneedsPersistenceとしてマークされます。しばらくしてから、StateManagerはMemory.experiences[eid]が「needsPersistence」を持っていることを見つけ、それをデータベースに書き込みます(INSERT INTO memory_experiences…)。
3. 停止またはチェックポイント保存:ECSまたはシステムのスケジューリングに基づいて、StateManager.saveAll() が「サーバーがシャットダウン」されたときに呼び出され、メモリ内のまだ最新の状態である主要なコンポーネントフィールド(Agent、Memory、Goalなど)の最新の状態をデータベースに書き込みます。次回起動時には、ECSのワールド状態をデータベースからロードして復元できます。
• コンポーネントをカテゴリ別に分類することは、プロジェクト内のエンティティデータを明確に管理するだけでなく、「永続性が必要」および「メモリ内のみ存在」というデータ境界を制御するのにも役立ちます。
• データベースとのやり取りは通常、専用のマネージャ(StateManagerなど)によって処理され、システムがデータベースの読み書きが必要な場合にそれを介して操作されます。これにより、システムがSQLや類似の低レベルな文を直接書き込むことを避けることができます。
• このように、ECSの論理的な効率と柔軟性、およびデータベースによってもたらされる持続性、中断再開、およびデータ統計分析の利点を同時に享受することができます。
全体のアーキテクチャのハイライトは次のとおりです:
以下の通り:
同時に、開発プロセス中に新機能を追加したい場合、他のシステムに影響を与えることなく、必要な機能を簡単にロードすることができます。
私の個人的な視点からは、これは非常にモジュール化されたフレームワークであり、優れたパフォーマンスを発揮します。コードの品質も非常に高く、良い設計ドキュメントが含まれています。残念ながら、Project89はこのフレームワークに対する可視性とプロモーションが不足しており、そのために私はこの記事を書くのに4日間かかりました。優れた技術は認知される価値があると信じていますので、明日、この記事の英語版をリリースして、ゲームチームとDeFi(分散型金融)開発者の間での認識を高める予定です。より多くのチームが自身のプロジェクトの潜在的なアーキテクチャの選択肢としてこのフレームワークを探求することを願っています!