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.
En bref • Comment aider • Jeux utilisant LLM pour Unity • Configuration • Comment utiliser • RAG • Gestion des modèles LLM • Exemples • Options • Licence
Multiplateforme ! Windows, Linux, macOS et Android
? Fonctionne localement sans accès à Internet. Aucune donnée ne quitte le jeu !
⚡ Inférence ultra-rapide sur CPU et GPU (Nvidia, AMD, Apple Metal)
? Prend en charge tous les principaux modèles LLM
? Facile à configurer, appelez avec une seule ligne de code
? Utilisation gratuite à des fins personnelles et commerciales
? Testé sur Unity : 2021 LTS, 2022 LTS, 2023
? Sorties à venir
Star le dépôt, laissez-nous un avis et faites connaître le projet !
Rejoignez-nous sur Discord et dites bonjour.
Contribuez en soumettant des demandes de fonctionnalités, des bugs ou même votre propre PR.
ce travail pour permettre des fonctionnalités encore plus cool !
Verdict verbal
Moi, Chatbot : AISYLUM
Âmes sans nom du vide
Meurtre dans l’allée 4
IA de livraison de nourriture capricieuse
Petite amie émotionnelle IA
Affaire classée
Contactez-nous pour ajouter votre projet !
Méthode 1 : Installer à l'aide du magasin d'actifs
Ouvrez la page des ressources LLM pour Unity et cliquez sur Add to My Assets
Ouvrez le gestionnaire de packages dans Unity : Window > Package Manager
Sélectionnez l'option Packages: My Assets
dans la liste déroulante.
Sélectionnez le package LLM for Unity
, cliquez sur Download
puis Import
Méthode 2 : Installer à l'aide du dépôt GitHub :
Ouvrez le gestionnaire de packages dans Unity : Window > Package Manager
Cliquez sur le bouton +
et sélectionnez Add package from git URL
Utilisez l'URL du référentiel https://github.com/undreamai/LLMUnity.git
et cliquez sur Add
Vous allez d’abord configurer le LLM pour votre jeu ? :
Créez un GameObject vide.
Dans l'inspecteur GameObject, cliquez sur Add Component
et sélectionnez le script LLM.
Téléchargez l'un des modèles par défaut avec le bouton Download Model
(~ Go).
Ou chargez votre propre modèle .gguf avec le bouton Load model
(voir Gestion des modèles LLM).
Ensuite, vous pouvez configurer chacun de vos personnages comme suit ?♀️ :
Créez un GameObject vide pour le personnage.
Dans l'inspecteur GameObject, cliquez sur Add Component
et sélectionnez le script LLMCharacter.
Définissez le rôle de votre IA dans l' Prompt
. Vous pouvez définir le nom de l'IA ( AI Name
) et du joueur ( Player Name
).
(Facultatif) Sélectionnez le LLM construit ci-dessus dans le champ 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 ? :
en utilisant LLMUnity ; classe publique MyScript { public LLMCharacter llmCharacter; void HandleReply(stringanswer){// faire quelque chose avec la réponse de modelDebug.Log(reply); } void Game(){// votre fonction de jeu...string message = "Bonjour 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(){// faire quelque chose lorsque la réponse du modèle est complèteDebug.Log("L'IA a répondu"); } void Game(){// votre fonction de jeu...string message = "Bonjour bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted);... }
Pour arrêter le chat sans attendre sa fin, vous pouvez utiliser :
llmCharacter.CancelRequests();
Enfin, dans l'Inspecteur du GameObject de votre script, sélectionnez le LLMCharacter GameObject créé ci-dessus comme propriété llmCharacter.
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("nom de fichier");
et pour charger l'historique :
llmCharacter.Load("nom de fichier");
où filename le nom de fichier ou le chemin relatif de votre choix.
void WarmupCompleted(){// faire quelque chose une fois l'échauffement terminéDebug.Log("L'IA est belle et prête"); } void Game(){// votre fonction de jeu..._ = 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(){// votre fonction de jeu...string message = "Bonjour bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted, false);... }
void Game(){// votre fonction de jeu...string message = "Le chat est absent";_ = llmCharacter.Complete(message, HandleReply, ReplyCompleted);... }
Pour cela vous pouvez utiliser la fonctionnalité async
/ await
:
async void Game(){// votre fonction de jeu...string message = "Bonjour bot!";string réponse = wait llmCharacter.Chat(message, HandleReply, ReplyCompleted);Debug.Log(reply);... }
en utilisant UnityEngine;en utilisant LLMUnity;public class MyScript : MonoBehaviour{LLM llm;LLMCharacter llmCharacter;async void Start(){// désactivez gameObject afin que theAwake ne soit pas appelé immédiatement gameObject.SetActive(false);// Ajoutez un objet LLMllm = gameObject. AddComponent<LLM>();// définit le modèle en utilisant le nom de fichier du modèle.// Le modèle doit être ajouté à le gestionnaire de modèles LLM (voir Gestion des modèles LLM) en le chargeant ou en le téléchargeant.// Sinon le fichier modèle peut être copié directement dans le dossier StreamingAssets.llm.SetModel("Phi-3-mini-4k-instruct-q4.gguf" );// facultatif : vous pouvez également définir les loras de la même manière et définir leur poids (si nécessaire)llm.AddLora("my-lora.gguf");llm.SetLoraWeight(0.5f);// facultatif : vous pouvez définir le modèle de chat du modèle s'il n'est pas correctement identifié// Vous pouvez trouver une liste de modèles de discussion dans ChatTemplate.templates.Keysllm.SetTemplate("phi-3");// facultatif : définir le nombre de threadsllm.numThreads = -1 ;// facultatif : activer le GPU en définissant le nombre de couches de modèle à décharger vers itllm.numGPULayers = 10 ;// Ajouter un objet LLMCharacterllmCharacter = gameObject.AddComponent<LLMCharacter>();// définir l'objet LLM qui gère le modelllmCharacter.llm = llm ;// définir l'invite de caractèrellmCharacter. SetPrompt("Une conversation entre un humain curieux et un assistant d'intelligence artificielle.");// définir l'IA et le joueur namellmCharacter.AIName = "AI";llmCharacter.playerName = "Human";// facultatif : définir le streaming sur false pour obtenir le résultat complet en une seule fois// llmCharacter.stream = true;// facultatif : définir un chemin de sauvegarde// llmCharacter.save = "AICharacter1";// facultatif : activez le cache de sauvegarde pour éviter un nouveau calcul lors du chargement d'un fichier de sauvegarde (nécessite ~ 100 Mo)// llmCharacter.saveCache = true;// facultatif : définir une grammaire// wait llmCharacter.SetGrammar("json.gbnf");// réactiver gameObjectgameObject.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 :
Créez un projet avec un GameObject en utilisant le script LLM
comme décrit ci-dessus
Activez l'option Remote
du LLM
et configurez éventuellement les paramètres du serveur : port, clé API, certificat SSL, clé SSL
Construire et exécuter pour démarrer le serveur
Vous pouvez également utiliser un binaire de serveur pour un déploiement plus facile :
Exécutez la scène ci-dessus depuis l'éditeur et copiez la commande à partir des messages de débogage (en commençant par « Commande serveur : »)
Téléchargez les binaires et les DLL du serveur et extrayez-les dans le même dossier
Recherchez l'architecture qui vous intéresse dans le dossier ci-dessus, par exemple pour Windows et CUDA, utilisez windows-cuda-cu12.2.0
.
Vous pouvez également vérifier l'architecture qui fonctionne pour votre système à partir des messages de débogage (commençant par « Utilisation de l'architecture »).
Depuis la ligne de commande, changez de répertoire vers le dossier d'architecture sélectionné et démarrez le serveur en exécutant la commande copiée ci-dessus.
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 = wait llmCharacter.Embeddings("salut, comment vas-tu ?");
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 :
créez un GameObject pour le LLM comme décrit ci-dessus. Téléchargez l'un des modèles RAG fournis ou chargez le vôtre (de bonnes options peuvent être trouvées dans le classement MTEB).
créer un GameObject vide. Dans l'inspecteur GameObject, cliquez sur Add Component
et sélectionnez le script RAG
.
Dans la liste déroulante Type de recherche du RAG, sélectionnez votre méthode de recherche préférée. 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.
Dans la liste déroulante Chunking Type du RAG, vous pouvez sélectionner une méthode pour diviser les entrées en morceaux. Ceci est utile pour avoir une signification plus cohérente au sein de chaque partie de données. Des méthodes de regroupement pour diviser en fonction de jetons, de mots et de phrases sont fournies.
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 ? :
en utilisant LLMUnity ;classe publique MyScript : MonoBehaviour{ Chiffon chiffon; async void Game(){...string[] inputs = new string[]{ "Salut ! Je suis un système de recherche.", "Il fait beau. J'aime ça.", "Je suis un système RAG "};// ajouter les entrées au RAGforeach (entrée de chaîne dans les entrées) wait rag.Add(input);// obtenir les 2 entrées les plus similaires et leur distance (différence) par rapport à la requête de recherche (résultats string[], float [] distances) = attendre rag.Search("hello!", 2);// pour obtenir les parties de texte les plus similaires (chnuks), vous pouvez activer l'option returnChunksrag.ReturnChunks(true);(results, distances) = wait 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 :
attendre 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 = "Quel temps fait-il ?"; (string[] similarPhrases, float[] distances) = wait rag.Search(message, 3); string prompt = "Répondez à la requête de l'utilisateur en fonction des données fournies.nn" ; prompt += $"Requête utilisateur : {message}nn" ; invite += $"Données:n" ; foreach (chaîne similarPhrase dans similarPhrases) prompt += $"n- {similarPhrase}"; _ = llmCharacter.Chat(invite, 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 ? :
SimpleInteraction : démontre une interaction simple avec un personnage IA
MultipleCharacters : démontre une interaction simple utilisant plusieurs personnages IA
RAG : échantillon de RAG. Comprend un exemple utilisant le RAG pour transmettre des informations à un LLM
ChatBot : démontre l'interaction entre un joueur et une IA avec une interface utilisateur similaire à une application de messagerie (voir l'image ci-dessous)
KnowledgeBaseGame : jeu de détective simple utilisant une base de connaissances pour fournir des informations au LLM basé sur google/mysteryoftroisbots
AndroidDemo : exemple d'application Android avec un écran initial avec la progression du téléchargement du modèle
Pour installer un exemple :
Ouvrez le gestionnaire de packages : Window > Package Manager
Sélectionnez le package 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-dessous
Log 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
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
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. 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 .gguf
Load lora
cliquez pour charger un modèle LoRA au format .gguf
Batch 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 chat utilisé pour le LLM
Lora
le chemin des LoRA utilisés (par rapport au dossier Assets/StreamingAssets)
Lora Weights
les poids des LoRA utilisés
Flash 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-dessous
Log 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 local
LLM
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 relatif Save 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 joueur
AI Name
le nom de l'IA
Description Prompt
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 .gbnf
Grammar
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 -1
Temperature
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).