LLM für Unity ermöglicht die nahtlose Integration von Large Language Models (LLMs) in die Unity-Engine.
Es ermöglicht die Erstellung intelligenter Charaktere, mit denen Ihre Spieler für ein immersives Erlebnis interagieren können.
Das Paket enthält außerdem ein Retrieval-Augmented Generation (RAG)-System, das eine semantische Suche in Ihren Daten ermöglicht, die zur Erweiterung des Wissens des Charakters verwendet werden kann. LLM für Unity basiert auf der großartigen Bibliothek llama.cpp.
? Getestet auf Unity: 2021 LTS, 2022 LTS, 2023
? Kommende Veröffentlichungen
Kontaktieren Sie uns, um Ihr Projekt hinzuzufügen!
Methode 1: Installation über den Asset Store
Add to My Assets
Window > Package Manager
Packages: My Assets
ausLLM for Unity
-Paket aus, klicken Sie auf Download
und dann Import
Methode 2: Installation mit dem GitHub-Repo:
Window > Package Manager
+
und wählen Sie Add package from git URL
https://github.com/undreamai/LLMUnity.git
und klicken Sie auf Add
Zuerst richten Sie das LLM für Ihr Spiel ein?:
Add Component
und wählen Sie das LLM-Skript aus.Download Model
herunter (~GBs).Load model
(siehe LLM-Modellverwaltung).Dann können Sie jeden Ihrer Charaktere wie folgt einrichten ?♀️:
Add Component
und wählen Sie das LLMCharacter-Skript aus.Prompt
. Sie können den Namen der KI ( AI Name
) und des Spielers ( Player Name
) festlegen.LLM
Feld aus, wenn Sie mehr als ein LLM-GameObject haben.Sie können auch die LLM- und Zeicheneinstellungen nach Ihren Wünschen anpassen (siehe Optionen).
In Ihrem Skript können Sie es dann wie folgt verwenden?:
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 ) ;
.. .
}
}
Sie können auch eine Funktion angeben, die aufgerufen wird, wenn die Modellantwort abgeschlossen ist.
Dies ist nützlich, wenn die Stream
Option für die kontinuierliche Ausgabe aus dem Modell aktiviert ist (Standardverhalten):
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 ) ;
.. .
}
Um den Chat zu stoppen, ohne auf seinen Abschluss zu warten, können Sie Folgendes verwenden:
llmCharacter . CancelRequests ( ) ;
Das ist alles ✨!
Sie können auch:
Um eine Android-App zu erstellen, müssen Sie in den Player-Einstellungen das IL2CPP
-Skript-Backend und ARM64
als Zielarchitektur angeben.
Auf diese Einstellungen kann über das Menü Edit > Project Settings
im Abschnitt Player > Other Settings
zugegriffen werden.
Es ist auch eine gute Idee, die Option Download on Build
im LLM GameObject zu aktivieren, um das Modell beim Start herunterzuladen, um die App-Größe klein zu halten.
Um Ihren Chatverlauf automatisch zu speichern/laden, können Sie den Save
Parameter des LLMCharacter auf den Dateinamen (oder relativen Pfad) Ihrer Wahl festlegen. Die Datei wird im persistentDataPath-Ordner von Unity gespeichert. Dadurch wird auch der Status des LLM gespeichert, sodass die zuvor zwischengespeicherte Eingabeaufforderung nicht neu berechnet werden muss.
Um Ihren Chatverlauf manuell zu speichern, können Sie Folgendes verwenden:
llmCharacter . Save ( " filename " ) ;
und um den Verlauf zu laden:
llmCharacter . Load ( " filename " ) ;
Dabei ist Dateiname der Dateiname oder der relative Pfad Ihrer Wahl.
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 ) ;
.. .
}
Das letzte Argument der Chat
-Funktion ist ein boolescher Wert, der angibt, ob die Nachricht zum Verlauf hinzugefügt werden soll (Standard: 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 ) ;
.. .
}
Hierfür können Sie die async
/ await
-Funktionalität nutzen:
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 ) ;
}
}
Sie können einen Remote-Server verwenden, um die Verarbeitung durchzuführen und Zeichen zu implementieren, die mit ihm interagieren.
Erstellen Sie den Server
So erstellen Sie den Server:
LLM
-Skripts wie oben beschriebenRemote
Option des LLM
und konfigurieren Sie optional die Serverparameter: Port, API-Schlüssel, SSL-Zertifikat, SSL-SchlüsselAlternativ können Sie zur einfacheren Bereitstellung eine Server-Binärdatei verwenden:
windows-cuda-cu12.2.0
. Erstelle die Charaktere
Erstellen Sie ein zweites Projekt mit den Spielfiguren mithilfe des LLMCharacter
-Skripts wie oben beschrieben. Aktivieren Sie die Option „ Remote
“ und konfigurieren Sie den Host mit der IP-Adresse (beginnend mit „http://“) und dem Port des Servers.
Die Embeddings
-Funktion kann verwendet werden, um die Einbettungen einer Phrase zu erhalten:
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
Eine ausführliche Dokumentation zur Funktionsebene finden Sie hier:
LLM for Unity implementiert eine superschnelle Ähnlichkeitssuchfunktion mit einem Retrieval-Augmented Generation (RAG)-System.
Es basiert auf der LLM-Funktionalität und der Approximate Nearest Neighbors (ANN)-Suche aus der usearch-Bibliothek.
Die semantische Suche funktioniert wie folgt.
Erstellen der Daten Sie stellen Texteingaben (eine Phrase, einen Absatz, ein Dokument) bereit, die Sie den Daten hinzufügen können.
Jede Eingabe wird in Blöcke aufgeteilt (optional) und mit einem LLM in Einbettungen codiert.
Suchen Sie können dann nach einer Abfragetexteingabe suchen.
Die Eingabe wird erneut codiert und die ähnlichsten Texteingaben oder Datenblöcke werden abgerufen.
So verwenden Sie die semantische Suche:
Add Component
und wählen Sie das RAG
-Skript aus.SimpleSearch
ist eine einfache Brute-Force-Suche, während DBSearch
eine schnelle ANN-Methode ist, die in den meisten Fällen bevorzugt werden sollte.Alternativ können Sie die RAG aus Code erstellen (wobei llm Ihr LLM ist):
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
In Ihrem Skript können Sie es dann wie folgt verwenden?:
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 ) ;
.. .
}
}
Sie können den RAG-Status speichern (im Ordner Assets/StreamingAssets
gespeichert):
rag . Save ( " rag.zip " ) ;
und laden Sie es von der Festplatte:
await rag . Load ( " rag.zip " ) ;
Mit dem RAG können Sie relevante Daten basierend auf einer Benutzernachricht an das LLM weiterleiten:
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 ) ;
Das RAG
Beispiel enthält eine Beispiel-RAG-Implementierung sowie eine Beispiel-RAG-LLM-Integration.
Das ist alles ✨!
LLM für Unity verwendet einen Modellmanager, der es ermöglicht, LLMs zu laden oder herunterzuladen und sie direkt in Ihrem Spiel zu versenden.
Der Modellmanager ist als Teil des LLM GameObject zu finden:
Sie können Modelle über die Schaltfläche Download model
herunterladen.
LLM for Unity umfasst verschiedene hochmoderne Modelle, die für verschiedene Modellgrößen integriert sind und mit der Q4_K_M-Methode quantisiert werden.
Alternative Modelle können von HuggingFace im .gguf-Format heruntergeladen werden.
Sie können ein Modell lokal herunterladen und mit der Schaltfläche Load model
laden oder die URL im Feld Download model > Custom URL
kopieren, um es direkt herunterzuladen.
Wenn ein HuggingFace-Modell keine gguf-Datei bereitstellt, kann es mit diesem Online-Konverter in gguf konvertiert werden.
Die zur Erstellung der Eingabeaufforderungen verwendete Chat-Vorlage wird automatisch aus dem Modell (falls ein relevanter Eintrag vorhanden ist) oder dem Modellnamen ermittelt.
Bei einer falschen Identifizierung können Sie eine andere Vorlage aus der Dropdown-Liste „Chat-Vorlage“ auswählen.
Im Modellmanager hinzugefügte Modelle werden während des Bauprozesses in das Spiel kopiert.
Sie können den Einbau eines Modells ausschließen, indem Sie das Kontrollkästchen „Erstellen“ deaktivieren.
Um das Modell zu entfernen (aber nicht von der Festplatte zu löschen), können Sie auf die Schaltfläche „Bin“ klicken.
Der Pfad und die URL (falls heruntergeladen) jedes hinzugefügten Modells werden in der erweiterten Ansicht des Modellmanager-Zugriffs mit der Schaltfläche >>
angezeigt:
Sie können leichtere Builds erstellen, indem Sie die Option Download on Build
auswählen.
Mit dieser Option werden die Modelle beim ersten Start des Spiels heruntergeladen, anstatt in den Build kopiert zu werden.
Wenn Sie ein Modell lokal geladen haben, müssen Sie dessen URL über die erweiterte Ansicht festlegen, andernfalls wird es im Build kopiert.
❕ Bevor Sie ein Modell verwenden, überprüfen Sie unbedingt dessen Lizenz ❕
Der Ordner „Samples~“ enthält mehrere Beispiele für Interaktionen ?:
So installieren Sie ein Beispiel:
Window > Package Manager
LLM for Unity
-Paket aus. Klicken Sie auf der Registerkarte Samples
“ neben dem Beispiel, das Sie installieren möchten, auf Import
. Die Beispiele können mit der Scene.unity
-Szene ausgeführt werden, die sie in ihrem Ordner enthalten.
Wählen Sie in der Szene das LLM
GameObject aus und klicken Sie auf die Schaltfläche „ Download Model
, um ein Standardmodell herunterzuladen, oder Load model
um Ihr eigenes Modell zu laden (siehe LLM-Modellverwaltung).
Speichern Sie die Szene, laufen Sie und genießen Sie!
Show/Hide Advanced Options
Schalten Sie um, um die erweiterten Optionen unten anzuzeigen/auszublendenLog Level
Wählen Sie aus, wie ausführlich die Protokollmeldungen sein sollenUse extras
, um zusätzliche Funktionen zu installieren und deren Nutzung zu ermöglichen (Flash-Aufmerksamkeit und IQ-Quants). Remote
Wählen Sie diese Option aus, um Fernzugriff auf das LLM bereitzustellen
Port
-Port zum Ausführen des LLM-Servers (wenn Remote
eingestellt ist)
Num Threads
Anzahl der zu verwendenden Threads (Standard: -1 = alle)
Num GPU Layers
Anzahl der Modellebenen, die auf die GPU verlagert werden sollen. Bei der Einstellung 0 wird die GPU nicht verwendet. Verwenden Sie eine große Zahl, z. B. >30, um die GPU so weit wie möglich zu nutzen. Beachten Sie, dass höhere Werte der Kontextgröße mehr VRAM verbrauchen. Wenn die GPU des Benutzers nicht unterstützt wird, greift das LLM auf die CPU zurück
Debug
Wählen Sie diese Option aus, um die Ausgabe des Modells im Unity-Editor zu protokollieren
Parallel Prompts
Anzahl der Eingabeaufforderungen/Slots, die parallel erfolgen können (Standard: -1 = Anzahl der LLMCharacter-Objekte). Beachten Sie, dass die Kontextgröße auf die Slots aufgeteilt ist. Wenn Sie beispielsweise Parallel Prompts
auf 1 und Slot 0 für alle LLMCharacter-Objekte setzen, wird der vollständige Kontext verwendet, aber der gesamte Prompt muss berechnet werden (kein Caching), wenn ein LLMCharacter-Objekt für den Chat verwendet wird.
Dont Destroy On Load
Wählen Sie diese Option aus, um das LLM-GameObject beim Laden einer neuen Szene nicht zu zerstören API key
API-Schlüssel, der verwendet werden soll, um den Zugriff auf Anforderungen von LLMCharacter-Objekten zu ermöglichen (wenn Remote
festgelegt ist)
Load SSL certificate
ermöglicht das Laden eines SSL-Zertifikats für die Ende-zu-Ende-Verschlüsselung von Anfragen (sofern Remote
eingestellt ist). Erfordert auch einen SSL-Schlüssel.Load SSL key
ermöglicht das Laden eines SSL-Schlüssels für die Ende-zu-Ende-Verschlüsselung von Anfragen (wenn Remote
eingestellt ist). Erfordert auch ein SSL-Zertifikat.SSL certificate path
Das SSL-Zertifikat, das für die Ende-zu-Ende-Verschlüsselung von Anfragen verwendet wird (wenn Remote
eingestellt ist).SSL key path
Der SSL-Schlüssel, der für die Ende-zu-Ende-Verschlüsselung von Anfragen verwendet wird (wenn Remote
eingestellt ist). Download model
Klicken Sie hier, um eines der Standardmodelle herunterzuladen
Load model
Klicken Sie hier, um Ihr eigenes Modell im .gguf-Format zu laden
Download on Start
ermöglicht das Herunterladen der LLM-Modelle beim ersten Start des Spiels. Alternativ werden die LLM-Modelle direkt im Build kopiert
Context Size
Größe des Eingabeaufforderungskontexts (0 = Kontextgröße des Modells)Download lora
Klicken Sie hier, um ein LoRA-Modell im .gguf-Format herunterzuladenLoad lora
Klicken Sie, um ein LoRA-Modell im .gguf-Format zu ladenBatch Size
Batch-Größe für sofortige Verarbeitung (Standard: 512)Model
den Pfad des verwendeten Modells (relativ zum Ordner „Assets/StreamingAssets“).Chat Template
Die Chat-Vorlage, die für das LLM verwendet wirdLora
der Pfad der verwendeten LoRAs (relativ zum Ordner „Assets/StreamingAssets“)Lora Weights
die Gewichte der verwendeten LoRAsFlash Attention
Klicken Sie, um Flash-Aufmerksamkeit im Modell zu verwenden (wenn Use extras
aktiviert ist). Base Prompt
Eine gemeinsame Basis-Eingabeaufforderung zur Verwendung für alle LLMCharacter-Objekte, die das LLM verwenden
Show/Hide Advanced Options
Schalten Sie um, um die erweiterten Optionen unten anzuzeigen/auszublendenLog Level
Wählen Sie aus, wie ausführlich die Protokollmeldungen sein sollenUse extras
, um zusätzliche Funktionen zu installieren und deren Nutzung zu ermöglichen (Flash-Aufmerksamkeit und IQ-Quants). Remote
ob das verwendete LLM remote oder lokal istLLM
das LLM GameObject (wenn Remote
nicht eingestellt ist)Hort
IP des LLM-Servers (wenn Remote
eingestellt ist)Port
-Port des LLM-Servers (falls Remote
eingestellt ist)Num Retries
Anzahl der HTTP-Anforderungswiederholungen vom LLM-Server (wenn Remote
eingestellt ist)API key
API-Schlüssel des LLM-Servers (falls Remote
eingestellt ist)Save
den Dateinamen oder den relativen PfadSave Cache
Wählen Sie diese Option, um den LLM-Status zusammen mit dem Chat-Verlauf zu speichern. Der LLM-Status beträgt typischerweise etwa 100 MB+.Debug Prompt
Wählen Sie diese Option aus, um die erstellten Eingabeaufforderungen im Unity-Editor zu protokollieren Player Name
Der Name des SpielersAI Name
den Namen der KIPrompt
Beschreibung der KI-Rolle Wählen Sie Stream
aus, um die Antwort des Modells bei der Erstellung zu erhalten (empfohlen!).
Wenn es nicht ausgewählt ist, wird die vollständige Antwort des Modells auf einmal empfangen
Num Predict
die maximale Anzahl der vorherzusagenden Token (Standard: 256, -1 = unendlich, -2 = bis der Kontext gefüllt ist)Load grammar
Klicken Sie hier, um eine Grammatik im .gbnf-Format zu ladenGrammar
Der Pfad der verwendeten Grammatik (relativ zum Ordner „Assets/StreamingAssets“).Cache Prompt
speichert die laufende Eingabeaufforderung aus dem Chat (Standard: true)Slot
des Servers, der für die Berechnung verwendet werden soll. Der Wert kann von 0 bis Parallel Prompts
-1 eingestellt werden (Standard: -1 = neuer Slot für jedes Zeichen)Seed
zur Reproduzierbarkeit. Für jedes Mal zufällige Ergebnisse verwenden Sie -1Temperature
LLM-Temperatur, niedrigere Werte ergeben deterministischere Antworten (Standard: 0,2)Top K
Top-K-Sampling (Standard: 40, 0 = deaktiviert)Top P
Top-P-Abtastung (Standard: 0,9, 1,0 = deaktiviert)Min P
Mindestwahrscheinlichkeit für die Verwendung eines Tokens (Standard: 0,05)Repeat Penalty
steuert die Wiederholung von Token-Sequenzen im generierten Text (Standard: 1.1)Presence Penalty
bei wiederholter Token-Anwesenheit (Standard: 0,0, 0,0 = deaktiviert)Frequency Penalty
für wiederholte Token-Häufigkeitsstrafe (Standard: 0,0, 0,0 = deaktiviert)Tfs_z
: Tail Free Sampling mit Parameter z aktivieren (Standard: 1.0, 1.0 = deaktiviert).Typical P
: Aktivieren Sie die lokal typische Probenahme mit Parameter p (Standard: 1,0, 1,0 = deaktiviert).Repeat Last N
: letzte N Token, die zur Bestrafung von Wiederholungen berücksichtigt werden sollen (Standard: 64, 0 = deaktiviert, -1 = ctx-Größe).Penalize Nl
: Zeilenumbruch-Token bestrafen, wenn die Wiederholungsstrafe angewendet wird (Standard: true).Penalty Prompt
: Aufforderung zum Zweck der Strafauswertung. Kann entweder null
, eine Zeichenfolge oder ein Array von Zahlen sein, die Token darstellen (Standard: null
= ursprüngliche prompt
verwenden).Mirostat
: Mirostat-Sampling aktivieren, um die Verwirrung während der Textgenerierung zu kontrollieren (Standard: 0, 0 = deaktiviert, 1 = Mirostat, 2 = Mirostat 2.0).Mirostat Tau
: Legen Sie die Mirostat-Zielentropie fest, Parameter Tau (Standard: 5,0).Mirostat Eta
: Stellen Sie die Mirostat-Lernrate ein, Parameter eta (Standard: 0,1).N Probs
: Wenn größer als 0, enthält die Antwort auch die Wahrscheinlichkeiten der Top-N-Tokens für jeden generierten Token (Standard: 0).Ignore Eos
: Aktivieren Sie diese Option, um End-of-Stream-Tokens zu ignorieren und mit der Generierung fortzufahren (Standard: false). Die Lizenz von LLM für Unity lautet MIT (LICENSE.md) und verwendet Software von Drittanbietern mit MIT- und Apache-Lizenzen. Für einige im Asset enthaltene Modelle gelten eigene Lizenzbedingungen. Bitte lesen Sie diese, bevor Sie die einzelnen Modelle verwenden. Lizenzen von Drittanbietern finden Sie in (Third Party Notices.md).