LLM pour Unity permet une intégration transparente des grands modèles de langage (LLM) dans le moteur Unity.
Il permet de créer des personnages intelligents avec lesquels vos joueurs peuvent interagir pour une expérience immersive.
Le package comprend également un système de génération de récupération augmentée (RAG) qui permet d'effectuer une recherche sémantique dans vos données, qui peut être utilisée pour améliorer les connaissances du personnage. LLM pour Unity est construit sur la superbe bibliothèque llama.cpp.
? Testé sur Unity : 2021 LTS, 2022 LTS, 2023
? Sorties à venir
Contactez-nous pour ajouter votre projet !
Méthode 1 : Installer à l'aide du magasin d'actifs
Add to My Assets
Window > Package Manager
Packages: My Assets
dans la liste déroulante.LLM for Unity
, cliquez sur Download
puis Import
Méthode 2 : Installer à l'aide du dépôt GitHub :
Window > Package Manager
+
et sélectionnez Add package from git URL
https://github.com/undreamai/LLMUnity.git
et cliquez sur Add
Vous allez d’abord configurer le LLM pour votre jeu ? :
Add Component
et sélectionnez le script LLM.Download Model
(~ Go).Load model
(voir Gestion des modèles LLM).Ensuite, vous pouvez configurer chacun de vos personnages comme suit ?♀️ :
Add Component
et sélectionnez le script LLMCharacter.Prompt
. Vous pouvez définir le nom de l'IA ( AI Name
) et du joueur ( Player Name
).LLM
si vous disposez de plusieurs GameObjects LLM.Vous pouvez également ajuster les paramètres LLM et de caractère selon vos préférences (voir Options).
Dans votre script vous pouvez alors l'utiliser comme suit ? :
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 ) ;
.. .
}
}
Vous pouvez également spécifier une fonction à appeler lorsque la réponse du modèle est terminée.
Ceci est utile si l'option Stream
est activée pour une sortie continue du modèle (comportement par défaut) :
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 ) ;
.. .
}
Pour arrêter le chat sans attendre sa fin, vous pouvez utiliser :
llmCharacter . CancelRequests ( ) ;
C'est tout ✨ !
Vous pouvez également :
Pour créer une application Android, vous devez spécifier le backend de script IL2CPP
et l' ARM64
comme architecture cible dans les paramètres du lecteur.
Ces paramètres sont accessibles à partir du menu Edit > Project Settings
dans la section Player > Other Settings
.
C'est également une bonne idée d'activer l'option Download on Build
dans LLM GameObject pour télécharger le modèle au lancement afin de réduire la taille de l'application.
Pour enregistrer/charger automatiquement votre historique de discussion, vous pouvez spécifier le paramètre Save
du LLMCharacter au nom de fichier (ou chemin relatif) de votre choix. Le fichier est enregistré dans le dossier persistentDataPath de Unity. Cela enregistre également l'état du LLM, ce qui signifie que l'invite précédemment mise en cache n'a pas besoin d'être recalculée.
Pour enregistrer manuellement votre historique de discussion, vous pouvez utiliser :
llmCharacter . Save ( " filename " ) ;
et pour charger l'historique :
llmCharacter . Load ( " filename " ) ;
où filename le nom de fichier ou le chemin relatif de votre choix.
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 ) ;
.. .
}
Le dernier argument de la fonction Chat
est un booléen qui précise s'il faut ajouter le message à l'historique (par défaut : 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 ) ;
.. .
}
Pour cela vous pouvez utiliser la fonctionnalité 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 ) ;
}
}
Vous pouvez utiliser un serveur distant pour effectuer le traitement et implémenter les personnages qui interagissent avec lui.
Créer le serveur
Pour créer le serveur :
LLM
comme décrit ci-dessusRemote
du LLM
et configurez éventuellement les paramètres du serveur : port, clé API, certificat SSL, clé SSLVous pouvez également utiliser un binaire de serveur pour un déploiement plus facile :
windows-cuda-cu12.2.0
. Créer les personnages
Créez un deuxième projet avec les personnages du jeu à l'aide du script LLMCharacter
comme décrit ci-dessus. Activez l'option Remote
et configurez l'hôte avec l'adresse IP (commençant par "http://") et le port du serveur.
La fonction Embeddings
peut être utilisée pour obtenir les emdeddings d'une phrase :
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
Une documentation détaillée au niveau des fonctions peut être trouvée ici :
LLM pour Unity implémente une fonctionnalité de recherche de similarité ultra-rapide avec un système de génération augmentée par récupération (RAG).
Il est basé sur la fonctionnalité LLM et la recherche des voisins les plus proches (ANN) de la bibliothèque usearch.
La recherche sémantique fonctionne comme suit.
Création des données Vous fournissez des entrées de texte (une phrase, un paragraphe, un document) à ajouter aux données.
Chaque entrée est divisée en morceaux (facultatif) et codée en intégrations avec un LLM.
Recherche Vous pouvez ensuite rechercher une saisie de texte de requête.
L'entrée est à nouveau codée et les entrées de texte ou les morceaux de données les plus similaires sont récupérés.
Pour utiliser la recherche sémantique :
Add Component
et sélectionnez le script RAG
.SimpleSearch
est une simple recherche par force brute, tandis que DBSearch
est une méthode ANN rapide qui devrait être privilégiée dans la plupart des cas.Alternativement, vous pouvez créer le RAG à partir du code (où llm est votre LLM) :
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
Dans votre script vous pouvez alors l'utiliser comme suit ? :
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 ) ;
.. .
}
}
Vous pouvez enregistrer l'état RAG (stocké dans le dossier Assets/StreamingAssets
) :
rag . Save ( " rag.zip " ) ;
et chargez-le depuis le disque :
await rag . Load ( " rag.zip " ) ;
Vous pouvez utiliser le RAG pour transmettre des données pertinentes au LLM en fonction d'un message utilisateur :
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 ) ;
L'exemple RAG
comprend un exemple d'implémentation RAG ainsi qu'un exemple d'intégration RAG-LLM.
C'est tout ✨ !
LLM pour Unity utilise un gestionnaire de modèles qui permet de charger ou de télécharger des LLM et de les expédier directement dans votre jeu.
Le gestionnaire de modèles peut être trouvé dans le cadre du LLM GameObject :
Vous pouvez télécharger des modèles avec le bouton Download model
.
LLM pour Unity comprend différents modèles de pointe intégrés pour différentes tailles de modèles, quantifiés avec la méthode Q4_K_M.
Des modèles alternatifs peuvent être téléchargés depuis HuggingFace au format .gguf.
Vous pouvez télécharger un modèle localement et le charger avec le bouton Load model
, ou copier l'URL dans le champ Download model > Custom URL
pour le télécharger directement.
Si un modèle HuggingFace ne fournit pas de fichier gguf, il peut être converti en gguf avec ce convertisseur en ligne.
Le modèle de discussion utilisé pour créer les invites est déterminé automatiquement à partir du modèle (si une entrée pertinente existe) ou du nom du modèle.
En cas d'identification incorrecte, vous pouvez sélectionner un autre modèle dans la liste déroulante des modèles de discussion.
Les modèles ajoutés dans le gestionnaire de modèles sont copiés dans le jeu pendant le processus de construction.
Vous pouvez omettre la création d'un modèle en décochant la case "Construire".
Pour supprimer le modèle (mais pas le supprimer du disque), vous pouvez cliquer sur le bouton Corbeille.
Le chemin et l'URL (si téléchargé) de chaque modèle ajouté sont affichés dans la vue développée de l'accès au gestionnaire de modèles avec le bouton >>
:
Vous pouvez créer des versions plus légères en sélectionnant l'option Download on Build
.
En utilisant cette option, les modèles seront téléchargés au premier démarrage du jeu au lieu d'être copiés dans la version.
Si vous avez chargé un modèle localement, vous devez définir son URL via la vue développée, sinon il sera copié dans la build.
❕ Avant d'utiliser un modèle, assurez-vous de vérifier sa licence ❕
Le dossier Samples~ contient plusieurs exemples d'interaction ? :
Pour installer un exemple :
Window > Package Manager
LLM for Unity
. Dans l'onglet Samples
, cliquez sur Import
à côté de l'exemple que vous souhaitez installer. Les échantillons peuvent être exécutés avec la scène Scene.unity
qu'ils contiennent dans leur dossier.
Dans la scène, sélectionnez le LLM
GameObject et cliquez sur le bouton Download Model
pour télécharger un modèle par défaut ou Load model
pour charger votre propre modèle (voir Gestion des modèles LLM).
Sauvez la scène, courez et profitez-en !
Show/Hide Advanced Options
Basculer pour afficher/masquer les options avancées ci-dessousLog Level
sélectionnez le niveau de détail des messages du journal.Use extras
sélectionnez pour installer et permettre l'utilisation de fonctionnalités supplémentaires (attention flash et quants IQ) Sélection Remote
pour fournir un accès à distance au LLM
Port Port
pour exécuter le serveur LLM (si Remote
est défini)
Num Threads
nombre de threads à utiliser (par défaut : -1 = tous)
Num GPU Layers
Nombre de couches de modèle à décharger sur le GPU. S'il est défini sur 0, le GPU n'est pas utilisé. Utilisez un grand nombre, c'est-à-dire >30, pour utiliser le GPU autant que possible. Notez que des valeurs de taille de contexte plus élevées utiliseront plus de VRAM. Si le GPU de l'utilisateur n'est pas pris en charge, le LLM reviendra au CPU
Debug
sélectionnez pour enregistrer la sortie du modèle dans l'éditeur Unity
Parallel Prompts
nombre d'invites/slots pouvant se produire en parallèle (par défaut : -1 = nombre d'objets LLMCharacter). Notez que la taille du contexte est répartie entre les emplacements. Par exemple, définir Parallel Prompts
sur 1 et l'emplacement 0 pour tous les objets LLMCharacter utilisera le contexte complet, mais l'invite entière devra être calculée (pas de mise en cache) chaque fois qu'un objet LLMCharacter est utilisé pour le chat.
Dont Destroy On Load
sélectionnez pour ne pas détruire le LLM GameObject lors du chargement d'une nouvelle scène API key
Clé API à utiliser pour autoriser l'accès aux requêtes des objets LLMCharacter (si Remote
est défini)
Load SSL certificate
permet de charger un certificat SSL pour le cryptage de bout en bout des requêtes (si Remote
est défini). Nécessite également une clé SSL.Load SSL key
permet de charger une clé SSL pour le cryptage de bout en bout des requêtes (si Remote
est défini). Nécessite également un certificat SSL.SSL certificate path
le certificat SSL utilisé pour le chiffrement de bout en bout des requêtes (si Remote
est défini).SSL key path
clé SSL utilisée pour le chiffrement de bout en bout des requêtes (si Remote
est défini). Download model
cliquez pour télécharger l'un des modèles par défaut
Load model
cliquez pour charger votre propre modèle au format .gguf
Download on Start
permet de télécharger les modèles LLM au premier démarrage du jeu. Alternativement, les modèles LLM seront copiés directement dans le build
Context Size
taille du contexte d'invite (0 = taille du contexte du modèle)Download lora
cliquez pour télécharger un modèle LoRA au format .ggufLoad lora
cliquez pour charger un modèle LoRA au format .ggufBatch Size
taille du lot pour un traitement rapide (par défaut : 512)Model
le chemin du modèle utilisé (par rapport au dossier Assets/StreamingAssets)Chat Template
le modèle de discussion utilisé pour le LLMLora
le chemin des LoRA utilisés (par rapport au dossier Assets/StreamingAssets)Lora Weights
les poids des LoRA utilisésFlash Attention
cliquez pour utiliser l'attention flash dans le modèle (si Use extras
est activé) Base Prompt
une invite de base commune à utiliser dans tous les objets LLMCharacter utilisant le LLM
Show/Hide Advanced Options
Basculer pour afficher/masquer les options avancées ci-dessousLog Level
sélectionnez le niveau de détail des messages du journal.Use extras
sélectionnez pour installer et permettre l'utilisation de fonctionnalités supplémentaires (attention flash et quants IQ) Remote
que le LLM utilisé soit distant ou localLLM
le LLM GameObject (si Remote
n'est pas défini)Hort
ip du serveur LLM (si Remote
est défini)Port
port du serveur LLM (si Remote
est défini)Num Retries
nombre de tentatives de requête HTTP depuis le serveur LLM (si Remote
est défini)API key
Clé API du serveur LLM (si Remote
est défini)Save
le nom du fichier de sauvegarde ou le chemin relatifSave Cache
sélectionnez pour enregistrer l'état LLM ainsi que l'historique des discussions. L’état LLM est généralement d’environ 100 Mo+.Debug Prompt
sélectionnez pour enregistrer les invites construites dans l'éditeur Unity. Player Name
le nom du joueurAI Name
le nom de l'IAPrompt
du rôle de l'IA Sélectionnez Stream
pour recevoir la réponse du modèle au fur et à mesure de sa production (recommandé !).
Si elle n'est pas sélectionnée, la réponse complète du modèle est reçue en une seule fois
Num Predict
nombre maximum de jetons à prédire (par défaut : 256, -1 = infini, -2 = jusqu'à ce que le contexte soit rempli)Load grammar
cliquez pour charger une grammaire au format .gbnfGrammar
le chemin de la grammaire utilisée (par rapport au dossier Assets/StreamingAssets)Cache Prompt
enregistre l'invite en cours du chat (par défaut : vrai)Slot
du serveur à utiliser pour le calcul. La valeur peut être définie entre 0 et Parallel Prompts
-1 (par défaut : -1 = nouvel emplacement pour chaque personnage)Seed
pour la reproductibilité. Pour des résultats aléatoires à chaque fois, utilisez -1Temperature
Température LLM, les valeurs inférieures donnent des réponses plus déterministes (par défaut : 0,2)Top K
échantillonnage top-k (par défaut : 40, 0 = désactivé)Top P
échantillonnage top-p (par défaut : 0,9, 1,0 = désactivé)Min P
probabilité minimale qu'un jeton soit utilisé (par défaut : 0,05)Repeat Penalty
contrôle la répétition des séquences de jetons dans le texte généré (par défaut : 1.1)Presence Penalty
Pénalité de présence répétée du jeton (par défaut : 0,0, 0,0 = désactivé)Frequency Penalty
Pénalité de fréquence de jeton répétée (par défaut : 0,0, 0,0 = désactivé)Tfs_z
: active l'échantillonnage sans queue avec le paramètre z (par défaut : 1.0, 1.0 = désactivé).Typical P
: active l'échantillonnage typique localement avec le paramètre p (par défaut : 1.0, 1.0 = désactivé).Repeat Last N
: les N derniers jetons à considérer pour pénaliser la répétition (par défaut : 64, 0 = désactivé, -1 = ctx-size).Penalize Nl
: pénalise les jetons de nouvelle ligne lors de l'application de la pénalité de répétition (par défaut : true).Penalty Prompt
: invite aux fins de l’évaluation de la pénalité. Peut être null
, une chaîne ou un tableau de nombres représentant des jetons (par défaut : null
= utiliser prompt
d'origine).Mirostat
: active l'échantillonnage Mirostat, contrôlant la perplexité lors de la génération de texte (par défaut : 0, 0 = désactivé, 1 = Mirostat, 2 = Mirostat 2.0).Mirostat Tau
: définit l'entropie cible du Mirostat, paramètre tau (par défaut : 5.0).Mirostat Eta
: définit le taux d'apprentissage du Mirostat, paramètre eta (par défaut : 0,1).N Probs
: si supérieur à 0, la réponse contient également les probabilités des N premiers tokens pour chaque token généré (par défaut : 0)Ignore Eos
: permet d'ignorer les jetons de fin de flux et de continuer la génération (par défaut : false). La licence de LLM pour Unity est MIT (LICENSE.md) et utilise des logiciels tiers avec des licences MIT et Apache. Certains modèles inclus dans l'actif définissent leurs propres termes de licence, veuillez les consulter avant d'utiliser chaque modèle. Les licences tierces peuvent être trouvées dans (Third Party Notices.md).