LLM для Unity обеспечивает плавную интеграцию больших языковых моделей (LLM) в движок Unity.
Это позволяет создавать умных персонажей, с которыми ваши игроки могут взаимодействовать, создавая захватывающий опыт.
В пакете также имеется система поисково-дополненной генерации (RAG), которая позволяет выполнять семантический поиск по вашим данным, что можно использовать для расширения знаний персонажа. LLM для Unity построен на основе великолепной библиотеки llama.cpp.
? Протестировано на Unity: 2021 LTS, 2022 LTS, 2023.
? Предстоящие релизы
Свяжитесь с нами, чтобы добавить свой проект!
Способ 1. Установите с помощью хранилища ресурсов.
Add to My Assets
Window > Package Manager
Packages: My Assets
в раскрывающемся списке.LLM for Unity
, нажмите Download
, а затем Import
Способ 2. Установите с помощью репозитория GitHub:
Window > Package Manager
+
и выберите Add package from git URL
https://github.com/undreamai/LLMUnity.git
и нажмите Add
Сначала вы настроите LLM для своей игры?:
Add Component
и выберите сценарий LLM.Download Model
(~ ГБ).Load model
(см. «Управление моделью LLM»).Затем вы можете настроить каждого из своих персонажей следующим образом ?♀️:
Add Component
и выберите сценарий LLMCharacter.Prompt
. Вы можете определить имя ИИ ( AI Name
) и игрока ( Player Name
).LLM
если у вас есть более одного игровых объектов LLM.Вы также можете настроить LLM и параметры персонажа в соответствии со своими предпочтениями (см. «Параметры»).
В вашем скрипте вы можете использовать его следующим образом?:
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 ) ;
.. .
}
}
Вы также можете указать функцию, которую следует вызывать после завершения ответа модели.
Это полезно, если опция Stream
включена для непрерывного вывода модели (поведение по умолчанию):
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 ) ;
.. .
}
Чтобы остановить чат, не дожидаясь его завершения, вы можете использовать:
llmCharacter . CancelRequests ( ) ;
Вот и всё ✨!
Вы также можете:
Чтобы создать приложение для Android, вам необходимо указать серверную часть сценариев IL2CPP
и ARM64
в качестве целевой архитектуры в настройках плеера.
Доступ к этим настройкам можно получить из меню Edit > Project Settings
в разделе Player > Other Settings
.
Также рекомендуется включить опцию Download on Build
в LLM GameObject, чтобы загружать модель при запуске, чтобы сохранить небольшой размер приложения.
Чтобы автоматически сохранять/загружать историю чата, вы можете указать параметр Save
LLMCharacter в имя файла (или относительный путь) по вашему выбору. Файл сохраняется в папке persistDataPath Unity. Это также сохраняет состояние LLM, а это означает, что ранее кэшированное приглашение не нужно пересчитывать.
Чтобы вручную сохранить историю чата, вы можете использовать:
llmCharacter . Save ( " filename " ) ;
и загрузить историю:
llmCharacter . Load ( " filename " ) ;
где имя_файла — имя файла или относительный путь по вашему выбору.
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 ) ;
.. .
}
Последний аргумент функции Chat
— это логическое значение, указывающее, следует ли добавлять сообщение в историю (по умолчанию: true):
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 ) ;
.. .
}
Для этого вы можете использовать функцию 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 ) ;
}
}
Вы можете использовать удаленный сервер для выполнения обработки и реализации символов, взаимодействующих с ним.
Создать сервер
Чтобы создать сервер:
LLM
как описано выше.Remote
в LLM
и при необходимости настройте параметры сервера: порт, ключ API, сертификат SSL, ключ SSL.В качестве альтернативы вы можете использовать двоичный файл сервера для упрощения развертывания:
windows-cuda-cu12.2.0
. Создайте персонажей
Создайте второй проект с игровыми персонажами, используя скрипт LLMCharacter
, как описано выше. Включите опцию Remote
и настройте хост с IP-адресом (начиная с «http://») и портом сервера.
Функцию Embeddings
можно использовать для получения вложений фразы:
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
Подробную документацию по функциональному уровню можно найти здесь:
LLM для Unity реализует сверхбыструю функцию поиска по сходству с помощью системы расширенной генерации (RAG).
Он основан на функциональности LLM и поиске приближенных ближайших соседей (ANN) из библиотеки usearch.
Семантический поиск работает следующим образом.
Создание данных Вы предоставляете текстовые входные данные (фразу, абзац, документ) для добавления к данным.
Каждый ввод разбивается на фрагменты (необязательно) и кодируется во вложения с помощью LLM.
Поиск Затем вы можете выполнить поиск по текстовому запросу.
Ввод снова кодируется, и извлекаются наиболее похожие текстовые входные данные или фрагменты данных.
Чтобы использовать семантический поиск:
Add Component
и выберите сценарий RAG
.SimpleSearch
— это простой поиск методом перебора, а DBSearch
— это быстрый метод ИНС, которому следует отдавать предпочтение в большинстве случаев.Альтернативно вы можете создать RAG из кода (где llm — ваш LLM):
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
В вашем скрипте вы можете использовать его следующим образом?:
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 ) ;
.. .
}
}
Вы можете сохранить состояние RAG (хранится в папке Assets/StreamingAssets
):
rag . Save ( " rag.zip " ) ;
и загрузим его с диска:
await rag . Load ( " rag.zip " ) ;
Вы можете использовать RAG для передачи соответствующих данных в LLM на основе сообщения пользователя:
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 ) ;
Образец RAG
включает пример реализации RAG, а также пример интеграции RAG-LLM.
Вот и всё ✨!
LLM для Unity использует менеджер моделей, который позволяет загружать или скачивать LLM и отправлять их прямо в игру.
Менеджер моделей можно найти как часть LLM GameObject:
Загрузить модели можно с помощью кнопки Download model
.
LLM для Unity включает в себя различные современные модели, встроенные для разных размеров моделей, квантованные с помощью метода Q4_K_M.
Альтернативные модели можно загрузить с HuggingFace в формате .gguf.
Вы можете загрузить модель локально и загрузить ее с помощью кнопки Load model
или скопировать URL-адрес в поле Download model > Custom URL
чтобы загрузить ее напрямую.
Если модель HuggingFace не предоставляет файл gguf, его можно преобразовать в gguf с помощью этого онлайн-конвертера.
Шаблон чата, используемый для построения подсказок, определяется автоматически по модели (если соответствующая запись существует) или названию модели.
Если он определен неправильно, вы можете выбрать другой шаблон из раскрывающегося списка шаблонов чата.
Модели, добавленные в менеджере моделей, копируются в игру в процессе сборки.
Вы можете не встраивать модель, сняв флажок «Построить».
Чтобы удалить модель (но не удалять ее с диска), вы можете нажать кнопку корзины.
Путь и URL-адрес (если загружен) каждой добавленной модели отображаются в расширенном представлении доступа к менеджеру моделей с помощью кнопки >>
:
Вы можете создавать более легкие сборки, выбрав опцию Download on Build
.
При использовании этой опции модели будут загружаться при первом запуске игры, а не копироваться в сборке.
Если вы загрузили модель локально, вам необходимо указать ее URL-адрес через расширенное представление, иначе она будет скопирована в сборку.
❕ Прежде чем использовать любую модель, обязательно проверьте ее лицензию ❕
В папке Samples~ содержится несколько примеров взаимодействия?:
Чтобы установить образец:
Window > Package Manager
LLM for Unity
. На вкладке Samples
» нажмите Import
рядом с образцом, который вы хотите установить. Примеры можно запустить со сценой Scene.unity
, которую они содержат в своей папке.
В сцене выберите игровой объект LLM
и нажмите кнопку Download Model
, чтобы загрузить модель по умолчанию, или Load model
, чтобы загрузить собственную модель (см. «Управление моделью LLM»).
Сохраните сцену, бегите и наслаждайтесь!
Show/Hide Advanced Options
Переключите, чтобы показать/скрыть дополнительные параметры снизуLog Level
выберите, насколько подробными будут сообщения журнала.Use extras
Выберите, чтобы установить и разрешить использование дополнительных функций (мгновенное внимание и показатели IQ). Remote
выбор для предоставления удаленного доступа к LLM.
Порт Port
для запуска сервера LLM (если установлен Remote
)
Num Threads
количество используемых потоков (по умолчанию: -1 = все)
Num GPU Layers
количество слоев модели, которые необходимо выгрузить в графический процессор. Если установлено значение 0, графический процессор не используется. Используйте большое число, например >30, чтобы максимально использовать графический процессор. Обратите внимание, что более высокие значения размера контекста будут использовать больше видеопамяти. Если графический процессор пользователя не поддерживается, LLM вернется к процессору.
Выберите Debug
, чтобы регистрировать выходные данные модели в редакторе Unity.
Parallel Prompts
количество подсказок/слотов, которые могут выполняться параллельно (по умолчанию: -1 = количество объектов LLMCharacter). Обратите внимание, что размер контекста делится между слотами. например, установка для Parallel Prompts
значения 1 и слота 0 для всех объектов LLMCharacter будет использовать полный контекст, но все приглашение необходимо будет вычислять (без кэширования) всякий раз, когда объект LLMCharacter используется для чата.
Dont Destroy On Load
выберите, чтобы не уничтожать игровой объект LLM при загрузке новой сцены. API key
Ключ API, который будет использоваться для разрешения доступа к запросам от объектов LLMCharacter (если установлен Remote
)
Load SSL certificate
позволяет загрузить сертификат SSL для сквозного шифрования запросов (если установлено Remote
»). Также требуется ключ SSL.Load SSL key
позволяет загрузить ключ SSL для сквозного шифрования запросов (если установлено Remote
»). Также требуется сертификат SSL.SSL certificate path
Сертификат SSL, используемый для сквозного шифрования запросов (если установлено Remote
).SSL key path
ключ SSL, используемый для сквозного шифрования запросов (если установлен Remote
). Download model
нажмите, чтобы загрузить одну из моделей по умолчанию
Load model
нажмите, чтобы загрузить собственную модель в формате .gguf
Download on Start
позволяет загружать модели LLM при первом запуске игры. В качестве альтернативы модели LLM будут скопированы непосредственно в сборку.
Context Size
Размер контекста подсказки (0 = размер контекста модели)Download lora
нажмите, чтобы загрузить модель LoRA в формате .ggufLoad lora
Нажмите, чтобы загрузить модель LoRA в формате .gguf.Batch Size
Размер пакета для быстрой обработки (по умолчанию: 512)Model
путь к используемой модели (относительно папки Assets/StreamingAssets).Chat Template
шаблон чата, используемый для LLM.Lora
путь к используемым LoRA (относительно папки Assets/StreamingAssets).Lora Weights
— веса используемых LoRA.Flash Attention
, чтобы использовать в модели «Вспышку внимания» (если включен параметр Use extras
»). Base Prompt
общее базовое приглашение для использования во всех объектах LLMCharacter с помощью LLM.
Show/Hide Advanced Options
Переключите, чтобы показать/скрыть дополнительные параметры снизуLog Level
выберите, насколько подробными будут сообщения журнала.Use extras
Выберите, чтобы установить и разрешить использование дополнительных функций (мгновенное внимание и показатели IQ). Remote
независимо от того, является ли используемый LLM удаленным или локальнымLLM
GameObject LLM (если Remote
не установлен)Hort
ip сервера LLM (если установлен Remote
)Port
порт сервера LLM (если установлен Remote
)Num Retries
количество повторов HTTP-запросов с сервера LLM (если установлен Remote
)API key
Ключ API сервера LLM (если установлен Remote
)Save
имя файла или относительный путьSave Cache
Выберите, чтобы сохранить состояние LLM вместе с историей чата. Состояние LLM обычно составляет около 100 МБ+.Debug Prompt
выберите, чтобы регистрировать созданные подсказки в редакторе Unity. Player Name
Имя игрокаAI Name
имя AIPrompt
описание роли ИИ Выберите Stream
, чтобы получать ответ от модели по мере его создания (рекомендуется!).
Если он не выбран, полный ответ от модели будет получен за один раз.
Num Predict
максимальное количество токенов для прогнозирования (по умолчанию: 256, -1 = бесконечность, -2 = до заполнения контекста)Load grammar
нажмите, чтобы загрузить грамматику в формате .gbnfGrammar
путь к используемой грамматике (относительно папки Assets/StreamingAssets).Cache Prompt
сохранить текущее приглашение из чата (по умолчанию: true)Slot
сервера, используемый для вычислений. Значение может быть установлено от 0 до Parallel Prompts
-1 (по умолчанию: -1 = новый слот для каждого символа).Seed
материал для воспроизводимости. Для случайных результатов каждый раз используйте -1Temperature
Температура LLM, более низкие значения дают более детерминированные ответы (по умолчанию: 0,2).Top K
top-k (по умолчанию: 40, 0 = отключено)Top P
top-p (по умолчанию: 0,9, 1,0 = отключено)Min P
(по умолчанию: 0,05)Repeat Penalty
контролирует повторение последовательностей токенов в сгенерированном тексте (по умолчанию: 1.1).Presence Penalty
повторное присутствие токена (по умолчанию: 0,0, 0,0 = отключено)Frequency Penalty
за частоту повторяющихся токенов (по умолчанию: 0,0, 0,0 = отключено)Tfs_z
: включить выборку без хвостов с параметром z (по умолчанию: 1.0, 1.0 = отключено).Typical P
: включить локальную типичную выборку с помощью параметра p (по умолчанию: 1,0, 1,0 = отключено).Repeat Last N
: последние N токенов, которые следует учитывать для наказания за повторение (по умолчанию: 64, 0 = отключено, -1 = размер ctx).Penalize Nl
: штрафовать токены новой строки при применении штрафа за повторение (по умолчанию: true).Penalty Prompt
: подсказка для оценки штрафа. Может иметь значение null
, строку или массив чисел, представляющих токены (по умолчанию: null
= использовать исходное prompt
).Mirostat
: включить выборку Миростата, контролируя недоумение во время генерации текста (по умолчанию: 0, 0 = отключено, 1 = Миростат, 2 = Миростат 2.0).Mirostat Tau
: установите целевую энтропию Миростата, параметр tau (по умолчанию: 5,0).Mirostat Eta
: установите скорость обучения Миростата, параметр eta (по умолчанию: 0,1).N Probs
: если значение больше 0, ответ также содержит вероятности появления N верхних токенов для каждого сгенерированного токена (по умолчанию: 0).Ignore Eos
: включить игнорирование токенов конца потока и продолжить генерацию (по умолчанию: false). Лицензия LLM для Unity — MIT (LICENSE.md) и использует стороннее программное обеспечение с лицензиями MIT и Apache. Для некоторых моделей, включенных в ресурс, определены собственные условия лицензии. Ознакомьтесь с ними перед использованием каждой модели. Лицензии третьих сторон можно найти в (Third Party Notifications.md).