LLM untuk Unity memungkinkan integrasi Model Bahasa Besar (LLM) dengan lancar dalam mesin Unity.
Hal ini memungkinkan untuk membuat karakter cerdas yang dapat berinteraksi dengan pemain Anda untuk pengalaman yang mendalam.
Paket ini juga dilengkapi sistem Retrieval-Augmented Generation (RAG) yang memungkinkan untuk melakukan pencarian semantik di seluruh data Anda, yang dapat digunakan untuk meningkatkan pengetahuan karakter. LLM untuk Unity dibangun di atas perpustakaan llama.cpp yang mengagumkan.
? Diuji pada Unity: 2021 LTS, 2022 LTS, 2023
? Rilis Mendatang
Hubungi kami untuk menambahkan proyek Anda!
Metode 1: Instal menggunakan penyimpanan aset
Add to My Assets
Window > Package Manager
Packages: My Assets
dari menu drop-downLLM for Unity
, klik Download
lalu Import
Metode 2: Instal menggunakan repo GitHub:
Window > Package Manager
+
dan pilih Add package from git URL
https://github.com/undreamai/LLMUnity.git
dan klik Add
Pertama, Anda akan menyiapkan LLM untuk game Anda?:
Add Component
dan pilih skrip LLM.Download Model
(~GBs).Load model
(lihat Manajemen model LLM).Kemudian Anda dapat mengatur setiap karakter Anda sebagai berikut ?♀️:
Add Component
dan pilih skrip LLMCharacter.Prompt
. Anda dapat menentukan nama AI ( AI Name
) dan pemain ( Player Name
).LLM
jika Anda memiliki lebih dari satu LLM GameObjects.Anda juga dapat menyesuaikan pengaturan LLM dan karakter sesuai preferensi Anda (lihat Opsi).
Dalam skrip Anda, Anda kemudian dapat menggunakannya sebagai berikut?:
using LLMUnity ;
public class MyScript {
public LLMCharacter llmCharacter ;
void HandleReply ( string reply ) {
// do something with the reply from the model
Debug . Log ( reply ) ;
}
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply ) ;
.. .
}
}
Anda juga dapat menentukan fungsi yang akan dipanggil ketika model balasan telah selesai.
Ini berguna jika opsi Stream
diaktifkan untuk keluaran berkelanjutan dari model (perilaku default):
void ReplyCompleted ( ) {
// do something when the reply from the model is complete
Debug . Log ( " The AI replied " ) ;
}
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply , ReplyCompleted ) ;
.. .
}
Untuk menghentikan obrolan tanpa menunggu selesai, Anda dapat menggunakan:
llmCharacter . CancelRequests ( ) ;
Itu saja ✨!
Anda juga dapat:
Untuk membangun aplikasi Android, Anda perlu menentukan backend skrip IL2CPP
dan ARM64
sebagai arsitektur target di pengaturan pemutar.
Pengaturan ini dapat diakses dari menu Edit > Project Settings
di bagian Player > Other Settings
.
Sebaiknya aktifkan opsi Download on Build
di LLM GameObject untuk mengunduh model saat peluncuran guna menjaga ukuran aplikasi tetap kecil.
Untuk menyimpan/memuat riwayat obrolan Anda secara otomatis, Anda dapat menentukan parameter Save
Karakter LLM ke nama file (atau jalur relatif) pilihan Anda. File disimpan di folder persistenDataPath Unity. Ini juga menyimpan status LLM yang berarti bahwa prompt yang di-cache sebelumnya tidak perlu dihitung ulang.
Untuk menyimpan riwayat obrolan secara manual, Anda dapat menggunakan:
llmCharacter . Save ( " filename " ) ;
dan untuk memuat riwayat:
llmCharacter . Load ( " filename " ) ;
di mana nama file nama file atau jalur relatif pilihan Anda.
void WarmupCompleted ( ) {
// do something when the warmup is complete
Debug . Log ( " The AI is nice and ready " ) ;
}
void Game ( ) {
// your game function
.. .
_ = llmCharacter . Warmup ( WarmupCompleted ) ;
.. .
}
Argumen terakhir fungsi Chat
adalah boolean yang menentukan apakah akan menambahkan pesan ke riwayat (default: true):
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply , ReplyCompleted , false ) ;
.. .
}
void Game ( ) {
// your game function
.. .
string message = " The cat is away " ;
_ = llmCharacter . Complete ( message , HandleReply , ReplyCompleted ) ;
.. .
}
Untuk ini, Anda dapat menggunakan fungsionalitas async
/ await
:
async void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
string reply = await llmCharacter . Chat ( message , HandleReply , ReplyCompleted ) ;
Debug . Log ( reply ) ;
.. .
}
using UnityEngine ;
using LLMUnity ;
public class MyScript : MonoBehaviour
{
LLM llm ;
LLMCharacter llmCharacter ;
async void Start ( )
{
// disable gameObject so that theAwake is not called immediately
gameObject . SetActive ( false ) ;
// Add an LLM object
llm = gameObject . AddComponent < LLM > ( ) ;
// set the model using the filename of the model.
// The model needs to be added to the LLM model manager (see LLM model management) by loading or downloading it.
// Otherwise the model file can be copied directly inside the StreamingAssets folder.
llm . SetModel ( " Phi-3-mini-4k-instruct-q4.gguf " ) ;
// optional: you can also set loras in a similar fashion and set their weights (if needed)
llm . AddLora ( " my-lora.gguf " ) ;
llm . SetLoraWeight ( 0.5f ) ;
// optional: you can set the chat template of the model if it is not correctly identified
// You can find a list of chat templates in the ChatTemplate.templates.Keys
llm . SetTemplate ( " phi-3 " ) ;
// optional: set number of threads
llm . numThreads = - 1 ;
// optional: enable GPU by setting the number of model layers to offload to it
llm . numGPULayers = 10 ;
// Add an LLMCharacter object
llmCharacter = gameObject . AddComponent < LLMCharacter > ( ) ;
// set the LLM object that handles the model
llmCharacter . llm = llm ;
// set the character prompt
llmCharacter . SetPrompt ( " A chat between a curious human and an artificial intelligence assistant. " ) ;
// set the AI and player name
llmCharacter . AIName = " AI " ;
llmCharacter . playerName = " Human " ;
// optional: set streaming to false to get the complete result in one go
// llmCharacter.stream = true;
// optional: set a save path
// llmCharacter.save = "AICharacter1";
// optional: enable the save cache to avoid recomputation when loading a save file (requires ~100 MB)
// llmCharacter.saveCache = true;
// optional: set a grammar
// await llmCharacter.SetGrammar("json.gbnf");
// re-enable gameObject
gameObject . SetActive ( true ) ;
}
}
Anda dapat menggunakan server jarak jauh untuk melakukan pemrosesan dan mengimplementasikan karakter yang berinteraksi dengannya.
Buat servernya
Untuk membuat server:
LLM
seperti dijelaskan di atasRemote
LLM
dan konfigurasikan parameter server secara opsional: port, kunci API, sertifikat SSL, kunci SSLAlternatifnya, Anda dapat menggunakan biner server untuk penerapan yang lebih mudah:
windows-cuda-cu12.2.0
. Buat karakternya
Buat proyek kedua dengan karakter permainan menggunakan skrip LLMCharacter
seperti dijelaskan di atas. Aktifkan opsi Remote
dan konfigurasikan host dengan alamat IP (dimulai dengan "http://") dan port server.
Fungsi Embeddings
dapat digunakan untuk mendapatkan emdeddings dari sebuah frase:
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
Dokumentasi terperinci tentang tingkat fungsi dapat ditemukan di sini:
LLM for Unity mengimplementasikan fungsi pencarian kemiripan super cepat dengan sistem Retrieval-Augmented Generation (RAG).
Hal ini didasarkan pada fungsionalitas LLM, dan pencarian Approximate Nearest Neighbors (ANN) dari perpustakaan usearch.
Pencarian semantik berfungsi sebagai berikut.
Membangun data Anda memberikan input teks (frasa, paragraf, dokumen) untuk ditambahkan ke data.
Setiap masukan dibagi menjadi beberapa bagian (opsional) dan dikodekan ke dalam penyematan dengan LLM.
Pencarian Anda kemudian dapat mencari input teks kueri.
Masukan tersebut dikodekan lagi dan masukan teks atau potongan yang paling mirip dalam data diambil.
Untuk menggunakan pencarian semantik:
Add Component
dan pilih skrip RAG
.SimpleSearch
adalah pencarian brute-force sederhana, sedangkan DBSearch
adalah metode ANN cepat yang lebih disukai dalam banyak kasus.Alternatifnya, Anda dapat membuat RAG dari kode (dengan llm adalah LLM Anda):
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
Dalam skrip Anda, Anda kemudian dapat menggunakannya sebagai berikut?:
using LLMUnity ;
public class MyScript : MonoBehaviour
{
RAG rag ;
async void Game ( ) {
.. .
string [ ] inputs = new string [ ] {
" Hi! I'm a search system. " ,
" the weather is nice. I like it. " ,
" I'm a RAG system "
} ;
// add the inputs to the RAG
foreach ( string input in inputs ) await rag . Add ( input ) ;
// get the 2 most similar inputs and their distance (dissimilarity) to the search query
( string [ ] results , float [ ] distances ) = await rag . Search ( " hello! " , 2 ) ;
// to get the most similar text parts (chnuks) you can enable the returnChunks option
rag . ReturnChunks ( true ) ;
( results , distances ) = await rag . Search ( " hello! " , 2 ) ;
.. .
}
}
Anda dapat menyimpan status RAG (disimpan di folder Assets/StreamingAssets
):
rag . Save ( " rag.zip " ) ;
dan memuatnya dari disk:
await rag . Load ( " rag.zip " ) ;
Anda dapat menggunakan RAG untuk memasukkan data yang relevan ke LLM berdasarkan pesan pengguna:
string message = " How is the weather? " ;
( string [ ] similarPhrases , float [ ] distances ) = await rag . Search ( message , 3 ) ;
string prompt = " Answer the user query based on the provided data. n n " ;
prompt += $" User query: { message } n n " ;
prompt += $" Data: n " ;
foreach ( string similarPhrase in similarPhrases ) prompt += $" n - { similarPhrase } " ;
_ = llmCharacter . Chat ( prompt , HandleReply , ReplyCompleted ) ;
Sampel RAG
mencakup contoh implementasi RAG serta contoh integrasi RAG-LLM.
Itu saja ✨!
LLM untuk Unity menggunakan manajer model yang memungkinkan memuat atau mengunduh LLM dan mengirimkannya langsung ke dalam game Anda.
Manajer model dapat ditemukan sebagai bagian dari LLM GameObject:
Anda dapat mengunduh model dengan tombol Download model
.
LLM untuk Unity mencakup model canggih berbeda yang ada di dalamnya untuk ukuran model berbeda, dikuantisasi dengan metode Q4_K_M.
Model alternatif dapat diunduh dari HuggingFace dalam format .gguf.
Anda dapat mengunduh model secara lokal dan memuatnya dengan tombol Load model
, atau menyalin URL di bidang Download model > Custom URL
untuk langsung mengunduhnya.
Jika model HuggingFace tidak menyediakan file gguf, file tersebut dapat dikonversi ke gguf dengan konverter online ini.
Templat obrolan yang digunakan untuk membuat petunjuk ditentukan secara otomatis dari model (jika ada entri yang relevan) atau nama model.
Jika salah teridentifikasi, Anda dapat memilih template lain dari dropdown template obrolan.
Model yang ditambahkan di manajer model disalin ke game selama proses pembangunan.
Anda dapat menghilangkan model agar tidak dibuat dengan menghapus centang pada kotak "Bangun".
Untuk menghapus model (tetapi tidak menghapusnya dari disk), Anda dapat mengklik tombol bin.
Jalur dan URL (jika diunduh) dari setiap model yang ditambahkan ditampilkan dalam tampilan akses manajer model yang diperluas dengan tombol >>
:
Anda dapat membuat build yang lebih ringan dengan memilih opsi Download on Build
.
Dengan menggunakan opsi ini, model akan diunduh saat pertama kali game dimulai, bukan disalin saat build.
Jika Anda telah memuat model secara lokal, Anda perlu menyetel URL-nya melalui tampilan yang diperluas, jika tidak maka model tersebut akan disalin di build.
❕ Sebelum menggunakan model apa pun pastikan Anda memeriksa lisensinya ❕
Folder Samples~ berisi beberapa contoh interaksi?:
Untuk menginstal sampel:
Window > Package Manager
LLM for Unity
. Dari Tab Samples
, klik Import
di samping sampel yang ingin Anda pasang. Sampel dapat dijalankan dengan adegan Scene.unity
yang ada di dalam foldernya.
Dalam adegan, pilih LLM
GameObject dan klik tombol Download Model
untuk mengunduh model default atau Load model
untuk memuat model Anda sendiri (lihat Manajemen model LLM).
Simpan adegan, jalankan dan nikmatilah!
Show/Hide Advanced Options
Beralih untuk menampilkan/menyembunyikan opsi lanjutan dari bawahLog Level
pilih seberapa panjang pesan lognyaUse extras
untuk menginstal dan izinkan penggunaan fitur tambahan (perhatian kilat dan jumlah IQ) Pilih Remote
untuk memberikan akses jarak jauh ke LLM
Port
port untuk menjalankan server LLM (jika Remote
diatur)
Num Threads
jumlah thread yang akan digunakan (default: -1 = semua)
Num GPU Layers
jumlah lapisan model yang akan dipindahkan ke GPU. Jika disetel ke 0 GPU tidak digunakan. Gunakan angka yang besar yaitu >30 untuk memanfaatkan GPU semaksimal mungkin. Perhatikan bahwa nilai ukuran konteks yang lebih tinggi akan menggunakan lebih banyak VRAM. Jika GPU pengguna tidak didukung, LLM akan kembali ke CPU
Debug
pilih untuk mencatat output model di Unity Editor
Parallel Prompts
jumlah prompt/slot yang dapat terjadi secara paralel (default: -1 = jumlah objek LLMCharacter). Perhatikan bahwa ukuran konteks dibagi di antara slot. misalnya Mengatur Parallel Prompts
ke 1 dan slot 0 untuk semua objek LLMCharacter akan menggunakan konteks penuh, namun keseluruhan prompt perlu dihitung (tanpa cache) setiap kali objek LLMCharacter digunakan untuk obrolan.
Dont Destroy On Load
pilih untuk tidak menghancurkan LLM GameObject saat memuat Scene baru API key
Kunci API yang digunakan untuk mengizinkan akses ke permintaan dari objek LLMCharacter (jika Remote
disetel)
Load SSL certificate
memungkinkan untuk memuat sertifikat SSL untuk enkripsi permintaan ujung ke ujung (jika Remote
diatur). Membutuhkan kunci SSL juga.Load SSL key
memungkinkan untuk memuat kunci SSL untuk enkripsi permintaan end-to-end (jika Remote
diatur). Membutuhkan sertifikat SSL juga.SSL certificate path
sertifikat SSL yang digunakan untuk enkripsi permintaan end-to-end (jika Remote
diatur).SSL key path
kunci SSL yang digunakan untuk enkripsi permintaan end-to-end (jika Remote
diatur). Download model
klik untuk mengunduh salah satu model default
Load model
klik untuk memuat model Anda sendiri dalam format .gguf
Download on Start
memungkinkan untuk mengunduh model LLM saat pertama kali permainan dimulai. Alternatifnya, model LLM akan disalin langsung di build
Context Size
Ukuran konteks prompt (0 = ukuran konteks model)Download lora
klik untuk mengunduh model LoRA dalam format .ggufLoad lora
klik untuk memuat model LoRA dalam format .ggufBatch Size
Ukuran batch untuk pemrosesan yang cepat (default: 512)Model
jalur model yang digunakan (relatif terhadap folder Assets/StreamingAssets)Chat Template
templat obrolan yang digunakan untuk LLMLora
jalur LoRA yang digunakan (relatif terhadap folder Assets/StreamingAssets)Lora Weights
bobot LoRA yang digunakanFlash Attention
klik untuk menggunakan perhatian flash pada model (jika Use extras
diaktifkan) Base Prompt
prompt dasar umum untuk digunakan di semua objek LLMCharacter menggunakan LLM
Show/Hide Advanced Options
Beralih untuk menampilkan/menyembunyikan opsi lanjutan dari bawahLog Level
pilih seberapa panjang pesan lognyaUse extras
untuk menginstal dan izinkan penggunaan fitur tambahan (perhatian kilat dan jumlah IQ) Remote
apakah LLM yang digunakan remote atau lokalLLM
LLM GameObject (jika Remote
tidak disetel)Hort
ip server LLM (jika Remote
diatur)Port
port server LLM (jika Remote
diatur)Num Retries
jumlah percobaan ulang permintaan HTTP dari server LLM (jika Remote
diatur)API key
Kunci API server LLM (jika Remote
disetel)Save
simpan nama file atau jalur relatifSave Cache
pilih untuk menyimpan status LLM beserta history chatnya. Status LLM biasanya sekitar 100MB+.Debug Prompt
pilih untuk mencatat perintah yang dibuat di Unity Editor Player Name
nama pemainAI Name
nama AI tersebutPrompt
tentang peran AI Pilih Stream
untuk menerima balasan dari model saat diproduksi (disarankan!).
Jika tidak dipilih, balasan lengkap dari model akan diterima sekaligus
Num Predict
jumlah maksimum token yang akan diprediksi (default: 256, -1 = tak terhingga, -2 = hingga konteks terisi)Load grammar
klik untuk memuat tata bahasa dalam format .gbnfGrammar
jalur tata bahasa yang digunakan (relatif terhadap folder Assets/StreamingAssets)Cache Prompt
menyimpan prompt yang sedang berlangsung dari obrolan (default: true)Slot
slot server yang digunakan untuk komputasi. Nilai dapat diatur dari 0 hingga Parallel Prompts
-1 (default: -1 = slot baru untuk setiap karakter)Seed
untuk reproduktifitas. Untuk hasil acak setiap kali gunakan -1Temperature
Suhu LLM, nilai yang lebih rendah memberikan jawaban yang lebih deterministik (default: 0,2)Top K
(default: 40, 0 = dinonaktifkan)Top P
(default: 0.9, 1.0 = dinonaktifkan)Min P
probabilitas minimum untuk menggunakan token (default: 0,05)Repeat Penalty
mengontrol pengulangan urutan token dalam teks yang dihasilkan (default: 1.1)Presence Penalty
penalti kehadiran token berulang (default: 0.0, 0.0 = dinonaktifkan)Frequency Penalty
penalti frekuensi token berulang (default: 0,0, 0,0 = dinonaktifkan)Tfs_z
: mengaktifkan pengambilan sampel bebas ekor dengan parameter z (default: 1.0, 1.0 = dinonaktifkan).Typical P
: mengaktifkan pengambilan sampel tipikal lokal dengan parameter p (default: 1.0, 1.0 = dinonaktifkan).Repeat Last N
: N token terakhir yang perlu dipertimbangkan untuk menghukum pengulangan (default: 64, 0 = dinonaktifkan, -1 = ukuran ctx).Penalize Nl
: memberikan penalti pada token baris baru ketika menerapkan penalti berulang (default: true).Penalty Prompt
: prompt untuk tujuan evaluasi penalti. Dapat berupa null
, string, atau array angka yang mewakili token (default: null
= gunakan prompt
asli).Mirostat
: mengaktifkan pengambilan sampel Mirostat, mengendalikan kebingungan selama pembuatan teks (default: 0, 0 = dinonaktifkan, 1 = Mirostat, 2 = Mirostat 2.0).Mirostat Tau
: mengatur entropi target Mirostat, parameter tau (default: 5.0).Mirostat Eta
: mengatur kecepatan pembelajaran Mirostat, parameter eta (default: 0.1).N Probs
: jika lebih besar dari 0, responsnya juga berisi probabilitas N token teratas untuk setiap token yang dihasilkan (default: 0)Ignore Eos
: aktifkan untuk mengabaikan token akhir aliran dan terus menghasilkan (default: false). Lisensi LLM untuk Unity adalah MIT (LICENSE.md) dan menggunakan perangkat lunak pihak ketiga dengan lisensi MIT dan Apache. Beberapa model yang termasuk dalam aset menentukan persyaratan lisensinya sendiri, harap tinjau persyaratan tersebut sebelum menggunakan setiap model. Lisensi pihak ketiga dapat ditemukan di (Pemberitahuan Pihak Ketiga.md).