LLM for Unity を使用すると、Unity エンジン内で大規模言語モデル (LLM) をシームレスに統合できます。
これにより、プレイヤーが没入型体験のためにインタラクションできるインテリジェントなキャラクターを作成できます。
このパッケージには、データ全体でセマンティック検索を実行できる検索拡張生成 (RAG) システムも搭載されており、キャラクターの知識を強化するために使用できます。 LLM for 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
ボタン (~GB) を使用して、デフォルト モデルの 1 つをダウンロードします。Load model
ボタンを使用して独自の .gguf モデルをロードします (LLM モデル管理を参照)。次に、各キャラクターを次のように設定できます ?♀️:
Add Component
をクリックし、LLMCharacter スクリプトを選択します。Prompt
で AI の役割を定義します。 AI の名前 ( 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
ターゲット アーキテクチャとして指定する必要があります。
これらの設定には、 Player > Other Settings
セクション内のEdit > Project Settings
メニューからアクセスできます。
アプリのサイズを小さく保つために、LLM ゲームオブジェクトのDownload on Build
オプションを有効にして、起動時にモデルをダウンロードすることもお勧めします。
チャット履歴を自動的に保存/ロードするには、LLMCharacter のSave
パラメーターを選択したファイル名 (または相対パス) に指定できます。ファイルは Unity のpersistentDataPath フォルダーに保存されます。これにより、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
スクリプトを使用してゲームオブジェクトを含むプロジェクトを作成します。LLM
のRemote
オプションを有効にし、オプションでサーバー パラメーターを構成します: ポート、API キー、SSL 証明書、SSL キーあるいは、展開を容易にするためにサーバー バイナリを使用することもできます。
windows-cuda-cu12.2.0
を使用します。キャラクターを作成する
上で説明したように、 LLMCharacter
スクリプトを使用して、ゲーム キャラクターを含む 2 番目のプロジェクトを作成します。 Remote
オプションを有効にし、サーバーの IP アドレス (「http://」で始まる) とポートを使用してホストを構成します。
Embeddings
関数を使用して、フレーズの埋め込みを取得できます。
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
関数レベルの詳細なドキュメントは次の場所にあります。
LLM for 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 ゲームオブジェクトの一部として見つかります。
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
ゲームオブジェクトを選択し、 [ Download Model
ボタンをクリックしてデフォルトのモデルをダウンロードするか、 Load model
ます (LLM モデル管理を参照)。
シーンを保存して、実行してお楽しみください。
Show/Hide Advanced Options
以下から詳細オプションの表示/非表示を切り替えますLog Level
ログ メッセージの詳細度を選択しますUse extras
を選択して、追加機能 (フラッシュ アテンションと IQ クォント) をインストールして使用できるようにします。 LLM へのリモート アクセスを提供するRemote
選択
Port
LLM サーバーを実行するポート ( Remote
が設定されている場合)
Num Threads
使用するスレッドの数 (デフォルト: -1 = すべて)
Num GPU Layers
GPU にオフロードするモデル レイヤーの数。 0 に設定すると、GPU は使用されません。 GPU をできるだけ活用するには、30 を超える大きな数値を使用します。コンテキスト サイズの値が大きくなると、より多くの VRAM が使用されることに注意してください。ユーザーの GPU がサポートされていない場合、LLM は CPU にフォールバックします。
Unity エディターでモデルの出力を記録するためのDebug
選択
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
( Remote
が設定されている場合) リクエストのエンドツーエンド暗号化に使用される SSL 証明書。SSL key path
リクエストのエンドツーエンド暗号化に使用される SSL キー ( Remote
が設定されている場合)。 Download model
クリックしてデフォルト モデルの 1 つをダウンロードします
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
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
。毎回ランダムな結果を得るには、-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 ライセンスを持つサードパーティ ソフトウェアを使用します。アセットに含まれる一部のモデルは独自のライセンス条項を定義しているため、各モデルを使用する前にそれらを確認してください。サードパーティのライセンスは、(Third Party Notices.md) にあります。