LLM for Unity 支持在 Unity 引擎中无缝集成大型语言模型 (LLM)。
它允许创建智能角色,玩家可以与之互动以获得身临其境的体验。
该软件包还具有检索增强生成(RAG)系统,允许跨数据执行语义搜索,这可用于增强角色的知识。 LLM for Unity 构建于出色的 llama.cpp 库之上。
?在 Unity 上测试:2021 LTS、2022 LTS、2023
?即将发布的版本
联系我们添加您的项目!
方法一:使用资源商店安装
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
按钮 (~GB) 下载默认模型之一。Load model
按钮加载您自己的 .gguf 模型(请参阅 LLM 模型管理)。然后你可以按如下方式设置每个角色?♀️:
Add Component
并选择 LLMCharacter 脚本。Prompt
中定义 AI 的角色。您可以定义AI的名称( AI Name
)和玩家( Player Name
)。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
作为目标架构。
可以从Player > Other Settings
部分中的Edit > Project Settings
菜单访问这些设置。
启用 LLM GameObject 中的Download on Build
选项以在启动时下载模型也是一个好主意,以保持应用程序较小的大小。
要自动保存/加载您的聊天历史记录,您可以将 LLMCharacter 的Save
参数指定为您选择的文件名(或相对路径)。文件保存在Unity的perpeterDataPath文件夹中。这还保存了 LLM 的状态,这意味着之前缓存的提示不需要重新计算。
要手动保存聊天记录,您可以使用:
llmCharacter . Save ( " filename " ) ;
并加载历史记录:
llmCharacter . Load ( " filename " ) ;
其中 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
脚本创建带有 GameObject 的项目LLM
的Remote
选项并可选择配置服务器参数:端口、API 密钥、SSL 证书、SSL 密钥或者,您可以使用服务器二进制文件来更轻松地部署:
windows-cuda-cu12.2.0
。创建角色
如上所述,使用LLMCharacter
脚本创建包含游戏角色的第二个项目。启用Remote
选项并使用服务器的 IP 地址(以“http://”开头)和端口配置主机。
Embeddings
函数可用于获取短语的嵌入:
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
有关功能级别的详细文档可以在这里找到:
Unity 法学硕士通过检索增强生成 (RAG) 系统实现超快速相似性搜索功能。
它基于 LLM 功能以及 usearch 库中的近似最近邻 (ANN) 搜索。
语义搜索的工作原理如下。
构建数据您提供文本输入(短语、段落、文档)以添加到数据中。
每个输入都被分成块(可选)并使用 LLM 编码为嵌入。
搜索然后您可以搜索查询文本输入。
输入再次被编码,并且检索数据中最相似的文本输入或块。
要使用语义搜索:
Add Component
并选择RAG
脚本。SimpleSearch
是一种简单的强力搜索,而DBSearch
是一种快速的 ANN 方法,在大多数情况下应该是首选。或者,您可以从代码创建 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 集成。
这就是全部✨!
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~ 文件夹包含几个交互示例?:
要安装示例:
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
选择安装并允许使用额外功能(闪光注意力和 IQ 量化) Remote
选择以提供对 LLM 的远程访问
Port
运行LLM服务器的端口(如果设置了Remote
)
Num Threads
要使用的线程数(默认值:-1 = 全部)
Num GPU Layers
要卸载到 GPU 的模型层数。如果设置为 0,则不使用 GPU。使用较大的数字(即 >30)以尽可能多地利用 GPU。请注意,上下文大小的值越高,将使用更多的 VRAM。如果不支持用户的GPU,LLM将回退到CPU
Debug
选择以在 Unity 编辑器中记录模型的输出
Parallel Prompts
可以并行发生的提示/槽的数量(默认值:-1 = LLMCharacter 对象的数量)。请注意,上下文大小是在槽之间划分的。例如,将所有 LLMCharacter 对象的Parallel Prompts
设置为 1 并将槽设置为 0 将使用完整上下文,但每当使用 LLMCharacter 对象进行聊天时,都需要计算整个提示(无缓存)。
Dont Destroy On Load
选择加载新场景时不销毁 LLM 游戏对象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
)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 的名称Prompt
描述Stream
选择以在模型生成时接收来自模型的回复(推荐!)。
如果不选则一次性收到模特完整回复
Num Predict
要预测的最大标记数(默认值:256,-1 = 无穷大,-2 = 直到上下文填充)Load grammar
单击加载 .gbnf 格式的语法Grammar
正在使用的语法的路径(相对于 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-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)中找到。