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.
De un vistazo • Cómo ayudar • Juegos usando LLM para Unity • Configuración • Cómo usar • RAG • Gestión de modelos LLM • Ejemplos • Opciones • Licencia
¡Multiplataforma! Windows, Linux, macOS y Android
? Se ejecuta localmente sin acceso a Internet. ¡Ningún dato sale del juego!
⚡ Inferencia increíblemente rápida en CPU y GPU (Nvidia, AMD, Apple Metal)
? Admite todos los modelos principales de LLM
? Fácil de configurar, llame con una sola línea de código
? De uso gratuito tanto para fines personales como comerciales.
? Probado en Unity: 2021 LTS, 2022 LTS, 2023
? Próximos lanzamientos
Destaca el repositorio, déjanos una reseña y corre la voz sobre el proyecto.
Únase a nosotros en Discord y salude.
Contribuya enviando solicitudes de funciones, errores o incluso sus propias relaciones públicas.
¡Este trabajo permitirá características aún más interesantes!
Veredicto verbal
Yo, Chatbot: AISYLUM
Almas sin nombre del vacío
Asesinato en el pasillo 4
IA quisquillosa de entrega de comida
Novia emocional AI
Caso cerrado
¡Contáctanos para agregar tu proyecto!
Método 1: instalar usando la tienda de activos
Abra la página de activos de LLM para Unity y haga clic en Add to My Assets
Abra el Administrador de paquetes en Unity: Window > Package Manager
Seleccione la opción Packages: My Assets
en el menú desplegable
Seleccione el paquete LLM for Unity
, haga clic en Download
y luego Import
Método 2: instalar usando el repositorio de GitHub:
Abra el Administrador de paquetes en Unity: Window > Package Manager
Haga clic en el botón +
y seleccione Add package from git URL
Utilice la URL del repositorio https://github.com/undreamai/LLMUnity.git
y haga clic en Add
¿Primero configurarás el LLM para tu juego?:
Crea un GameObject vacío.
En GameObject Inspector, haga clic en Add Component
y seleccione el script LLM.
Descargue uno de los modelos predeterminados con el botón Download Model
(~GB).
O cargue su propio modelo .gguf con el botón Load model
(consulte Gestión de modelos LLM).
¿Entonces puedes configurar cada uno de tus personajes de la siguiente manera?♀️:
Crea un GameObject vacío para el personaje.
En GameObject Inspector, haga clic en Add Component
y seleccione el script LLMCharacter.
Defina el papel de su IA en el Prompt
. Puedes definir el nombre de la IA ( AI Name
) y el jugador ( Player Name
).
(Opcional) Seleccione el LLM construido anteriormente en el campo 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?:
usando LLMUnity; clase pública MyScript { público LLMCharacter llmCharacter; void HandleReply(string respuesta){// hacer algo con la respuesta del modelDebug.Log(reply); } void Game(){// tu función de juego...string message = "¡Hola robot!";_ = 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(){// hacer algo cuando la respuesta del modelo esté completaDebug.Log("La IA respondió"); } void Game(){// tu función de juego...string message = "¡Hola bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted);... }
Para detener el chat sin esperar a que finalice puedes utilizar:
llmCharacter.CancelRequests();
Finalmente, en el Inspector del GameObject de su script, seleccione el LLMCharacter GameObject creado anteriormente como propiedad llmCharacter.
¡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("nombre de archivo");
y para cargar el historial:
llmCharacter.Load("nombre de archivo");
donde filename el nombre del archivo o la ruta relativa de su elección.
void WarmupCompleted(){// hacer algo cuando se complete el calentamientoDebug.Log("La IA está lista y lista"); } void Game(){// la función de tu juego..._ = 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(){// tu función de juego...string message = "¡Hola bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted, false);... }
void Game(){// tu función de juego...string message = "El gato está fuera";_ = llmCharacter.Complete(message, HandleReply, ReplyCompleted);... }
Para esto puedes usar la funcionalidad async
/ await
:
async void Game(){// tu función de juego...string message = "¡Hola bot!";string texto = await llmCharacter.Chat(message, HandleReply, ReplyCompleted);Debug.Log(respuesta);... }
usando UnityEngine;usando LLMUnity;public class MyScript: MonoBehaviour{LLM llm;LLMCharacter llmCharacter;async void Start(){// deshabilita gameObject para que theAwake no se llame inmediatamentegameObject.SetActive(false);// Agrega un objeto LLMllm = gameObject. AddComponent<LLM>();// establece el modelo usando el nombre de archivo del modelo.// El modelo necesita para agregarlo al administrador de modelos LLM (consulte Gestión de modelos LLM) cargándolo o descargándolo. // De lo contrario, el archivo del modelo se puede copiar directamente dentro de la carpeta StreamingAssets.llm.SetModel("Phi-3-mini-4k-instruct- q4.gguf");// opcional: también puedes configurar loras de manera similar y establecer sus pesos (si need)llm.AddLora("my-lora.gguf");llm.SetLoraWeight(0.5f);// opcional: puedes configurar la plantilla de chat del modelo si no está correctamente identificado// Puedes encontrar una lista de plantillas de chat en ChatTemplate.templates.Keysllm.SetTemplate("phi-3");// opcional: establezca el número de subprocesosllm.numThreads = -1;// opcional: habilite la GPU configurando el número de capas del modelo para descargar en itllm.numGPULayers = 10;// Agregar un objeto LLMCharacterllmCharacter = gameObject.AddComponent<LLMCharacter>();// establecer el objeto LLM que maneja el modelollmCharacter.llm = llm;// establecer el símbolo del carácterllmCharacter. SetPrompt("Una charla entre un humano curioso y un asistente de inteligencia artificial.");// configura la IA y el jugador namellmCharacter.AIName = "AI";llmCharacter.playerName = "Human";// opcional: establece la transmisión en falso para obtener el resultado completo de una sola vez// llmCharacter.stream = true;// opcional: establece una ruta para guardar// llmCharacter.save = "AICharacter1";// opcional: habilite la caché de guardado para evitar un nuevo cálculo al cargar un archivo guardado (requiere ~100 MB)// llmCharacter.saveCache = true;// opcional: establecer una gramática// await llmCharacter.SetGrammar("json.gbnf");// volver a habilitar gameObjectgameObject.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:
Cree un proyecto con un GameObject usando el script LLM
como se describe arriba
Habilite la opción Remote
del LLM
y opcionalmente configure los parámetros del servidor: puerto, clave API, certificado SSL, clave SSL
Construya y ejecute para iniciar el servidor.
Alternativamente, puede utilizar un servidor binario para facilitar la implementación:
Ejecute la escena anterior desde el Editor y copie el comando de los mensajes de depuración (comenzando con "Comando del servidor:")
Descargue los archivos binarios y DLL del servidor y extráigalos en la misma carpeta
Encuentre la arquitectura que le interesa en la carpeta anterior, por ejemplo, para Windows y CUDA, utilice windows-cuda-cu12.2.0
.
También puede verificar la arquitectura que funciona para su sistema en los mensajes de depuración (comenzando con "Usando la arquitectura").
Desde la línea de comando, cambie el directorio a la carpeta de arquitectura seleccionada e inicie el servidor ejecutando el comando copiado desde arriba.
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("hola, ¿cómo estás?");
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:
cree un GameObject para el LLM como se describe anteriormente. Descargue uno de los modelos RAG proporcionados o cargue el suyo propio (puede encontrar buenas opciones en la tabla de clasificación MTEB).
Crea un GameObject vacío. En GameObject Inspector, haga clic en Add Component
y seleccione el script RAG
.
En el menú desplegable Tipo de búsqueda del RAG, seleccione su método de búsqueda preferido. 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.
En el menú desplegable Tipo de fragmentación del RAG, puede seleccionar un método para dividir las entradas en fragmentos. Esto es útil para tener un significado más coherente dentro de cada parte de datos. Se proporcionan métodos de fragmentación para dividir según tokens, palabras y oraciones.
Alternativamente, puede crear el RAG a partir del código (donde llm es su LLM):
trapo RAG = gameObject.AddComponent<RAG>(); rag.Init(SearchMethods.DBSearch, ChunkingMethods.SentenceSplitter, llm);
¿En tu script puedes usarlo de la siguiente manera?:
usando LLMUnity; clase pública MyScript: MonoBehaviour{ trapo de trapo; async void Game(){...string[] inputs = new string[]{ "¡Hola! Soy un sistema de búsqueda.", "el clima es agradable. Me gusta.", "Soy un sistema RAG "};// agrega las entradas a RAGforeach (entrada de cadena en entradas) await rag.Add(input);// obtiene las 2 entradas más similares y su distancia (disimilaridad) a la consulta de búsqueda (resultados de cadena [], flotante [] distancias) = await rag.Search("hello!", 2);// para obtener las partes de texto más similares (chnuks), puede habilitar la opción returnChunksrag.ReturnChunks(true);(resultados, distancias) = await rag.Search("hello!" !", 2);... }}
Puede guardar el estado de RAG (almacenado en la carpeta Assets/StreamingAssets
):
trapo.Guardar("trapo.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:
mensaje de cadena = "¿Cómo está el clima?"; (cadena[] frases similares, flotador[] distancias) = await rag.Search(mensaje, 3); string Prompt = "Responda la consulta del usuario según los datos proporcionados.nn"; indicador += $"Consulta de usuario: {mensaje}nn"; indicador += $"Datos:n"; foreach (cadena frase similar en frases similares) mensaje += $"n- {frase similar}"; _ = llmCharacter.Chat(mensaje, 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 ?:
SimpleInteraction: demuestra una interacción simple con un personaje de IA.
Múltiples personajes: demuestra una interacción simple usando múltiples personajes de IA.
RAG: muestra de RAG. Incluye un ejemplo que utiliza RAG para proporcionar información a un LLM.
ChatBot: demuestra la interacción entre un jugador y una IA con una interfaz de usuario similar a una aplicación de mensajería (ver imagen a continuación)
KnowledgeBaseGame: juego de detectives simple que utiliza una base de conocimientos para proporcionar información al LLM basado en google/mysteryoftresbots
AndroidDemo: Ejemplo de aplicación de Android con una pantalla inicial con el progreso de descarga del modelo
Para instalar una muestra:
Abra el Administrador de paquetes: Window > Package Manager
Seleccione el paquete 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 abajo
Log Level
seleccione qué tan detallados son los mensajes de registro
Use 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
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
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. 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 .gguf
Load lora
haga clic para cargar un modelo LoRA en formato .gguf
Batch 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 LLM
Lora
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 utilizan
Flash 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 abajo
Log Level
seleccione qué tan detallados son los mensajes de registro
Use 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 local
LLM
el LLM GameObject (si Remote
no está configurado)
IP 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 relativa Save 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.
Descripción 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 .gbnf
Grammar
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) Ranura 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)
Semilla Seed
para reproducibilidad. Para obtener resultados aleatorios cada vez utilice -1
Temperature
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).