In questo articolo mostriamo come utilizzare i LLM (Large Language Models) all’interno del motore Unity 🎮. Utilizzeremo il LLMUnity package e guarda alcuni esempi su come impostare le interazioni delle conversazioni con solo poche righe di codice!
Dichiarazione di non responsabilità: sono l’autore di LLMUnity. Fatemi sapere se avete commenti/suggerimenti aprendo un Problema di GitHub 🤗!
Al momento quasi tutte le interazioni dei giochi per PC si basano su conversazioni a scelta multipla. Questo è un tipo di interazione molto primitivo stabilito fin dagli albori dei giochi per PC. Gli LLM nei giochi possono creare un’esperienza più coinvolgente quanto possono consentire un’interazione intelligente con un elemento o personaggio di un gioco per PC (NPC).
Prendiamo ad esempio Skyrim, uno dei giochi di ruolo di maggior successo in circolazione. Quando incontri per la prima volta Lydia, un NPC con cui potresti trascorrere gran parte del gioco come compagni, hai tre possibili opzioni di dialogo. E se volessi saperne di più su di lei o discutere di altre cose?
È qui che gli LLM possono brillare. Puoi descrivere il ruolo dell’intelligenza artificiale e la loro conoscenza del mondo (che hai già come parte della narrativa del gioco) e possono elevare la conversazione.
La maggior parte delle persone che arrivano su questa pagina avranno familiarità con ChatGPT rilasciato da OpenAI, e avrà potuto constatare quanto sia naturale e potente l’interazione con un LLM. Allora perché non utilizzare direttamente ChatGPT nei giochi?
- Utilizzo di ChatGPT su larga scala costi 💸 . Ogni interazione ha un costo minimo, ma se eseguita su larga scala, per migliaia di utenti con migliaia di interazioni ciascuno, il costo non è trascurabile.
- Crea un dipendenza 🔗. Se per qualsiasi motivo ChatGPT smette di funzionare o i prezzi aumentano e lo sviluppatore non può più permetterselo, il gioco verrà interrotto.
- I LLM open source hanno prestazioni alla pari precisione su ChatGPT 🏎️. Non ho trovato un benchmark standardizzato per dimostrarlo, ma i modelli rilasciati da Meta (Llama) e Mistral sembrano avere una precisione simile a ChatGPT qualitativamente.
- Gli LLM stanno diventando sempre più piccoli misurare 🤏. Il recente Mistral 7B batte il Llama2 13B e surclassa il Llama 34B su molti benchmark. I metodi di quantizzazione spingono ulteriormente questo limite riducendo le dimensioni del modello al punto da poter essere utilizzati su qualsiasi PC e GPU recente. Mistral 7B quantizzato con il metodo Q4_K_M (modello, quantizzazione) richiede al massimo 7 GB di RAM per funzionare!
LLMUnity è un pacchetto che consente di eseguire e distribuire modelli LLM nel motore Unity.
È costruito sopra il fantastico chiamata.cpp libreria che consente di utilizzare LLM senza dipendenze software esterne e lamafile che distribuisce llama.cpp in modo multipiattaforma.
LLMUnity offre le seguenti funzionalità:
- 💻 Multipiattaforma! Supporta Windows, Linux e macOS
- 🏠 Funziona localmente senza accesso a Internet ma supporta anche server remoti
- ⚡ Inferenza rapida su CPU e GPU
- 🤗 Supporto dei principali modelli LLM
- 🔧 Facile da configurare, chiama con un solo codice di riga
- 💰 Utilizzo gratuito sia per scopi personali che commerciali
LLMUnity utilizza a chiamata.cpp server sotto il cofano. Il server riceve richieste POST, esegue l’inferenza su LLM e restituisce la risposta. Il server è compilato in un eseguibile da lamafile e può essere utilizzato su diversi sistemi operativi (Windows, Linux, MacOS) in base a Cosmopolita biblioteca.
LLMUnity implementa un client che invia le richieste POST e passa il risultato all’applicazione Unity.
Il pacchetto LLMUnity può essere installato come pacchetto personalizzato utilizzando l’URL GitHub o come risorsa Unity (in attesa di approvazione dall’archivio risorse). Vengono fornite le istruzioni Qui 🛠️.
Lo sviluppatore può creare un file LLM
o a LLMClient
oggetto di utilizzare la funzionalità LLM. IL LLMClient
gestisce solo la funzionalità client, mentre la classe LLM
la classe eredita il file LLMClient
classe e gestisce inoltre la funzionalità del server.
Lo sviluppatore può quindi specificare il file LLMClient
/ LLM
proprietà:
- richiesta. Questo specifica il ruolo dell’IA.
- nome del giocatore/IA (facoltativo). Il nome del giocatore e dell’IA può essere definito per i personaggi.
- funzionalità di streaming (opzionale). La funzionalità di streaming consente all’applicazione Unity di ricevere l’output così come viene prodotto dal modello in tempo reale. Se disabilitato, l’applicazione Unity riceverà la risposta dal modello quando sarà completamente prodotto.
- altre opzioni di modello (opzionali). Ci sono più opzioni di modello che può essere specificato da utenti esperti utilizzato direttamente dal server llama.cpp.
e inoltre il LLM
solo immobili:
- risorse in esecuzione (facoltativo). È possibile specificare il numero di thread della CPU che possono essere utilizzati dall’applicazione utente e/o il numero di livelli del modello che verranno eseguiti dalla GPU. Se la GPU dell’utente non è supportata, verrà utilizzata la CPU.
A meno che tu non voglia sporcarti le mani, puoi è sufficiente premere “Scarica modello” e definire il prompt 😌!
Adesso passiamo alla parte divertente 🎢!
LLMUnity è scritto in modo da poter essere utilizzato con un codice minimo. Tutto quello che devi fare è costruire a LLM
oggetto e quindi interagire con esso con:
_ = llm.Chat(message, HandleReply, ReplyCompleted);
Dove:
message
: un oggetto stringa che contiene l’input dell’utenteHandleReply
: metodo che prende come input la risposta del modello come tipo stringa. In questa funzione specifichi come gestire la risposta. Se la funzionalità di streaming è abilitata (comportamento predefinito), questa funzione riceverà la risposta in tempo reale così come viene prodotta dal modello, altrimenti riceverà l’intera risposta una volta.ReplyCompleted
(facoltativo): metodo senza argomenti. Questa funzione viene chiamata quando il modello ha finito di produrre la risposta.
Funzionalità di base
Di seguito è mostrato un esempio minimo🚂. Qui inviamo un messaggio “Ciao bot!” e visualizza la risposta del modello nella console:
using UnityEngine;
using LLMUnity;public class MyGame : MonoBehaviour{
public LLM llm;
void HandleReply(string reply){
Debug.Log(reply);
}
void Start(){
_ = llm.Chat("Hello bot!", HandleReply);
}
}
IL Chat
funzione del LLM
viene chiamato e la risposta viene ricevuta in modo asincrono quando viene completata (in modalità streaming o non streaming) dalla funzione HandleReply.
Per creare l’applicazione in Unity è quindi necessario creare una scena con:
- un GameObject per il
LLM
sceneggiatura. Le proprietà dell’oggetto LLM sono esposte in Unity Inspector e possono essere impostate come descritto nella sezione precedente. - un GameObject per il tuo
MyGame
sceneggiatura. Qui collegherai il fileLLM
GameObject creato sopra nel filellm
proprietà nell’Unity Inspector.
E…questo è tutto ✨!
Interazione semplice
Vediamo ora un esempio che dimostra un’interazione di base:
Qui abbiamo una scena con:
- un GameObject per il
LLM
sceneggiatura (come prima) - un GameObject per il
SimpleInteraction
sceneggiatura - un InputField (in verde) che consente all’utente di inserire testo
- un campo di testo (in blu) che riceve la risposta dal modello
IL SimpleInteraction
lo script può essere implementato come segue:
using UnityEngine;
using LLMUnity;
using UnityEngine.UI;public class SimpleInteraction : MonoBehaviour
{
public LLM llm;
public InputField playerText;
public Text AIText;
void Start()
{
playerText.onSubmit.AddListener(onInputFieldSubmit);
playerText.Select();
}
void onInputFieldSubmit(string message)
{
playerText.interactable = false;
AIText.text = "...";
_ = llm.Chat(message, SetAIText, AIReplyComplete);
}
public void SetAIText(string text)
{
AIText.text = text;
}
public void AIReplyComplete()
{
playerText.interactable = true;
playerText.Select();
playerText.text = "";
}
}
Lo script definisce le seguenti funzioni:
Start
: il campo di input playerText viene selezionato all’avvio della scena in modo che l’utente possa inserire il testo. Un ascoltatore è collegato al playerText che chiama ilonInputFieldSubmit
funzione quando il testo viene inviato.onInputFieldSubmit
: quando l’input viene inviato dall’utente, playerText è disabilitato finché il modello non risponde. Il campo di output del modello AIText viene svuotato e quindi viene richiamata la funzione di chat LLM.SetAIText
: questa funzione viene chiamata quando il modello produce una risposta e imposta il testo AIText sul contenuto della risposta.AIReplyComplete
: questa funzione viene chiamata quando il modello ha terminato la risposta. Il playerText viene nuovamente abilitato e svuotato in modo che il giocatore possa inserire l’input successivo.
Così semplice, possiamo avere un’interazione LLM a tutti gli effetti (a tutti gli effetti, non bella, lo so 🙃). Puoi trovare questo esempio in Esempio di SimpleInteraction.
Funzionalità AI multiple
Finora abbiamo visto l’interazione con una singola IA. In pratica avremo più di un NPC in una partita 🤖. La soluzione a questo è crearne uno LLM
oggetto come sopra che gestisce il server ma ne ha altri LLMClient
oggetti per definire comportamenti aggiuntivi per le IA utilizzando prompt diversi.
Un esempio di esempio che mostra questa funzionalità può essere trovato nel file Esempio ServerClient. Questa è un’estensione del codice sopra che utilizza a LLM
oggetto per il primo AI e a LLMClient
oggetto con un prompt diverso per la seconda AI (utilizzando lo stesso server della prima AI).
Chatbot
Il passaggio finale nella creazione di qualcosa di più simile a un gioco è migliorare gli aspetti dell’interfaccia utente così come vorresti che fossero nel tuo gioco 🏰. Non entrerò più nei dettagli qui perché è al di fuori dell’ambito dell’integrazione LLM. Se sei interessato a un’interfaccia utente più complessa, puoi esaminare il file Esempio di ChatBotche crea un’interazione più piacevole simile a un’app di messaggistica.
È tutto! In questa guida abbiamo visto come integrare LLM in Unity utilizzando il pacchetto LLMUnity insieme ad alcuni esempi pratici. Spero che tu lo abbia trovato utile! Sentiti libero di inviarmi qualsiasi domanda/commento/suggerimento per migliorare questo articolo o il pacchetto LLMUnity 🙏.
Nota: se non diversamente specificato, tutte le immagini sono create dall’autore.
Fonte: towardsdatascience.com