O LLM for Unity permite a integração perfeita de Large Language Models (LLMs) no mecanismo Unity.
Ele permite criar personagens inteligentes com os quais seus jogadores podem interagir para uma experiência envolvente.
O pacote também conta com um sistema Retrieval-Augmented Generation (RAG) que permite realizar pesquisas semânticas em seus dados, que podem ser usadas para aprimorar o conhecimento do personagem. O LLM for Unity foi desenvolvido com base na incrível biblioteca llama.cpp.
Visão geral • Como ajudar • Jogos usando LLM para Unity • Configuração • Como usar • RAG • Gerenciamento de modelo LLM • Exemplos • Opções • Licença
Plataforma cruzada! Windows, Linux, macOS e Android
? Funciona localmente sem acesso à Internet. Nenhum dado sai do jogo!
⚡ Inferência extremamente rápida em CPU e GPU (Nvidia, AMD, Apple Metal)
? Suporta todos os principais modelos LLM
? Fácil de configurar, ligue com uma única linha de código
? Gratuito para uso para fins pessoais e comerciais
? Testado no Unity: 2021 LTS, 2022 LTS, 2023
? Próximos lançamentos
Marque o repositório com estrela, deixe-nos um comentário e divulgue o projeto!
Junte-se a nós no Discord e diga oi.
Contribua enviando solicitações de recursos, bugs ou até mesmo seu próprio PR.
este trabalho para permitir recursos ainda mais legais!
Veredicto Verbal
Eu, Chatbot: AISYLUM
Almas Sem Nome do Vazio
Assassinato no corredor 4
IA exigente de entrega de comida
Namorada Emocional AI
Caso encerrado
Entre em contato conosco para adicionar seu projeto!
Método 1: instalar usando o armazenamento de ativos
Abra a página de ativos do LLM for Unity e clique em Add to My Assets
Abra o Gerenciador de Pacotes no Unity: Window > Package Manager
Selecione a opção Packages: My Assets
no menu suspenso
Selecione o pacote LLM for Unity
, clique em Download
e depois Import
Método 2: instalar usando o repositório GitHub:
Abra o Gerenciador de Pacotes no Unity: Window > Package Manager
Clique no botão +
e selecione Add package from git URL
Use o URL do repositório https://github.com/undreamai/LLMUnity.git
e clique em Add
Primeiro você configurará o LLM para o seu jogo?:
Crie um GameObject vazio.
No GameObject Inspector, clique em Add Component
e selecione o script LLM.
Baixe um dos modelos padrão com o botão Download Model
(~GBs).
Ou carregue seu próprio modelo .gguf com o botão Load model
(consulte gerenciamento de modelo LLM).
Então você pode configurar cada um de seus personagens da seguinte maneira ?♀️:
Crie um GameObject vazio para o personagem.
No GameObject Inspector, clique em Add Component
e selecione o script LLMCharacter.
Defina a função da sua IA no Prompt
. Você pode definir o nome da IA ( AI Name
) e do jogador ( Player Name
).
(Opcional) Selecione o LLM construído acima no campo LLM
se você tiver mais de um GameObjects LLM.
Você também pode ajustar o LLM e as configurações de personagem de acordo com sua preferência (consulte Opções).
No seu script você pode usá-lo da seguinte maneira?:
usando LLMUnity;classe pública MyScript { público LLMCharacter llmCharacter; void HandleReply(string response){// faça algo com a resposta do modelDebug.Log(reply); } void Game(){// sua função de jogo...string message = "Olá bot!";_ = llmCharacter.Chat(message, HandleReply);... }}
Você também pode especificar uma função a ser chamada quando a resposta do modelo for concluída.
Isto é útil se a opção Stream
estiver habilitada para saída contínua do modelo (comportamento padrão):
void ReplyCompleted(){// faça algo quando a resposta do modelo for completeDebug.Log("The AI respondeu"); } void Game(){// sua função de jogo...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted);... }
Para interromper o chat sem esperar que ele termine você pode usar:
llmCharacter.CancelRequests();
Por fim, no Inspetor do GameObject do seu script, selecione o GameObject LLMCharacter criado acima como propriedade llmCharacter.
Isso é tudo ✨!
Você também pode:
Para construir um aplicativo Android, você precisa especificar o back-end de script IL2CPP
e o ARM64
como arquitetura de destino nas configurações do player.
Essas configurações podem ser acessadas no menu Edit > Project Settings
na seção Player > Other Settings
.
Também é uma boa ideia ativar a opção Download on Build
no LLM GameObject para baixar o modelo na inicialização, a fim de manter o tamanho do aplicativo pequeno.
Para salvar/carregar automaticamente seu histórico de bate-papo, você pode especificar o parâmetro Save
do LMCharacter para o nome do arquivo (ou caminho relativo) de sua escolha. O arquivo é salvo na pasta persistenteDataPath do Unity. Isso também salva o estado do LLM, o que significa que o prompt armazenado em cache anteriormente não precisa ser recalculado.
Para salvar manualmente seu histórico de bate-papo, você pode usar:
llmCharacter.Save("nome do arquivo");
e para carregar o histórico:
llmCharacter.Load("nome do arquivo");
onde filename é o nome do arquivo ou caminho relativo de sua escolha.
void WarmupCompleted(){// faça algo quando o aquecimento estiver concluídoDebug.Log("A IA está boa e pronta"); } void Game(){// sua função de jogo..._ = llmCharacter.Warmup(WarmupCompleted);... }
O último argumento da função Chat
é um booleano que especifica se a mensagem deve ser adicionada ao histórico (padrão: true):
void Game(){// sua função de jogo...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted, false);... }
void Game(){// sua função de jogo...string message = "O gato está ausente";_ = llmCharacter.Complete(message, HandleReply, ReplyCompleted);... }
Para isso você pode usar a funcionalidade async
/ await
:
async void Game(){// sua função de jogo...string message = "Olá bot!";string responda = await llmCharacter.Chat(message, HandleReply, ReplyCompleted);Debug.Log(reply);... }
usando UnityEngine;usando LLMUnity;classe pública MyScript : MonoBehaviour{LLM llm;LLMCharacter llmCharacter;async void Start(){// desativa gameObject para que theAwake não seja chamado imediatamentegameObject.SetActive(false);// Adicione um LLM objectllm = gameObject. AddComponent<LLM>();// define o modelo usando o nome do arquivo do modelo. // O modelo precisa ser adicionado para o gerenciador de modelo LLM (consulte gerenciamento de modelo LLM) carregando ou baixando-o.// Caso contrário, o arquivo de modelo pode ser copiado diretamente dentro da pasta StreamingAssets.llm.SetModel("Phi-3-mini-4k-instruct-q4.gguf "); // opcional: você também pode definir loras de maneira semelhante e definir seus pesos (se necessário)llm.AddLora("my-lora.gguf");llm.SetLoraWeight(0.5f);// opcional: você pode definir o modelo de chat do modelo se ele não estiver identificado corretamente // Você pode encontrar uma lista de modelos de bate-papo em ChatTemplate.templates.Keysllm.SetTemplate("phi-3");// opcional: definir o número de threadsllm.numThreads = -1;// opcional: habilitar GPU definindo o número de camadas do modelo para descarregar para itllm.numGPULayers = 10;// Adicionar um LLMCharacter objectllmCharacter = gameObject.AddComponent<LLMCharacter>();// definir o objeto LLM que manipula o modelllmCharacter.llm = llm;// definir o caractere promptllmCharacter. SetPrompt("Um bate-papo entre um humano curioso e um assistente de inteligência artificial."); // define a IA e o jogador namellmCharacter.AIName = "AI";llmCharacter.playerName = "Human";// opcional: defina o streaming como false para obter o resultado completo de uma só vez // llmCharacter.stream = true;// opcional: defina um caminho para salvar // llmCharacter.save = "AICharacter1";// opcional: habilite o cache de salvamento para evitar recomputação ao carregar um arquivo salvo (requer ~100 MB)// llmCharacter.saveCache = true;// opcional: definir uma gramática // await llmCharacter.SetGrammar("json.gbnf");// reativar gameObjectgameObject.SetActive(true);}}
Você pode usar um servidor remoto para realizar o processamento e implementar caracteres que interajam com ele.
Crie o servidor
Para criar o servidor:
Crie um projeto com um GameObject usando o script LLM
conforme descrito acima
Habilite a opção Remote
do LLM
e opcionalmente configure os parâmetros do servidor: porta, chave API, certificado SSL, chave SSL
Construa e execute para iniciar o servidor
Alternativamente, você pode usar um binário de servidor para facilitar a implantação:
Execute a cena acima no Editor e copie o comando das mensagens de depuração (começando com "Comando do servidor:")
Baixe os binários e DLLs do servidor e extraia-os na mesma pasta
Encontre a arquitetura de seu interesse na pasta acima, por exemplo, para Windows e CUDA, use windows-cuda-cu12.2.0
.
Você também pode verificar a arquitetura que funciona para o seu sistema nas mensagens de depuração (começando com "Usando arquitetura").
Da linha de comando, mude o diretório para a pasta de arquitetura selecionada e inicie o servidor executando o comando copiado acima.
Crie os personagens
Crie um segundo projeto com os personagens do jogo usando o script LLMCharacter
conforme descrito acima. Habilite a opção Remote
e configure o host com o endereço IP (começando com "http://") e porta do servidor.
A função Embeddings
pode ser usada para obter os emdeddings de uma frase:
List<float> embeddings = await llmCharacter.Embeddings("oi, como vai?");
Uma documentação detalhada sobre o nível de função pode ser encontrada aqui:
LLM for Unity implementa uma funcionalidade de pesquisa de similaridade super-rápida com um sistema Retrieval-Augmented Generation (RAG).
É baseado na funcionalidade LLM e na pesquisa de vizinhos mais próximos (ANN) da biblioteca usearch.
A pesquisa semântica funciona da seguinte maneira.
Construindo os dados Você fornece entradas de texto (uma frase, parágrafo, documento) para adicionar aos dados.
Cada entrada é dividida em partes (opcional) e codificada em embeddings com um LLM.
Pesquisando Você pode então pesquisar uma entrada de texto de consulta.
A entrada é novamente codificada e as entradas de texto ou partes de dados mais semelhantes são recuperadas.
Para usar a pesquisa semântica:
crie um GameObject para o LLM conforme descrito acima. Baixe um dos modelos RAG fornecidos ou carregue o seu próprio (boas opções podem ser encontradas na tabela de classificação do MTEB).
crie um GameObject vazio. No GameObject Inspector, clique em Add Component
e selecione o script RAG
.
No menu suspenso Tipo de pesquisa do RAG, selecione seu método de pesquisa preferido. SimpleSearch
é uma pesquisa simples de força bruta, enquanto DBSearch
é um método rápido de RNA que deve ser preferido na maioria dos casos.
No menu suspenso Chunking Type do RAG você pode selecionar um método para dividir as entradas em pedaços. Isso é útil para ter um significado mais consistente em cada parte dos dados. São fornecidos métodos de divisão de acordo com tokens, palavras e frases.
Alternativamente, você pode criar o RAG a partir do código (onde llm é seu LLM):
RAG pano = gameObject.AddComponent<RAG>(); rag.Init(SearchMethods.DBSearch, ChunkingMethods.SentenceSplitter, llm);
No seu script você pode usá-lo da seguinte maneira?:
usando LLMUnity;classe pública MyScript: MonoBehaviour{ Pano de pano; async void Game(){...string[] inputs = new string[]{ "Olá! Sou um sistema de pesquisa.", "o tempo está bom. Gostei.", "Sou um sistema RAG "};// adiciona as entradas ao RAGforeach (string de entrada nas entradas) await rag.Add(input);// obtém as 2 entradas mais semelhantes e sua distância (dissimilaridade) para a consulta de pesquisa (string[] resultados, float [] distâncias) = await rag.Search("hello!", 2);// para obter as partes de texto mais semelhantes (chnuks) você pode ativar a opção returnChunksrag.ReturnChunks(true);(resultados, distâncias) = await rag.Search(" olá!", 2);... }}
Você pode salvar o estado RAG (armazenado na pasta Assets/StreamingAssets
):
rag.Save("rag.zip");
e carregue-o do disco:
aguarde rag.Load("rag.zip");
Você pode usar o RAG para alimentar dados relevantes ao LLM com base em uma mensagem do usuário:
string mensagem = "Como está o tempo?"; (string[] frases semelhantes, float[] distâncias) = aguardar rag.Search(message, 3); string prompt = "Responda à consulta do usuário com base nos dados fornecidos.nn"; prompt += $"Consulta do usuário: {message}nn"; prompt += $"Dados:n"; foreach (string similarPhrase em similarPhrases) prompt += $"n- {similarPhrase}"; _ = llmCharacter.Chat(prompt, HandleReply, ReplyCompleted);
A amostra RAG
inclui um exemplo de implementação de RAG, bem como um exemplo de integração RAG-LLM.
Isso é tudo ✨!
O LLM for Unity usa um gerenciador de modelos que permite carregar ou baixar LLMs e enviá-los diretamente no seu jogo.
O gerenciador de modelo pode ser encontrado como parte do LLM GameObject:
Você pode baixar modelos com o botão Download model
.
LLM for Unity inclui diferentes modelos de última geração integrados para diferentes tamanhos de modelo, quantizados com o método Q4_K_M.
Modelos alternativos podem ser baixados do HuggingFace no formato .gguf.
Você pode baixar um modelo localmente e carregá-lo com o botão Load model
ou copiar o URL no campo Download model > Custom URL
para baixá-lo diretamente.
Se um modelo HuggingFace não fornecer um arquivo gguf, ele poderá ser convertido para gguf com este conversor online.
O modelo de chat usado para construir os prompts é determinado automaticamente a partir do modelo (se existir uma entrada relevante) ou do nome do modelo.
Se identificado incorretamente, você pode selecionar outro modelo no menu suspenso de modelos de chat.
Os modelos adicionados no gerenciador de modelos são copiados para o jogo durante o processo de construção.
Você pode omitir a integração de um modelo desmarcando a caixa de seleção "Construir".
Para remover o modelo (mas não excluí-lo do disco), você pode clicar no botão bin.
O caminho e URL (se baixado) de cada modelo adicionado é exibido na visualização expandida do acesso do gerenciador de modelos com o botão >>
:
Você pode criar compilações mais leves selecionando a opção Download on Build
.
Usando esta opção, os modelos serão baixados na primeira vez que o jogo for iniciado, em vez de copiados na compilação.
Se você carregou um modelo localmente você precisa definir sua URL através da visualização expandida, caso contrário ele será copiado no build.
❕ Antes de usar qualquer modelo verifique sua licença ❕
A pasta Samples~ contém vários exemplos de interação?:
SimpleInteraction: demonstra uma interação simples com um personagem de IA
MultipleCharacters: demonstra uma interação simples usando vários personagens de IA
RAG: amostra RAG. Inclui um exemplo usando o RAG para alimentar informações para um LLM
ChatBot: Demonstra a interação entre um jogador e uma IA com uma UI semelhante a um aplicativo de mensagens (veja a imagem abaixo)
KnowledgeBaseGame: Jogo de detetive simples usando uma base de conhecimento para fornecer informações ao LLM baseado em google/mysteryofthreebots
AndroidDemo: exemplo de aplicativo Android com tela inicial com progresso de download do modelo
Para instalar uma amostra:
Abra o Gerenciador de Pacotes: Window > Package Manager
Selecione o LLM for Unity
. Na guia Samples
, clique em Import
ao lado da amostra que deseja instalar.
Os exemplos podem ser executados com a cena Scene.unity
que eles contêm em sua pasta.
Na cena, selecione o GameObject LLM
e clique no botão Download Model
para baixar um modelo padrão ou Load model
para carregar seu próprio modelo (consulte gerenciamento de modelo LLM).
Salve a cena, corra e aproveite!
Show/Hide Advanced Options
Alterne para mostrar/ocultar opções avançadas abaixo
Log Level
selecione o nível de detalhamento das mensagens de log
Use extras
selecione para instalar e permitir o uso de recursos extras (atenção flash e quants de QI)
Seleção Remote
para fornecer acesso remoto ao LLM
Porta Port
para executar o servidor LLM (se Remote
estiver definido)
Num Threads
número de threads a serem usados (padrão: -1 = todos)
Num GPU Layers
número de camadas do modelo a serem descarregadas para a GPU. Se definido como 0, a GPU não será usada. Use um número grande, ou seja,> 30 para utilizar a GPU tanto quanto possível. Observe que valores mais altos de tamanho de contexto usarão mais VRAM. Se a GPU do usuário não for suportada, o LLM retornará à CPU
Debug
select para registrar a saída do modelo no Unity Editor
por exemplo, definir Parallel Prompts
como 1 e slot 0 para todos os objetos LLMCharacter usará o contexto completo, mas todo o prompt precisará ser computado (sem cache) sempre que um objeto LLMCharacter for usado para bate-papo.
Dont Destroy On Load
selecione para não destruir o LLM GameObject ao carregar uma nova cena
Parallel Prompts
número de prompts/slots que podem acontecer em paralelo (padrão: -1 = número de objetos LLMCharacter). Observe que o tamanho do contexto é dividido entre os slots. API key
Chave de API a ser usada para permitir acesso a solicitações de objetos LLMCharacter (se Remote
estiver definido)
Load SSL certificate
permite carregar um certificado SSL para criptografia ponta a ponta de solicitações (se Remote
estiver configurado). Requer chave SSL também.
Load SSL key
permite carregar uma chave SSL para criptografia ponta a ponta de solicitações (se Remote
estiver definido). Requer certificado SSL também.
SSL certificate path
o certificado SSL usado para criptografia ponta a ponta de solicitações (se Remote
estiver definido).
SSL key path
a chave SSL usada para criptografia ponta a ponta de solicitações (se Remote
estiver definido).
Download model
clique para baixar um dos modelos padrão
Load model
clique para carregar seu próprio modelo no formato .gguf
Download on Start
permite baixar os modelos LLM na primeira vez que o jogo é iniciado. Alternativamente, os modelos LLM serão copiados diretamente no build
Context Size
do contexto do prompt (0 = tamanho do contexto do modelo) Download lora
clique para baixar um modelo LoRA no formato .gguf
Load lora
clique para carregar um modelo LoRA no formato .gguf
Batch Size
tamanho do lote para processamento imediato (padrão: 512)
Model
o caminho do modelo que está sendo usado (em relação à pasta Assets/StreamingAssets)
Chat Template
o modelo de bate-papo usado para o LLM
Lora
o caminho dos LoRAs que estão sendo usados (relativo à pasta Assets/StreamingAssets)
Lora Weights
os pesos dos LoRAs usados
Flash Attention
clique para usar atenção flash no modelo (se Use extras
estiver habilitado)
Base Prompt
um prompt base comum para usar em todos os objetos LLMCharacter usando o LLM
Show/Hide Advanced Options
Alterne para mostrar/ocultar opções avançadas abaixo
Log Level
selecione o nível de detalhamento das mensagens de log
Use extras
selecione para instalar e permitir o uso de recursos extras (atenção flash e quants de QI)
Remote
quer o LLM usado seja remoto ou local
LLM
o LLM GameObject (se Remote
não estiver definido)
Hort
ip do servidor LLM (se Remote
estiver configurado)
Porta Port
do servidor LLM (se Remote
estiver definido)
Num Retries
número de novas tentativas de solicitação HTTP do servidor LLM (se Remote
estiver definido)
API key
Chave de API do servidor LLM (se Remote
estiver definido)
Save
salvar nome do arquivo ou caminho relativo Save Cache
selecione para salvar o estado LLM junto com o histórico de bate-papo. O estado LLM é normalmente em torno de 100 MB+.
Debug Prompt
selecione para registrar os prompts construídos no Unity Editor
Player Name
o nome do jogador
AI Name
o nome da IA
Descrição Prompt
da função de IA
Selecione Stream
para receber a resposta do modelo conforme ela é produzida (recomendado!).
Se não for selecionado, a resposta completa do modelo será recebida de uma só vez
Num Predict
número máximo de tokens a serem previstos (padrão: 256, -1 = infinito, -2 = até o contexto ser preenchido) Load grammar
clique para carregar uma gramática no formato .gbnf
Grammar
o caminho da gramática que está sendo usada (em relação à pasta Assets/StreamingAssets)
Cache Prompt
salva o prompt em andamento do chat (padrão: true) Slot
slot do servidor a ser usado para computação. O valor pode ser definido de 0 a Parallel Prompts
-1 (padrão: -1 = novo slot para cada caractere)
Seed
sementes para reprodutibilidade. Para resultados aleatórios sempre use -1
Temperature
Temperatura LLM, valores mais baixos fornecem respostas mais determinísticas (padrão: 0,2)Top K
top-k (padrão: 40, 0 = desativado)Top P
top-p (padrão: 0,9, 1,0 = desativado)Min P
para um token ser usado (padrão: 0,05)Repeat Penalty
controla a repetição de sequências de token no texto gerado (padrão: 1.1)Presence Penalty
Penalidade de presença de token repetida (padrão: 0,0, 0,0 = desativado)Frequency Penalty
Penalidade de frequência de token repetida (padrão: 0,0, 0,0 = desativado) Tfs_z
: habilita amostragem livre de cauda com parâmetro z (padrão: 1,0, 1,0 = desabilitado).
Typical P
: habilita amostragem típica local com parâmetro p (padrão: 1,0, 1,0 = desabilitado).
Repeat Last N
: últimos N tokens a serem considerados para penalizar a repetição (padrão: 64, 0 = desabilitado, -1 = tamanho ctx).
Penalize Nl
: penaliza tokens de nova linha ao aplicar a penalidade de repetição (padrão: verdadeiro).
Penalty Prompt
: prompt para fins de avaliação de penalidade. Pode ser null
, uma string ou uma matriz de números representando tokens (padrão: null
= use original prompt
).
Mirostat
: habilita a amostragem do Mirostat, controlando a perplexidade durante a geração do texto (padrão: 0, 0 = desabilitado, 1 = Mirostat, 2 = Mirostat 2.0).
Mirostat Tau
: define a entropia alvo do Mirostat, parâmetro tau (padrão: 5.0).
Mirostat Eta
: define a taxa de aprendizagem do Mirostat, parâmetro eta (padrão: 0,1).
N Probs
: se for maior que 0, a resposta também contém as probabilidades dos N principais tokens para cada token gerado (padrão: 0)
Ignore Eos
: permite ignorar tokens de fim de fluxo e continuar gerando (padrão: falso).
A licença do LLM para Unity é MIT (LICENSE.md) e usa software de terceiros com licenças MIT e Apache. Alguns modelos incluídos no ativo definem seus próprios termos de licença. Revise-os antes de usar cada modelo. Licenças de terceiros podem ser encontradas em (Third Party Notices.md).