LLM for Unity 支持在 Unity 引擎中无缝集成大型语言模型 (LLM)。
它允许创建智能角色,玩家可以与之互动以获得身临其境的体验。
该软件包还具有检索增强生成(RAG)系统,允许跨数据执行语义搜索,这可用于增强角色的知识。 LLM for Unity 构建于出色的 llama.cpp 库之上。
概览 • 如何帮助 • 使用 LLM for Unity 的游戏 • 设置 • 如何使用 • RAG • LLM 模型管理 • 示例 • 选项 • 许可证
跨平台! Windows、Linux、macOS 和 Android
?在本地运行,无需访问互联网。任何数据都不会离开游戏!
⚡ CPU 和 GPU 上的极速推理(Nvidia、AMD、Apple Metal)
?支持所有主要的LLM模型
?易于设置,只需一行代码即可调用
?免费用于个人和商业目的
?在 Unity 上测试:2021 LTS、2022 LTS、2023
?即将发布的版本
为存储库加注星标,给我们留下评论并传播有关该项目的信息!
加入 Discord 并打个招呼。
通过提交功能请求、错误甚至您自己的 PR 来做出贡献。
这项工作可以实现更酷的功能!
口头判决
I,聊天机器人:AISYLUM
无名虚空之魂
过道谋杀案4
挑剔的食品配送人工智能
AI情感女友
结案
联系我们添加您的项目!
方法一:使用资源商店安装
打开 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 Inspector 中单击Add Component
并选择 LLM 脚本。
使用Download Model
按钮 (~GB) 下载默认模型之一。
或者使用Load model
按钮加载您自己的 .gguf 模型(请参阅 LLM 模型管理)。
然后你可以按如下方式设置每个角色?♀️:
为角色创建一个空的游戏对象。
在 GameObject Inspector 中单击Add Component
并选择 LLMCharacter 脚本。
在Prompt
中定义 AI 的角色。您可以定义AI的名称( AI Name
)和玩家( Player Name
)。
(可选)如果您有多个 LLM 游戏对象,请在LLM
字段中选择上面构建的 LLM。
您还可以根据您的喜好调整法学硕士和角色设置(请参阅选项)。
在您的脚本中,您可以按如下方式使用它?:
使用LLMUnity;公共类MyScript { 公共LLMCharacter llmCharacter; void HandleReply(stringreply){// 对 modelDebug.Log(reply) 的回复执行一些操作; } void Game(){// 你的游戏函数...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply);... }}
您还可以指定模型回复完成时要调用的函数。
如果启用了Stream
选项以实现模型的连续输出(默认行为),这非常有用:
void ReplyCompleted(){// 当模型的回复完成时执行某些操作Debug.Log("The AI returned"); } void Game(){// 你的游戏函数...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted);... }
要停止聊天而不等待其完成,您可以使用:
llmCharacter.CancelRequests();
最后,在脚本的 GameObject 的检查器中,选择上面创建的 LLMCharacter GameObject 作为 llmCharacter 属性。
这就是全部✨!
您还可以:
要构建 Android 应用程序,您需要在播放器设置中指定IL2CPP
脚本后端和ARM64
作为目标架构。
可以从Player > Other Settings
部分中的Edit > Project Settings
菜单访问这些设置。
在 LLM 游戏对象中启用Download on Build
选项以在启动时下载模型也是一个好主意,以保持应用程序较小的大小。
要自动保存/加载您的聊天历史记录,您可以将 LLMCharacter 的Save
参数指定为您选择的文件名(或相对路径)。文件保存在Unity的perpeterDataPath文件夹中。这还保存了 LLM 的状态,这意味着之前缓存的提示不需要重新计算。
要手动保存聊天记录,您可以使用:
llmCharacter.Save("文件名");
并加载历史记录:
llmCharacter.Load("文件名");
其中 filename 您选择的文件名或相对路径。
void WarmupCompleted(){// 预热完成时执行某些操作Debug.Log("The AI is Nice and Ready"); } void Game(){// 你的游戏函数..._ = llmCharacter.Warmup(WarmupCompleted);... }
Chat
函数的最后一个参数是一个布尔值,指定是否将消息添加到历史记录中(默认值:true):
void Game(){// 你的游戏函数...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted, false);... }
void Game(){// 你的游戏函数...string message = "The cat is away";_ = llmCharacter.Complete(message, HandleReply, ReplyCompleted);... }
为此,您可以使用async
/ await
功能:
async void Game(){// 你的游戏函数...string message = "Hello bot!";stringreply = wait llmCharacter.Chat(message, HandleReply, ReplyCompleted);Debug.Log(reply);... }
using UnityEngine;using LLMUnity;public class MyScript : MonoBehaviour{LLM llm;LLMCharacter llmCharacter;async void Start(){// 禁用 gameObject,以便不会立即调用 theAwakegameObject.SetActive(false);// 添加一个 LLM 对象llm = gameObject. AddComponent<LLM>();//使用模型的文件名设置模型。//需要将模型添加到LLM模型中通过加载或下载来管理(参见LLM模型管理)。//否则可以直接将模型文件复制到StreamingAssets文件夹中。llm.SetModel("Phi-3-mini-4k-instruct-q4.gguf");/ / 可选:您还可以以类似的方式设置 loras 并设置它们的权重(如果需要)llm.AddLora("my-lora.gguf");llm.SetLoraWeight(0.5f);//可选:如果没有正确识别,可以设置该模特的聊天模板//可以找到以下列表聊天模板中的ChatTemplate.templates.Keysllm.SetTemplate("phi-3");//可选:设置线程数llm.numThreads = -1;//可选:通过设置线程数启用GPU要卸载到 itllm.numGPULayers = 10;// 添加一个 LLMCharacter 对象llmCharacter = gameObject.AddComponent<LLMCharacter>();// 设置处理模型的 LLM 对象llmCharacter.llm = llm;// 设置字符提示llmCharacter.SetPrompt (“好奇的人类和人工智能助手之间的聊天。”);//设置AI和玩家namellmCharacter.AIName = "AI";llmCharacter.playerName = "Human";// 可选:将流式设置为 false,以便一次性获得完整结果 // llmCharacter.stream = true;// 可选:设置保存路径// llmCharacter.save = "AICharacter1";// 可选:启用保存缓存以避免加载保存文件时重新计算(需要约 100 MB)// llmCharacter.saveCache = true;// 可选:设置语法//等待 llmCharacter.SetGrammar("json.gbnf");// 重新启用 gameObjectgameObject.SetActive(true);}}
您可以使用远程服务器来执行处理并实现与其交互的角色。
创建服务器
创建服务器:
如上所述,使用LLM
脚本创建带有 GameObject 的项目
启用LLM
的Remote
选项并可选择配置服务器参数:端口、API 密钥、SSL 证书、SSL 密钥
构建并运行以启动服务器
或者,您可以使用服务器二进制文件来更轻松地部署:
从编辑器运行上述场景并从调试消息中复制命令(以“服务器命令:”开头)
下载服务器二进制文件和 DLL 并将它们解压到同一文件夹中
从上面的文件夹中找到您感兴趣的架构,例如对于 Windows 和 CUDA 使用windows-cuda-cu12.2.0
。
您还可以从调试消息中检查适用于您的系统的体系结构(从“使用体系结构”开始)。
从命令行将目录更改为所选的体系结构文件夹,并通过运行从上面复制的命令来启动服务器。
创建角色
如上所述,使用LLMCharacter
脚本创建包含游戏角色的第二个项目。启用Remote
选项并使用服务器的 IP 地址(以“http://”开头)和端口配置主机。
Embeddings
函数可用于获取短语的嵌入:
List<float> embeddings = wait llmCharacter.Embeddings("嗨,你好吗?");
有关功能级别的详细文档可以在这里找到:
Unity 法学硕士通过检索增强生成 (RAG) 系统实现超快速相似性搜索功能。
它基于 LLM 功能和 usearch 库中的近似最近邻 (ANN) 搜索。
语义搜索的工作原理如下。
构建数据您提供文本输入(短语、段落、文档)以添加到数据中。
每个输入都被分成块(可选)并使用 LLM 编码为嵌入。
搜索然后您可以搜索查询文本输入。
输入再次被编码,并且检索数据中最相似的文本输入或块。
要使用语义搜索:
如上所述,为 LLM 创建一个游戏对象。下载提供的 RAG 模型之一或加载您自己的模型(可以在 MTEB 排行榜上找到不错的选择)。
创建一个空的游戏对象。在 GameObject Inspector 中单击Add Component
并选择RAG
脚本。
在 RAG 的“搜索类型”下拉列表中,选择您的首选搜索方法。 SimpleSearch
是一种简单的强力搜索,而DBSearch
是一种快速的 ANN 方法,在大多数情况下应该是首选。
在 RAG 的分块类型下拉列表中,您可以选择将输入拆分为块的方法。这对于在每个数据部分中具有更一致的含义很有用。提供了根据标记、单词和句子进行分割的分块方法。
或者,您可以从代码创建 RAG(其中 llm 是您的 LLM):
RAG rag = gameObject.AddComponent<RAG>(); rag.Init(SearchMethods.DBSearch, ChunkingMethods.SentenceSplitter, llm);
在您的脚本中,您可以按如下方式使用它?:
使用 LLMUnity;公共类 MyScript : MonoBehaviour{ RAG 抹布; async void Game(){...string[] input = new string[]{ "嗨!我是搜索系统。", "天气很好。我喜欢它。", "我是 RAG 系统"};// 将输入添加到 RAGforeach(输入中的字符串输入)等待 rag.Add(input);// 获取 2 个最相似的输入及其与搜索查询的距离(相异性)(string[] results, float [] 距离) = 等待rag.Search("hello!", 2);// 要获取最相似的文本部分 (chnuks),您可以启用 returnChunks 选项rag.ReturnChunks(true);(results, distances) = wait rag.Search("hello! “,2);... }}
您可以保存 RAG 状态(存储在Assets/StreamingAssets
文件夹中):
rag.Save("rag.zip");
并从磁盘加载它:
等待 rag.Load("rag.zip");
您可以使用 RAG 根据用户消息将相关数据提供给 LLM:
string message = "天气怎么样?"; (string[] 相似短语, float[] 距离) = wait rag.Search(message, 3); string Prompt = "根据提供的数据回答用户查询.nn"; 提示 += $"用户查询:{message}nn"; 提示 += $"数据:n"; foreach(相似短语中的字符串相似短语)提示+ = $“n- {similarPhrase}”; _ = llmCharacter.Chat(提示、HandleReply、ReplyCompleted);
RAG
示例包括示例 RAG 实现以及示例 RAG-LLM 集成。
这就是全部✨!
Unity 的 LLM 使用模型管理器,允许加载或下载 LLM 并将其直接发送到您的游戏中。
模型管理器可以作为 LLM GameObject 的一部分找到:
您可以使用Download model
按钮下载模型。
LLM for Unity 包括针对不同模型大小内置的不同最先进模型,并使用 Q4_K_M 方法进行量化。
可以从 HuggingFace 下载 .gguf 格式的替代模型。
您可以将模型下载到本地并使用Load model
按钮加载,也可以复制Download model > Custom URL
字段中的 URL 直接下载。
如果HuggingFace模型不提供gguf文件,可以使用此在线转换器将其转换为gguf。
用于构造提示的聊天模板是根据模型(如果存在相关条目)或模型名称自动确定的。
如果识别不正确,您可以从聊天模板下拉列表中选择另一个模板。
在模型管理器中添加的模型会在构建过程中复制到游戏中。
您可以通过取消选择“构建”复选框来忽略构建模型。
要删除模型(但不从磁盘中删除它),您可以单击 bin 按钮。
每个添加的模型的路径和 URL(如果已下载)显示在模型管理器访问的扩展视图中,使用>>
按钮:
您可以通过选择Download on Build
选项来创建更轻的构建。
使用此选项,模型将在游戏第一次启动时下载,而不是在构建中复制。
如果您已在本地加载模型,则需要通过展开的视图设置其 URL,否则它将在构建中复制。
❕ 在使用任何型号之前,请确保检查其许可证❕
Samples~ 文件夹包含几个交互示例?:
SimpleInteraction:演示与 AI 角色的简单交互
MultipleCharacters:演示使用多个 AI 角色的简单交互
RAG:RAG 样本。包括使用 RAG 向 LLM 提供信息的示例
ChatBot:通过类似于消息传递应用程序的 UI 演示玩家和 AI 之间的交互(见下图)
KnowledgeBaseGame:使用知识库为基于 google/mysteryof Threebots 的 LLM 提供信息的简单侦探游戏
AndroidDemo:示例 Android 应用程序,带有包含模型下载进度的初始屏幕
要安装示例:
打开包管理器: Window > Package Manager
选择LLM for Unity
。在Samples
选项卡中,单击要安装的示例旁边的Import
。
这些示例可以使用它们包含在文件夹内的Scene.unity
场景来运行。
在场景中,选择LLM
GameObject并单击Download Model
按钮下载默认模型或Load model
以加载您自己的模型(请参阅LLM模型管理)。
保存场景,奔跑并享受吧!
Show/Hide Advanced Options
切换以显示/隐藏下面的高级选项
Log Level
选择日志消息的详细程度
Use extras
选择安装并允许使用额外功能(闪光注意力和智商量化)
Remote
选择以提供对 LLM 的远程访问
Port
运行LLM服务器的端口(如果设置了Remote
)
Num Threads
要使用的线程数(默认值:-1 = 全部)
Num GPU Layers
要卸载到 GPU 的模型层数。如果设置为 0,则不使用 GPU。使用较大的数字(即 >30)以尽可能多地利用 GPU。请注意,上下文大小的值越高,将使用更多的 VRAM。如果不支持用户的GPU,LLM将回退到CPU
Debug
选择以在 Unity 编辑器中记录模型的输出
例如,将所有 LLMCharacter 对象的Parallel Prompts
设置为 1 并将槽设置为 0 将使用完整上下文,但每当使用 LLMCharacter 对象进行聊天时,都需要计算整个提示(无缓存)。
Dont Destroy On Load
选择加载新场景时不销毁 LLM 游戏对象
Parallel Prompts
可以并行发生的提示/槽的数量(默认值:-1 = LLMCharacter 对象的数量)。请注意,上下文大小是在槽之间划分的。API key
用于允许访问来自 LLMCharacter 对象的请求的 API 密钥(如果设置了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
点击下载.gguf 格式的 LoRA 模型
Load lora
单击加载.gguf 格式的LoRA 模型
Batch Size
用于提示处理的批量大小(默认值:512)
Model
正在使用的模型的路径(相对于 Assets/StreamingAssets 文件夹)
Chat Template
用于 LLM 的聊天模板
Lora
正在使用的 LoRA 的路径(相对于 Assets/StreamingAssets 文件夹)
Lora Weights
正在使用的 LoRA 的权重
Flash Attention
单击可在模型中使用 Flash Attention(如果启用了Use extras
)
Base Prompt
在使用 LLM 的所有 LLMCharacter 对象中使用通用基本提示
Show/Hide Advanced Options
切换以显示/隐藏下面的高级选项
Log Level
选择日志消息的详细程度
Use extras
选择安装并允许使用额外功能(闪光注意力和 IQ 量化)
Remote
无论使用的 LLM 是远程还是本地
LLM
LLM 游戏对象(如果未设置Remote
)
LLM 服务器的Hort
ip(如果设置了Remote
)
Port
LLM服务器的端口(如果设置了Remote
)
Num Retries
来自 LLM 服务器的 HTTP 请求重试次数(如果设置了Remote
)
API key
LLM 服务器的 API 密钥(如果设置了Remote
)
Save
保存文件名或相对路径 Save Cache
选择保存 LLM 状态以及聊天历史记录。 LLM 状态通常约为 100MB+。
Debug Prompt
选择在 Unity 编辑器中记录构建的提示
Player Name
玩家的名字
AI Name
AI 的名称
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-size)。
Penalize Nl
:应用重复惩罚时惩罚换行符(默认值:true)。
Penalty Prompt
:提示处罚评估的目的。可以是null
、字符串或表示标记的数字数组(默认值: null
= 使用原始prompt
)。
Mirostat
:启用 Mirostat 采样,控制文本生成过程中的困惑(默认值:0,0 = 禁用,1 = Mirostat,2 = Mirostat 2.0)。
Mirostat Tau
:设置 Mirostat 目标熵,参数 tau(默认值:5.0)。
Mirostat Eta
:设置 Mirostat 学习率,参数 eta(默认值:0.1)。
N Probs
:如果大于 0,则响应还包含每个生成令牌的前 N 个令牌的概率(默认值:0)
Ignore Eos
:启用忽略流结束标记并继续生成(默认值: false)。
LLM for Unity 的许可证是 MIT (LICENSE.md),并使用具有 MIT 和 Apache 许可证的第三方软件。资产中包含的某些模型定义了自己的许可条款,请在使用每个模型之前查看它们。第三方许可证可以在(第三方声明.md)中找到。