LLM para Unity permite una integración perfecta de modelos de lenguajes grandes (LLM) dentro del motor de Unity.
Permite crear personajes inteligentes con los que tus jugadores pueden interactuar para una experiencia inmersiva.
El paquete también incluye un sistema de generación aumentada de recuperación (RAG) que permite realizar una búsqueda semántica en sus datos, que puede usarse para mejorar el conocimiento del personaje. LLM para Unity está construido sobre la increíble biblioteca llama.cpp.
? Probado en Unity: 2021 LTS, 2022 LTS, 2023
? Próximos lanzamientos
¡Contáctanos para agregar tu proyecto!
Método 1: instalar usando la tienda de activos
Add to My Assets
Window > Package Manager
Packages: My Assets
en el menú desplegableLLM for Unity
, haga clic en Download
y luego Import
Método 2: instalar usando el repositorio de GitHub:
Window > Package Manager
+
y seleccione Add package from git URL
https://github.com/undreamai/LLMUnity.git
y haga clic en Add
¿Primero configurarás el LLM para tu juego?:
Add Component
y seleccione el script LLM.Download Model
(~GB).Load model
(consulte Gestión de modelos LLM).¿Entonces puedes configurar cada uno de tus personajes de la siguiente manera?♀️:
Add Component
y seleccione el script LLMCharacter.Prompt
. Puedes definir el nombre de la IA ( AI Name
) y el jugador ( Player Name
).LLM
si tiene más de un LLM GameObjects.También puede ajustar el LLM y la configuración de caracteres según sus preferencias (consulte Opciones).
¿En tu script puedes usarlo de la siguiente manera?:
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 ) ;
.. .
}
}
También puede especificar una función para llamar cuando se haya completado la respuesta del modelo.
Esto es útil si la opción Stream
está habilitada para salida continua del modelo (comportamiento predeterminado):
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 ) ;
.. .
}
Para detener el chat sin esperar a que finalice puedes utilizar:
llmCharacter . CancelRequests ( ) ;
¡Eso es todo ✨!
También puedes:
Para crear una aplicación de Android, debe especificar el backend de secuencias de comandos IL2CPP
y ARM64
como arquitectura de destino en la configuración del reproductor.
Se puede acceder a estas configuraciones desde el menú Edit > Project Settings
dentro de la sección Player > Other Settings
.
También es una buena idea habilitar la opción Download on Build
en LLM GameObject para descargar el modelo al iniciarlo y mantener pequeño el tamaño de la aplicación.
Para guardar/cargar automáticamente su historial de chat, puede especificar el parámetro Save
de LLMCharacter en el nombre de archivo (o ruta relativa) de su elección. El archivo se guarda en la carpeta persistenteDataPath de Unity. Esto también guarda el estado del LLM, lo que significa que no es necesario volver a calcular el mensaje previamente almacenado en caché.
Para guardar manualmente su historial de chat, puede usar:
llmCharacter . Save ( " filename " ) ;
y para cargar el historial:
llmCharacter . Load ( " filename " ) ;
donde filename el nombre del archivo o la ruta relativa de su elección.
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 ) ;
.. .
}
El último argumento de la función Chat
es un booleano que especifica si se agrega el mensaje al historial (predeterminado: verdadero):
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 ) ;
.. .
}
Para esto puedes usar la funcionalidad 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 ) ;
}
}
Puedes utilizar un servidor remoto para realizar el procesamiento e implementar personajes que interactúen con él.
Crear el servidor
Para crear el servidor:
LLM
como se describe arribaRemote
del LLM
y opcionalmente configure los parámetros del servidor: puerto, clave API, certificado SSL, clave SSLAlternativamente, puede utilizar un servidor binario para facilitar la implementación:
windows-cuda-cu12.2.0
. Crea los personajes
Crea un segundo proyecto con los personajes del juego usando el script LLMCharacter
como se describe arriba. Habilite la opción Remote
y configure el host con la dirección IP (comenzando con "http://") y el puerto del servidor.
La función Embeddings
se puede utilizar para obtener las incrustaciones de una frase:
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
Puede encontrar documentación detallada sobre el nivel de función aquí:
LLM para Unity implementa una funcionalidad de búsqueda de similitudes súper rápida con un sistema de generación aumentada de recuperación (RAG).
Se basa en la funcionalidad LLM y la búsqueda de vecinos más cercanos aproximados (ANN) de la biblioteca de búsqueda de uso.
La búsqueda semántica funciona de la siguiente manera.
Construyendo los datos Usted proporciona entradas de texto (una frase, párrafo, documento) para agregar a los datos.
Cada entrada se divide en fragmentos (opcional) y se codifica en incrustaciones con un LLM.
Búsqueda Luego puede buscar una entrada de texto de consulta.
La entrada se codifica nuevamente y se recuperan las entradas de texto o fragmentos de datos más similares.
Para utilizar la búsqueda semántica:
Add Component
y seleccione el script RAG
.SimpleSearch
es una búsqueda simple de fuerza bruta, mientras que DBSearch
es un método ANN rápido que debería preferirse en la mayoría de los casos.Alternativamente, puede crear el RAG a partir del código (donde llm es su LLM):
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
¿En tu script puedes usarlo de la siguiente manera?:
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 ) ;
.. .
}
}
Puede guardar el estado de RAG (almacenado en la carpeta Assets/StreamingAssets
):
rag . Save ( " rag.zip " ) ;
y cargarlo desde el disco:
await rag . Load ( " rag.zip " ) ;
Puede utilizar RAG para enviar datos relevantes al LLM en función de un mensaje de usuario:
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 ) ;
El ejemplo RAG
incluye un ejemplo de implementación de RAG, así como un ejemplo de integración de RAG-LLM.
¡Eso es todo ✨!
LLM para Unity utiliza un administrador de modelos que permite cargar o descargar LLM y enviarlos directamente a tu juego.
El administrador de modelos se puede encontrar como parte del LLM GameObject:
Puede descargar modelos con el botón Download model
.
LLM para Unity incluye diferentes modelos de última generación integrados para diferentes tamaños de modelos, cuantificados con el método Q4_K_M.
Se pueden descargar modelos alternativos desde HuggingFace en formato .gguf.
Puede descargar un modelo localmente y cargarlo con el botón Load model
, o copiar la URL en el campo Download model > Custom URL
para descargarlo directamente.
Si un modelo de HuggingFace no proporciona un archivo gguf, se puede convertir a gguf con este convertidor en línea.
La plantilla de chat utilizada para construir las indicaciones se determina automáticamente a partir del modelo (si existe una entrada relevante) o del nombre del modelo.
Si se identifica incorrectamente, puede seleccionar otra plantilla en el menú desplegable de plantillas de chat.
Los modelos agregados en el administrador de modelos se copian al juego durante el proceso de construcción.
Puede omitir la integración de un modelo desmarcando la casilla de verificación "Construir".
Para eliminar el modelo (pero no eliminarlo del disco), puede hacer clic en el botón Papelera.
La ruta y la URL (si se descarga) de cada modelo agregado se muestran en la vista ampliada del acceso al administrador de modelos con el botón >>
:
Puede crear compilaciones más ligeras seleccionando la opción Download on Build
.
Al usar esta opción, los modelos se descargarán la primera vez que se inicie el juego en lugar de copiarse en la compilación.
Si ha cargado un modelo localmente, debe configurar su URL a través de la vista expandida; de lo contrario, se copiará en la compilación.
❕ Antes de usar cualquier modelo asegúrate de revisar su licencia ❕
La carpeta Samples~ contiene varios ejemplos de interacción ?:
Para instalar una muestra:
Window > Package Manager
LLM for Unity
. En la pestaña Samples
, haga clic en Import
junto a la muestra que desea instalar. Las muestras se pueden ejecutar con la escena Scene.unity
que contienen dentro de su carpeta.
En la escena, seleccione LLM
GameObject y haga clic en el botón Download Model
para descargar un modelo predeterminado o Load model
para cargar su propio modelo (consulte Gestión de modelos LLM).
¡Guarda la escena, corre y disfruta!
Show/Hide Advanced Options
Alternar para mostrar/ocultar opciones avanzadas desde abajoLog Level
seleccione qué tan detallados son los mensajes de registroUse extras
seleccione para instalar y permitir el uso de funciones adicionales (atención rápida y cuantificaciones IQ) Selección Remote
para proporcionar acceso remoto al LLM
Port
puerto para ejecutar el servidor LLM (si está configurado Remote
)
Num Threads
número de subprocesos a utilizar (predeterminado: -1 = todos)
Num GPU Layers
número de capas de modelo para descargar a la GPU. Si se establece en 0, la GPU no se utiliza. Utilice un número grande, es decir, >30 para utilizar la GPU tanto como sea posible. Tenga en cuenta que los valores más altos de tamaño de contexto utilizarán más VRAM. Si la GPU del usuario no es compatible, el LLM recurrirá a la CPU
Seleccione Debug
para registrar la salida del modelo en el Editor de Unity
Parallel Prompts
número de mensajes/espacios que pueden ocurrir en paralelo (predeterminado: -1 = número de objetos LLMCharacter). Tenga en cuenta que el tamaño del contexto se divide entre las ranuras. por ejemplo, configurar Parallel Prompts
en 1 y el espacio 0 para todos los objetos LLMCharacter utilizará el contexto completo, pero será necesario calcular el mensaje completo (sin almacenamiento en caché) cada vez que se use un objeto LLMCharacter para el chat.
Dont Destroy On Load
seleccione no destruir el LLM GameObject al cargar una nueva escena API key
Clave API que se utilizará para permitir el acceso a solicitudes de objetos LLMCharacter (si se establece Remote
)
Load SSL certificate
permite cargar un certificado SSL para el cifrado de solicitudes de un extremo a otro (si está configurado Remote
). También requiere clave SSL.Load SSL key
permite cargar una clave SSL para el cifrado de solicitudes de un extremo a otro (si está configurado Remote
). También requiere certificado SSL.SSL certificate path
el certificado SSL utilizado para el cifrado de solicitudes de un extremo a otro (si está configurado Remote
).SSL key path
la clave SSL utilizada para el cifrado de solicitudes de un extremo a otro (si está configurado Remote
). Download model
haga clic para descargar uno de los modelos predeterminados
Load model
haga clic para cargar su propio modelo en formato .gguf
Download on Start
permite descargar los modelos LLM la primera vez que se inicia el juego. Alternativamente, los modelos LLM se copiarán directamente en la compilación.
Context Size
tamaño del contexto de solicitud (0 = tamaño de contexto del modelo)Download lora
haga clic para descargar un modelo LoRA en formato .ggufLoad lora
haga clic para cargar un modelo LoRA en formato .ggufBatch Size
tamaño de lote para procesamiento rápido (predeterminado: 512)Model
la ruta del modelo que se está utilizando (en relación con la carpeta Assets/StreamingAssets)Chat Template
la plantilla de chat que se utiliza para el LLMLora
la ruta de los LoRA que se utilizan (en relación con la carpeta Assets/StreamingAssets)Lora Weights
los pesos de los LoRA que se utilizanFlash Attention
haga clic para usar la atención Flash en el modelo (si Use extras
está habilitado) Base Prompt
Solicitud base común para usar en todos los objetos LLMCharacter que utilizan LLM
Show/Hide Advanced Options
Alternar para mostrar/ocultar opciones avanzadas desde abajoLog Level
seleccione qué tan detallados son los mensajes de registroUse extras
seleccione para instalar y permitir el uso de funciones adicionales (atención rápida y cuantificaciones IQ) Remote
ya sea que el LLM utilizado sea remoto o localLLM
el LLM GameObject (si Remote
no está configurado)Hort
del servidor LLM (si está configurado Remote
)Port
puerto del servidor LLM (si está configurado Remote
)Num Retries
número de reintentos de solicitud HTTP desde el servidor LLM (si está configurado Remote
)API key
Clave API del servidor LLM (si está configurado Remote
)Save
guardar nombre de archivo o ruta relativaSave Cache
seleccione para guardar el estado de LLM junto con el historial de chat. El estado de LLM suele ser de alrededor de 100 MB o más.Debug Prompt
seleccione para registrar los avisos creados en el Editor de Unity Player Name
el nombre del jugador.AI Name
el nombre de la IA.Prompt
de la función de la IA Seleccione Stream
para recibir la respuesta del modelo a medida que se produce (¡recomendado!).
Si no se selecciona, la respuesta completa del modelo se recibe de una vez
Num Predict
el número máximo de tokens a predecir (predeterminado: 256, -1 = infinito, -2 = hasta que se complete el contexto)Load grammar
haga clic para cargar una gramática en formato .gbnfGrammar
la ruta de la gramática que se utiliza (en relación con la carpeta Assets/StreamingAssets)Cache Prompt
guarda el mensaje en curso del chat (predeterminado: verdadero)Slot
del servidor que se utilizará para el cálculo. El valor se puede establecer de 0 a Parallel Prompts
-1 (predeterminado: -1 = nueva ranura para cada carácter)Seed
para reproducibilidad. Para obtener resultados aleatorios cada vez utilice -1Temperature
Temperatura LLM, los valores más bajos dan respuestas más deterministas (predeterminado: 0,2)Top K
top-k (predeterminado: 40, 0 = deshabilitado)Top P
muestreo top-p (predeterminado: 0,9, 1,0 = deshabilitado)Min P
probabilidad mínima para que se utilice un token (predeterminado: 0,05)Repeat Penalty
controla la repetición de secuencias de tokens en el texto generado (predeterminado: 1.1)Presence Penalty
Penalización por presencia repetida del token (predeterminado: 0,0, 0,0 = deshabilitado)Frequency Penalty
Penalización de frecuencia del token repetido (predeterminado: 0,0, 0,0 = deshabilitado)Tfs_z
: habilita el muestreo sin cola con el parámetro z (predeterminado: 1.0, 1.0 = deshabilitado).Typical P
: habilita el muestreo típico local con el parámetro p (predeterminado: 1.0, 1.0 = deshabilitado).Repeat Last N
: últimos N tokens a considerar para penalizar la repetición (predeterminado: 64, 0 = deshabilitado, -1 = tamaño ctx).Penalize Nl
: penaliza los tokens de nueva línea al aplicar la penalización por repetición (predeterminado: verdadero).Penalty Prompt
: aviso a los efectos de la evaluación de la penalización. Puede ser null
, una cadena o una matriz de números que representan tokens (predeterminado: null
= usar prompt
original).Mirostat
: habilita el muestreo de Mirostat, controlando la perplejidad durante la generación de texto (predeterminado: 0, 0 = deshabilitado, 1 = Mirostat, 2 = Mirostat 2.0).Mirostat Tau
: establece la entropía objetivo de Mirostat, parámetro tau (predeterminado: 5.0).Mirostat Eta
: establece la tasa de aprendizaje de Mirostat, parámetro eta (predeterminado: 0,1).N Probs
: si es mayor que 0, la respuesta también contiene las probabilidades de los N tokens principales para cada token generado (predeterminado: 0)Ignore Eos
: habilite ignorar los tokens de fin de transmisión y continuar generando (valor predeterminado: falso). La licencia de LLM para Unity es MIT (LICENSE.md) y utiliza software de terceros con licencias MIT y Apache. Algunos modelos incluidos en el activo definen sus propios términos de licencia; revíselos antes de usar cada modelo. Las licencias de terceros se pueden encontrar en (Third Party Notices.md).