LLM для Unity обеспечивает плавную интеграцию больших языковых моделей (LLM) в движок Unity.
Это позволяет создавать умных персонажей, с которыми ваши игроки могут взаимодействовать, создавая захватывающий опыт.
В пакете также имеется система поисково-дополненной генерации (RAG), которая позволяет выполнять семантический поиск по вашим данным, что можно использовать для расширения знаний персонажа. LLM для Unity построен на основе великолепной библиотеки llama.cpp.
Кратко • Как помочь • Игры, использующие LLM для Unity • Настройка • Как использовать • RAG • Управление моделью LLM • Примеры • Параметры • Лицензия
Кроссплатформенность! Windows, Linux, macOS и Android
? Запускается локально без доступа в Интернет. Никакие данные никогда не покидают игру!
⚡ Невероятно быстрый вывод данных о процессоре и графическом процессоре (Nvidia, AMD, Apple Metal)
? Поддерживает все основные модели LLM.
? Простота настройки, вызов с помощью одной строки кода
? Бесплатное использование как в личных, так и в коммерческих целях
? Протестировано на Unity: 2021 LTS, 2022 LTS, 2023.
? Предстоящие релизы
Отметьте репозиторий, оставьте нам отзыв и расскажите о проекте!
Присоединяйтесь к нам в Discord и поздоровайтесь.
Внесите свой вклад, отправив запросы на добавление функций, сообщения об ошибках или даже свой собственный пиар.
эта работа, чтобы обеспечить еще более крутые функции!
Устный вердикт
Я, чат-бот: AISYLUM
Безымянные души пустоты
Убийство в проходе 4
Привередливый ИИ по доставке еды
Эмоциональная подруга AI
Дело закрыто
Свяжитесь с нами, чтобы добавить свой проект!
Способ 1. Установите с помощью хранилища ресурсов.
Откройте страницу ресурсов LLM for Unity и нажмите Add to My Assets
Откройте диспетчер пакетов в Unity: Window > Package Manager
Выберите опцию Packages: My Assets
в раскрывающемся списке.
Выберите пакет LLM for Unity
, нажмите Download
, а затем Import
Способ 2. Установите с помощью репозитория GitHub:
Откройте диспетчер пакетов в Unity: Window > Package Manager
Нажмите кнопку +
и выберите Add package from git URL
Используйте URL-адрес репозитория https://github.com/undreamai/LLMUnity.git
и нажмите Add
Сначала вы настроите LLM для своей игры?:
Создайте пустой GameObject.
В инспекторе GameObject нажмите Add Component
и выберите сценарий LLM.
Загрузите одну из моделей по умолчанию с помощью кнопки Download Model
(~ ГБ).
Или загрузите свою собственную модель .gguf с помощью кнопки Load model
(см. «Управление моделью LLM»).
Затем вы можете настроить каждого из своих персонажей следующим образом ?♀️:
Создайте пустой GameObject для персонажа.
В инспекторе GameObject нажмите Add Component
и выберите сценарий LLMCharacter.
Определите роль вашего ИИ в Prompt
. Вы можете определить имя ИИ ( AI Name
) и игрока ( Player Name
).
(Необязательно) Выберите LLM, созданный выше, в поле LLM
если у вас есть более одного игровых объектов LLM.
Вы также можете настроить LLM и параметры персонажа в соответствии со своими предпочтениями (см. «Параметры»).
В вашем скрипте вы можете использовать его следующим образом?:
используя LLMUnity; публичный класс MyScript { общественный LLMCharacter llmCharacter; void HandleReply(string response){// сделать что-нибудь с ответом из modelDebug.Log(reply); } void Game(){// ваша игровая функция...string message = "Привет, бот!";_ = llmCharacter.Chat(message, HandleReply);... }}
Вы также можете указать функцию, которую следует вызывать после завершения ответа модели.
Это полезно, если опция Stream
включена для непрерывного вывода модели (поведение по умолчанию):
void ReplyCompleted(){// сделать что-нибудь, когда ответ от модели будет завершен.Debug.Log("ИИ ответил"); } void Game(){// ваша игровая функция...string message = "Привет, бот!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted);... }
Чтобы остановить чат, не дожидаясь его завершения, вы можете использовать:
llmCharacter.CancelRequests();
Наконец, в инспекторе GameObject вашего скрипта выберите созданный выше игровой объект LLMCharacter в качестве свойства llmCharacter.
Вот и всё ✨!
Вы также можете:
Чтобы создать приложение для Android, вам необходимо указать серверную часть сценариев IL2CPP
и ARM64
в качестве целевой архитектуры в настройках плеера.
Доступ к этим настройкам можно получить из меню Edit > Project Settings
в разделе Player > Other Settings
.
Также рекомендуется включить опцию Download on Build
в LLM GameObject, чтобы загружать модель при запуске, чтобы сохранить небольшой размер приложения.
Чтобы автоматически сохранять/загружать историю чата, вы можете указать параметр Save
LLMCharacter в имя файла (или относительный путь) по вашему выбору. Файл сохраняется в папке persistDataPath Unity. Это также сохраняет состояние LLM, а это означает, что ранее кэшированное приглашение не нужно пересчитывать.
Чтобы вручную сохранить историю чата, вы можете использовать:
llmCharacter.Save("имя файла");
и загрузить историю:
llmCharacter.Load("имя файла");
где имя_файла — имя файла или относительный путь по вашему выбору.
void WarmupCompleted(){// сделать что-нибудь после завершения разминкиDebug.Log("ИИ готов и готов"); } void Game(){// ваша игровая функция..._ = llmCharacter.Warmup(WarmupCompleted);... }
Последний аргумент функции Chat
— это логическое значение, указывающее, следует ли добавлять сообщение в историю (по умолчанию: true):
void Game(){// ваша игровая функция...string message = "Привет, бот!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted, false);... }
void Game(){// ваша игровая функция...string message = "Кот ушел";_ = llmCharacter.Complete(message, HandleReply, ReplyCompleted);... }
Для этого вы можете использовать функцию async
/ await
:
async void Game(){// ваша игровая функция...string message = "Привет, бот!";строка ответа = await llmCharacter.Chat(message, HandleReply, ReplyCompleted);Debug.Log(reply);... }
с помощью UnityEngine; с помощью LLMUnity; общедоступный класс MyScript : MonoBehaviour{LLM llm;LLMCharacter llmCharacter;async void Start(){// отключите gameObject, чтобы Awake не вызывался немедленноgameObject.SetActive(false);// Добавьте объект LLMllm = gameObject. AddComponent<LLM>();// устанавливаем модель, используя имя файла модели.// Модель должна быть добавляется в менеджер моделей LLM (см. «Управление моделями LLM») путем его загрузки или загрузки.// В противном случае файл модели можно скопировать непосредственно в папку StreamingAssets.llm.SetModel("Phi-3-mini-4k-instruct-q4. gguf");// необязательно: вы также можете установить лоры аналогичным образом и установить их веса (если необходимо)llm.AddLora("my-lora.gguf");llm.SetLoraWeight(0.5f);// необязательно: вы можете установить шаблон чата модели, если она определена неправильно// Вы можете найти список шаблоны чата в ChatTemplate.templates.Keysllm.SetTemplate("phi-3");// необязательно: установите количество потоковllm.numThreads = -1;// необязательно: включите графический процессор установив количество слоев модели для выгрузки в itllm.numGPULayers = 10;// Добавляем объект LLMCharacterllmCharacter = gameObject.AddComponent<LLMCharacter>();// устанавливаем объект LLM, который обрабатывает модельllmCharacter.llm = llm;// устанавливаем персонаж PromptllmCharacter.SetPrompt("Беседа между любопытным человеком и помощником по искусственному интеллекту.");// set имя ИИ и игрокаllmCharacter.AIName = "AI";llmCharacter.playerName = "Human";// необязательно: установите для потоковой передачи значение false, чтобы получить полный результат за один раз// llmCharacter.stream = true;// необязательно: установите a save path// llmCharacter.save = "AICharacter1";// необязательно: включите кеш сохранения, чтобы избежать перерасчета при загрузке файла сохранения (требуется ~100 МБ)// llmCharacter.saveCache = true;// необязательно: установить грамматику// дождаться llmCharacter.SetGrammar("json.gbnf");// повторно включить gameObjectgameObject.SetActive(true);}}
Вы можете использовать удаленный сервер для выполнения обработки и реализации символов, взаимодействующих с ним.
Создать сервер
Чтобы создать сервер:
Создайте проект с GameObject, используя сценарий LLM
как описано выше.
Включите опцию Remote
в LLM
и при необходимости настройте параметры сервера: порт, ключ API, сертификат SSL, ключ SSL.
Сборка и запуск для запуска сервера
В качестве альтернативы вы можете использовать двоичный файл сервера для упрощения развертывания:
Запустите приведенную выше сцену из редактора и скопируйте команду из сообщений отладки (начиная с «Команда сервера:»)
Загрузите двоичные файлы и библиотеки DLL сервера и извлеките их в одну папку.
Найдите интересующую вас архитектуру в папке выше, например, для Windows и CUDA используйте windows-cuda-cu12.2.0
.
Вы также можете проверить архитектуру, которая подходит для вашей системы, из сообщений отладки (начиная с «Использование архитектуры»).
Из командной строки измените каталог на выбранную папку архитектуры и запустите сервер, выполнив команду, скопированную выше.
Создайте персонажей
Создайте второй проект с игровыми персонажами, используя скрипт LLMCharacter
, как описано выше. Включите опцию Remote
и настройте хост с IP-адресом (начиная с «http://») и портом сервера.
Функцию Embeddings
можно использовать для получения вложений фразы:
List<float> embeddings = await llmCharacter.Embeddings("привет, как дела?");
Подробную документацию по функциональному уровню можно найти здесь:
LLM для Unity реализует сверхбыструю функцию поиска по сходству с помощью системы расширенной генерации (RAG).
Он основан на функциональности LLM и поиске приближенных ближайших соседей (ANN) из библиотеки usearch.
Семантический поиск работает следующим образом.
Создание данных Вы предоставляете текстовые входные данные (фразу, абзац, документ) для добавления к данным.
Каждый ввод разбивается на фрагменты (необязательно) и кодируется во вложения с помощью LLM.
Поиск Затем вы можете выполнить поиск по текстовому запросу.
Ввод снова кодируется, и извлекаются наиболее похожие текстовые входные данные или фрагменты данных.
Чтобы использовать семантический поиск:
создайте GameObject для LLM, как описано выше. Загрузите одну из предоставленных моделей RAG или загрузите свою собственную (хорошие варианты можно найти в таблице лидеров MTEB).
создайте пустой GameObject. В инспекторе GameObject нажмите Add Component
и выберите сценарий RAG
.
В раскрывающемся списке «Тип поиска» RAG выберите предпочтительный метод поиска. SimpleSearch
— это простой поиск методом перебора, а DBSearch
— это быстрый метод ИНС, которому следует отдавать предпочтение в большинстве случаев.
В раскрывающемся списке «Тип фрагментации» RAG вы можете выбрать метод разделения входных данных на фрагменты. Это полезно для более последовательного значения каждой части данных. Предусмотрены методы разделения на фрагменты по лексемам, словам и предложениям.
Альтернативно вы можете создать RAG из кода (где llm — ваш LLM):
RAG rag = gameObject.AddComponent<RAG>(); rag.Init(SearchMethods.DBSearch, ChunkingMethods.SentenceSplitter, llm);
В вашем скрипте вы можете использовать его следующим образом?:
используя LLMUnity; общедоступный класс MyScript: MonoBehaviour { ТРЯПКА тряпка; async void Game(){...string[] inputs = new string[]{ "Привет! Я поисковая система.", "Погода хорошая. Мне она нравится.", "Я RAG-система. "};// добавляем входные данные в RAGforeach (строковый ввод во входных данных) await rag.Add(input);// получаем 2 наиболее похожих входных данных и их расстояние (несходство) до поискового запроса(результаты string[], float [] distances) = await rag.Search("hello!", 2);// чтобы получить наиболее похожие части текста (chnuks), вы можете включить опцию returnChunksrag.ReturnChunks(true);(results, distances) = await rag.Search («здравствуйте!», 2);... }}
Вы можете сохранить состояние RAG (хранится в папке Assets/StreamingAssets
):
rag.Save("rag.zip");
и загрузим его с диска:
ждем rag.Load("rag.zip");
Вы можете использовать RAG для передачи соответствующих данных в LLM на основе сообщения пользователя:
string message = "Как погода?"; (string[]likePhrases, float[] расстояния) = await rag.Search(message, 3); string Prompt = «Ответить на запрос пользователя на основе предоставленных данных.nn»; подсказка += $"Запрос пользователя: {message}nn"; подсказка += $"Данные:n"; foreach (строкапохожая фраза в подобных фразах) приглашение += $"n- {similarPhrase}"; _ = llmCharacter.Chat(приглашение, 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~ содержится несколько примеров взаимодействия?:
SimpleInteraction: демонстрирует простое взаимодействие с персонажем ИИ.
MultipleCharacters: демонстрирует простое взаимодействие с использованием нескольких персонажей AI.
ТРЯПКА: образец ТРЯПКИ. Включает пример использования RAG для подачи информации в LLM.
Чат-бот: демонстрирует взаимодействие между игроком и ИИ с пользовательским интерфейсом, похожим на приложение для обмена сообщениями (см. изображение ниже).
KnowledgeBaseGame: простая детективная игра, использующая базу знаний для предоставления информации LLM на основе Google/mysteryofthreebots.
AndroidDemo: пример приложения Android с начальным экраном, отображающим ход загрузки модели.
Чтобы установить образец:
Откройте диспетчер пакетов: 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 и слота 0 для всех объектов LLMCharacter будет использовать полный контекст, но все приглашение необходимо будет вычислять (без кэширования) каждый раз, когда объект LLMCharacter используется для чата.
Dont Destroy On Load
выберите, чтобы не уничтожать игровой объект LLM при загрузке новой сцены.
Parallel Prompts
количество подсказок/слотов, которые могут выполняться параллельно (по умолчанию: -1 = количество объектов LLMCharacter). Обратите внимание, что размер контекста делится между слотами. 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 в формате .gguf
Load 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
имя AI
Prompt
описание роли ИИ
Выберите Stream
, чтобы получать ответ от модели по мере его создания (рекомендуется!).
Если он не выбран, полный ответ от модели будет получен за один раз.
Num Predict
максимальное количество токенов для прогнозирования (по умолчанию: 256, -1 = бесконечность, -2 = до заполнения контекста) Load grammar
нажмите, чтобы загрузить грамматику в формате .gbnf
Grammar
путь к используемой грамматике (относительно папки Assets/StreamingAssets).
Cache Prompt
сохранить текущее приглашение из чата (по умолчанию: true) Слот Slot
сервера, используемый для вычислений. Значение может быть установлено от 0 до Parallel Prompts
-1 (по умолчанию: -1 = новый слот для каждого символа).
Seed
материал для воспроизводимости. Для случайных результатов каждый раз используйте -1
Temperature
Температура 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).