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)中找到。