Teruskan Judul Asli: Saya Melihat Kerangka Agen Generasi Berikutnya dalam Project89
Untuk langsung ke intinya, @project_89mengadopsi pendekatan yang benar-benar baru dalam merancang Kerangka Agen. Ini adalah Kerangka Agen berkinerja tinggi yang dirancang khusus untuk pengembangan game. Dibandingkan dengan Kerangka Agen yang saat ini digunakan, kerangka ini lebih modular dan menawarkan kinerja yang lebih baik.
Artikel ini membutuhkan waktu yang lama untuk ditulis, mencoba untuk membuat semua orang memahami jenis peningkatan arsitektur apa yang telah dilakukan oleh kerangka kerja ini dibandingkan dengan kerangka kerja Agen tradisional. Sudah direvisi berkali-kali sebelum versi ini, tetapi masih ada beberapa bagian dalam artikel yang terlalu membingungkan. Karena kesulitan teknis, saya tidak dapat mengedukasikannya lebih lanjut. Jika Anda memiliki saran untuk meningkatkan artikel ini, silakan tinggalkan komentar Anda.
Sebelum bekerja pada Project89, pendiri mengembangkan proyek ini:https://github.com/Oneirocom/Magick, yang juga merupakan perangkat lunak pemrograman berbasis AI. Selain itu, Shaw menempati peringkat keempat sebagai pengembang teratas proyek ini. Anda juga dapat melihat proyek ini di portofolio Shaw.



Kiri atas: pendiri project89; Kanan bawah: ‘lalaune’ adalah Shaw dari ai16z
Hari ini kami akan terutama memperkenalkan Kerangka Agen berkinerja tinggi dalam proyek89:
https://github.com/project-89/argOS
Permainan yang saat ini menggunakan arsitektur ECS termasuk:
Permainan blockchain: Lumpur, Dojo
Permainan tradisional: Overwatch, Star Citizen, dll.
Selain itu, mesin permainan mainstream sedang berkembang menuju arsitektur ECS, seperti Unity.
Entitas
• Hanya ID (nomor atau string), tidak mengandung data atau logika.
• Anda dapat memasang komponen yang berbeda untuk memberikannya berbagai properti atau kemampuan sesuai kebutuhan.
Komponen
• Digunakan untuk menyimpan data spesifik atau status suatu entitas.
Sistem
• Bertanggung jawab untuk menjalankan logika yang terkait dengan komponen-komponen tertentu.
Mari kita gunakan contoh spesifik dari tindakan Agen untuk memahami sistem ini:
Di ArgOS, setiap Agen dianggap sebagai Entitas, yang dapat mendaftarkan komponen-komponen yang berbeda. Misalnya, pada gambar di bawah ini, Agen kami memiliki empat komponen berikut:
Komponen Agen: terutama menyimpan informasi dasar seperti nama Agen, nama model, dan lain-lain.
Komponen Persepsi: Biasanya digunakan untuk menyimpan data eksternal yang dipersepsikan
Komponen Memori: Digunakan utama untuk menyimpan data Memori dari Entitas Agen, hal-hal serupa yang telah dilakukan, dll.
Komponen Tindakan: Terutama menyimpan data Tindakan yang akan dieksekusi
Alur kerja sistem:

Dan jelas bahwa dalam project89 ini adalah dunia yang penuh dengan berbagai jenis Agen. Misalnya, beberapa Agen tidak hanya memiliki kemampuan dasar di atas tetapi juga memiliki kemampuan untuk membuat rencana.
Maka akan seperti yang ditunjukkan dalam gambar di bawah ini:

Dan ArgOS membagi Sistem menjadi "tiga tingkatan" (ConsciousnessLevel):
Mengandung RoomSystem, PerceptionSystem, ExperienceSystem, ThinkingSystem, ActionSystem, CleanupSystem)- Frekuensi pembaruan biasanya lebih tinggi (misalnya setiap 10 detik).- Pengolahan lebih dekat ke tingkat "waktu nyata" atau "kesadaran", seperti persepsi lingkungan, pemikiran waktu nyata, pelaksanaan tindakan, dll.2) Sistem Bawah Sadar (SUBCONSCIOUS)
Sistem Perencanaan Tujuan, Sistem Perencanaan- Frekuensi pembaruan relatif rendah (misalnya setiap 25 detik).- Menangani logika "berpikir" seperti secara berkala memeriksa/menghasilkan tujuan dan rencana.3) Sistem tak sadar (TIDAK SADAR)
Belum diaktifkan- Frekuensi pembaruan lebih lambat (seperti lebih dari 50 detik),Oleh karena itu, di ArgOS, Sistem-sistem yang berbeda dibagi berdasarkan ConsciousnessLevel untuk menetapkan seberapa sering Sistem ini akan dieksekusi.
Mengapa ini didesain seperti ini?
Karena hubungan antara berbagai sistem di ArgOS sangat kompleks, seperti yang ditunjukkan di bawah ini:

Pada akhirnya, data 'persepsi saat ini' disediakan untuk Sistem Pengalaman berikutnya, Sistem Berpikir, dll.
LLM atau logika aturan (extractExperiences) dipanggil untuk mengidentifikasi pengalaman baru dan disimpan di komponen Memori.
Hapus duplikat, filter, dan verifikasi pengalaman, sekaligus memicu peristiwa "pengalaman" ke sistem lain atau pendengar eksternal melalui eventBus.
Ekstrak status saat ini dari komponen seperti Memori dan Persepsi, dan hasilkan “ThoughtResult” melalui generateThought(…) dan logika LLM/rule.
Berdasarkan hasil pemikiran, mungkin:
• Perbarui pemikiran dalam Memori (sejarah berpikir).
• Memicu tindakan baru (masukkan ke Action.pendingAction[eid]).
• Mengubah Penampilan eksternal agen (ekspresi, postur, dll.) dan menghasilkan Stimulus terkait agar entitas lain dapat “melihat” perubahan tersebut.
Setelah eksekusi, tulis kembali hasilnya ke Action.lastActionResult dan beri tahu ruangan atau entitas lainnya.
Ini juga menghasilkan CognitiveStimulus (stimulasi kognitif) sehingga sistem berikutnya "tahu" bahwa tindakan telah selesai, atau dapat diinkorporasikan ke dalam ingatan.
Ketika sebuah tujuan baru atau penyesuaian tujuan diperlukan, hasilkan dan tulis Goal.current[eid] melalui generateGoals(...).
Pada saat yang sama, tujuan yang sedang berlangsung (in_progress) diperbarui. Jika kondisi penyelesaian atau kegagalan terpenuhi, status diubah, dan sinyal penyelesaian/kegagalan dikirim ke Rencana yang sesuai.
Jika terdeteksi bahwa beberapa tujuan tidak memiliki rencana aktif yang sesuai, hasilkan peta jalan eksekusi yang berisi beberapa langkah melalui generatePlan(…) dan tulis ke Plan.plans[eid].
Ketika tujuan tercapai atau gagal, status Rencana yang terkait dengan itu juga akan diperbarui dan stimulasi kognitif yang sesuai akan dihasilkan.
• Dapatkan daftar penghuni di ruangan (penghuni) dan hasilkan rangsangan "penampilan" untuk setiap agen agar entitas lain "melihat" penampilan atau tindakannya.
• Membuat dan mengkorelasikan Stimulus lingkungan ruangan (misalnya informasi "suasana ruangan" yang sesuai).
Pastikan bahwa ketika Agen berada di lingkungan spasial tertentu, entitas lain yang merasakan ruang tersebut dapat merasakan perubahan pada penampilannya.
8.CleanupSystem secara berkala menemukan dan menghapus entitas yang ditandai dengan komponen Cleanup. Digunakan untuk mendaur ulang Stimulus atau objek lain yang tidak lagi diperlukan untuk mencegah terbentuknya sejumlah besar entitas yang tidak valid dalam ECS.
Persiapan adegan: Ada seorang Agen (EID=1) di Dunia, yang berada dalam keadaan "Aktif" dan berada di Ruangan (EID=100).
Sebuah prop baru “MagicSword” muncul di Ruang ini, dan Stimulus yang sesuai dihasilkan.
ThinkingSystem menulis tindakan ini ke Action.pendingAction [1].
Jika ada perubahan penampilan (misalnya "wajah dengan ekspresi penasaran"), Penampilan diperbarui dan stimulasi visual dihasilkan.
Eksekusi logika tindakan 'pickup' melalui runtime.getActionManager().executeAction('pickUpItem', 1, { itemName: 'MagicSword' }, runtime). Dapatkan hasil: { success: true, message: 'Anda mengambil pedang ajaib' }, perbarui ke Action.lastActionResult[1], dan memicu peristiwa 'action' untuk disiarkan ke ruangan (100).
Pada saat yang sama, stimulus kognitif (type = "action_result") dihasilkan, ditulis ke Memori atau ditangkap oleh ThinkingSystem pada giliran berikutnya.
Sistem Perencanaan Tujuan (jika agen memiliki tujuan) secara berkala mengevaluasi tujuan agen. Jika salah satu tujuan agen saat ini adalah 'mendapatkan senjata yang kuat' dan mendeteksi bahwa MagicSword telah diperoleh, tujuan tersebut dapat ditandai sebagai selesai. Jika terjadi perubahan baru (misalnya, 'objek baru muncul di ruangan' mempengaruhi tujuan yang dikejar oleh agen?), menghasilkan tujuan baru atau mengabaikan tujuan lama berdasarkan deteksiPerubahanSignifikan.
Sistem Perencanaan (jika ada tujuan terkait) memeriksa apakah diperlukan Rencana baru atau Rencana yang sudah ada diperbarui untuk tujuan yang sudah diselesaikan atau yang baru dibuat seperti "Mendapatkan senjata yang kuat".Jika selesai, atur Plan terkait [status] menjadi "selesai", atau hasilkan langkah-langkah lebih lanjut jika tujuannya adalah untuk memperluas proses selanjutnya ("Mengeksplor Pedang Sihir").
RoomSystem memperbarui daftar Penghuni dan entitas yang terlihat di ruangan (100) (setiap frame atau putaran).
Jika penampilan agen(1) berubah (misalnya, Appearance.currentAction = "memegang pedang"), buat rangsangan visual "penampilan" baru untuk memberi tahu Agenn2 dan Agen3 lainnya di ruangan yang sama bahwa "agen1 mengambil pedang".

• Profil Agen / Pemain / Profil NPC, dll.
• Digunakan untuk secara unik mengidentifikasi entitas, menyimpan peran inti atau informasi unit, dan umumnya perlu dipertahankan ke database.
• Aksi, Tujuan, Rencana, Status Proses, dll.
• Mewakili apa yang entitas saat ini mencoba lakukan atau apa tujuannya, serta status responsnya terhadap perintah eksternal dan pemikiran internal.
• Berisi tindakan tertunda, tujuan dalam proses, rencana, dan pemikiran atau tugas dalam antrean, dll.
• Biasanya berada dalam keadaan menengah/pendek, banyak yang berubah secara dinamis selama putaran permainan atau siklus bisnis.
• Apakah diperlukan pengisian persediaan tergantung pada situasi. Jika Anda ingin terus berjalan setelah breakpoint, Anda dapat menulis ke database secara berkala.
• Persepsi, Memori, Stimulus, Pengalaman, dll.
• Merekam informasi eksternal (Stimuli) yang dirasakan oleh entitas, dan pengalaman yang dimurnikan ke dalamnya setelah persepsi (Pengalaman).
• Memori seringkali dapat menyimpan jumlah data yang besar, seperti catatan percakapan, riwayat acara, dll.; ketekunan seringkali diperlukan.
• Persepsi dapat berupa informasi waktu nyata atau sementara, sebagian besar berlaku dalam jangka pendek. Anda dapat memutuskan apakah akan menuliskannya ke database sesuai kebutuhan Anda (misalnya, hanya peristiwa persepsi penting yang disimpan).
• Mewakili informasi seperti ruangan, lingkungan, lokasi, wadah objek, dll.
•Room.id, Ruang Terisi, Lingkungan dan bidang lainnya sering perlu dipertahankan, seperti deskripsi halaman depan ruangan, struktur peta, dll.
• Mengubah komponen (seperti Entitas yang berpindah antar ruangan) dapat ditulis secara peristiwa atau secara berkala.
• Merekam bagian eksternal “terlihat” atau “interaktif” dari entitas, seperti Avatar, pose, ekspresi wajah, jaringan hubungan sosial dengan entitas lain, dll.
• Beberapa bagian mungkin hanya diproses di memori (representasi real-time), sementara bagian lain (seperti hubungan sosial kunci) mungkin dipersistensikan.
• Digunakan untuk menandai entitas yang perlu didaur ulang (Cleanup), atau mencatat informasi debug (DebugInfo) untuk digunakan dalam pemantauan dan analisis.
• Biasanya hanya ada di memori dan jarang disinkronkan ke database kecuali diperlukan untuk logging atau auditing.

Sisi kiri: Sistem (Sistem Persepsi, Sistem Pengalaman, Sistem Berpikir, dll.):
• Setiap sistem dijadwalkan untuk dieksekusi oleh SimulationRuntime dalam loop ECS, mengambil dan memproses entitas yang relevan (melalui kondisi komponen).
• Ketika mengeksekusi logika, Anda perlu berinteraksi dengan Manajer, misalnya:
• Menyediakan fungsi tingkat sistem, yang pada dasarnya tidak secara aktif "mendorong" logika, tetapi dipanggil oleh Sistem atau Runtime.
• Contoh khas:
• Manajer juga dibuat selama fase konstruksi dan diteruskan ke setiap Sistem untuk digunakan.
Kesimpulannya:
Setiap Sistem akan membaca dan menulis data atau memanggil layanan melalui Manajer yang sesuai saat dibutuhkan, dan Runtime akan secara seragam menjadwalkan siklus hidup dan perilaku semua Sistem dan Manajer pada level yang lebih tinggi.
• Misalnya, baca sekelompok catatan agen dan masukkan ke dalam dunia ECS, dan inisialisasi Agen, Memori, Tujuan, dan komponen lainnya untuk mereka.
• Sistem melakukan hal-hal dalam setiap frame (atau putaran): PerceptionSystem mengumpulkan "persepsi" dan menulisnya ke komponen Persepsi (sebagian besar jangka pendek dari perpustakaan).
ExperienceSystem menulis "pengalaman kognitif" baru ke dalam Memory.experiences. Jika ini adalah pengalaman utama, itu juga dapat memanggil StateManager untuk penyimpanan segera, atau menandainya dengan "needsPersistence" untuk penulisan batch berikutnya.
ThinkingSystem / ActionSystem / GoalPlanningSystem, dll. membuat keputusan berdasarkan konten komponen dan memperbarui bidang-bidang dalam ECS.
Jika beberapa komponen (seperti Goal.current) mengalami perubahan besar dan membutuhkan ketahanan (seperti tujuan jangka panjang yang baru), beri tahu StateManager untuk menulis bidang ini ke database melalui pendengaran komponen atau peristiwa sistem.
• Anda dapat memanggil antarmuka seperti PersistenceManager.storeComponentData(eid, “Goal”) untuk menjatuhkan pustaka di titik kunci tertentu dalam sistem (seperti saat rencana target diperbarui atau saat peristiwa penting terjadi pada Agen).
• Anda juga dapat memindai komponen atau entitas dengan tag "needsPersistence" di CleanupSystem atau timer, dan menulisnya kembali ke database sekaligus.
• Selain itu, data log atau audit (seperti riwayat tindakan, log pemikiran) juga dapat diarsipkan dan disimpan di sini.
• Ketika server atau proses harus dimatikan, gunakan StateManager.saveAll() untuk menulis data yang belum ditulis ke database secara seragam untuk memastikan bahwa status ECS dapat dipulihkan saat dimuat kembali nanti.
• Untuk beberapa skenario mandiri/offline, arsip juga dapat dipicu secara manual.
Pada saat yang sama, muat informasi kamar dari tabel 'kamar' dan buat entitas Kamar.
Operasi Runtime: PerceptionSystem mendeteksi kejadian 'MagicSword muncul' di suatu ruangan tertentu dan menulis Perception.currentStimuli[eid]. ExperienceSystem mengkonversi Stimulus menjadi Pengalaman dan menetapkannya ke Memory.experiences[eid]. ThinkingSystem menentukan tindakan selanjutnya berdasarkan Memory, Tujuan, dan informasi lainnya dan menghasilkan Action.pendingAction[eid]. Setelah ActionSystem menjalankan tindakan tersebut, ia menulis hasilnya ke Memory atau Action.lastActionResult. Jika ini adalah kejadian plot utama, bagian terbaru dari Memory.experiences[eid] akan ditandai sebagai needsPersistence. Setelah beberapa waktu, StateManager menemukan bahwa Memory.experiences[eid] memiliki 'needsPersistence' dan menulisnya ke database (INSERT INTO memory_experiences...).
Hentikan atau Periksa Titik Simpan: Berdasarkan jadwal ECS atau sistem, StateManager.saveAll() dipanggil ketika “server dimatikan” untuk menulis status terbaru dari bidang komponen kunci (Agen, Memori, Goal, dll.) yang masih dalam memori ke dalam database. Saat Anda me-reboot, keadaan dunia ECS dapat dimuat dan dipulihkan dari database.
• Mencategorikan komponen tidak hanya memudahkan manajemen data entitas dalam proyek, tetapi juga membantu kami mengontrol batas data antara "membutuhkan ketekunan" dan "hanya ada di memori".
• Interaksi dengan database biasanya ditangani oleh Manajer khusus (seperti StateManager), dan Sistem mengoperasikannya melalui Manajer tersebut saat perlu membaca dan menulis ke database, menghindari langsung menulis pernyataan SQL atau pernyataan tingkat rendah serupa dalam Sistem.
• Dengan cara ini, Anda dapat secara bersamaan menikmati efisiensi logis dan fleksibilitas ECS, serta keuntungan dari ketekunan, melanjutkan titik henti, dan analisis statistik data yang dibawa oleh database.

Sorotan dari seluruh arsitektur adalah:

Pada saat yang sama, jika Anda ingin menambahkan fungsi baru selama proses pengembangan, itu tidak akan memiliki dampak apa pun pada sistem lain, dan Anda dapat dengan mudah memuat fungsi yang Anda inginkan.





