LLM for Unity を使用すると、Unity エンジン内で大規模言語モデル (LLM) をシームレスに統合できます。
これにより、プレイヤーが没入型体験のためにインタラクションできるインテリジェントなキャラクターを作成できます。
このパッケージには、データ全体でセマンティック検索を実行できる検索拡張生成 (RAG) システムも搭載されており、キャラクターの知識を強化するために使用できます。 LLM for Unity は、素晴らしい llama.cpp ライブラリ上に構築されています。
概要 • ヘルプ方法 • Unity 用 LLM を使用したゲーム • セットアップ • 使用方法 • RAG • LLM モデル管理 • 例 • オプション • ライセンス
クロスプラットフォーム! Windows、Linux、macOS、Android
?インターネットにアクセスせずにローカルで実行します。ゲームからデータが流出することはありません。
⚡ CPU および GPU での超高速推論 (Nvidia、AMD、Apple Metal)
?すべての主要な LLM モデルをサポート
?セットアップが簡単で、1 行のコードで呼び出すことができます
?個人目的でも商用目的でも無料で使用できます
? Unity でテスト済み: 2021 LTS、2022 LTS、2023
?今後のリリース
リポジトリにスターを付け、レビューを残して、このプロジェクトについて広めてください。
Discord に参加して挨拶しましょう。
機能リクエスト、バグ、またはあなた自身の PR を送信して貢献してください。
この作業により、さらに優れた機能が使用できるようになります。
口頭評決
私、チャットボット:AISYLUM
虚空の名も無き魂たち
通路4の殺人
こだわりのフードデリバリーAI
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 Inspector でAdd Component
をクリックし、LLM スクリプトを選択します。
[モデルのDownload Model
ボタン (~GB) を使用して、デフォルト モデルの 1 つをダウンロードします。
または、 Load model
ボタンを使用して独自の .gguf モデルをロードします (LLM モデル管理を参照)。
次に、各キャラクターを次のように設定できます ?♀️:
キャラクター用の空のゲームオブジェクトを作成します。
GameObject Inspector でAdd Component
をクリックし、LLMCharacter スクリプトを選択します。
Prompt
で AI の役割を定義します。 AI の名前 ( AI Name
) とプレーヤー ( Player Name
) を定義できます。
(オプション) 複数の LLM ゲームオブジェクトがある場合は、 LLM
フィールドで上記で構築された LLM を選択します。
好みに応じて LLM と文字設定を調整することもできます (「オプション」を参照)。
スクリプトでは次のように使用できます。
LLMUnity を使用する;パブリック クラス MyScript { パブリック LLMCharacter llmCharacter; void HandleReply(string Reply){// modelDebug.Log(reply) からの応答に対して何らかの処理を行います。 } void Game(){// ゲーム関数...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply);... }}
モデル応答が完了したときに呼び出す関数を指定することもできます。
これは、モデルからの連続出力に対してStream
オプションが有効になっている場合に便利です (デフォルトの動作)。
void ReplyCompleted(){// モデルからの応答が完了したときに何かを実行しますDebug.Log("AI が応答しました"); } void Game(){// ゲーム関数...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted);... }
完了を待たずにチャットを停止するには、次のコマンドを使用できます。
llmCharacter.CancelRequests();
最後に、スクリプトのゲームオブジェクトのインスペクターで、上で作成した LLMCharacter ゲームオブジェクトを llmCharacter プロパティとして選択します。
以上です✨!
次のこともできます。
Android アプリを構築するには、プレーヤー設定でIL2CPP
スクリプト バックエンドとARM64
ターゲット アーキテクチャとして指定する必要があります。
これらの設定には、 Player > Other Settings
セクション内のEdit > Project Settings
メニューからアクセスできます。
アプリのサイズを小さく保つために、LLM ゲームオブジェクトのDownload on Build
オプションを有効にして、起動時にモデルをダウンロードすることもお勧めします。
チャット履歴を自動的に保存/ロードするには、LLMCharacter のSave
パラメーターを選択したファイル名 (または相対パス) に指定できます。ファイルは Unity のpersistentDataPath フォルダーに保存されます。これにより、LLM の状態も保存されます。つまり、以前にキャッシュされたプロンプトを再計算する必要がなくなります。
チャット履歴を手動で保存するには、以下を使用できます。
llmCharacter.Save("ファイル名");
そして履歴をロードするには:
llmCharacter.Load("ファイル名");
ここで、 filename は選択したファイル名または相対パスです。
void WarmupCompleted(){// ウォームアップが完了したら何かを実行しますDebug.Log("AI は良好で準備ができています"); } void Game(){// ゲーム関数..._ = llmCharacter.Warmup(WarmupCompleted);... }
Chat
関数の最後の引数は、メッセージを履歴に追加するかどうかを指定するブール値です (デフォルト: true)。
void Game(){// ゲーム関数...string message = "Hello bot!";_ = llmCharacter.Chat(message, HandleReply, ReplyCompleted, false);... }
void Game(){// ゲーム関数...string message = "猫は離れています";_ = llmCharacter.Complete(message, HandleReply, ReplyCompleted);... }
このために、 async
/ await
機能を使用できます。
async void Game(){// ゲーム関数...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(){// theAwake がすぐに呼び出されないように gameObject を無効にしますgameObject.SetActive(false);// LLM objectllm = gameObject を追加します。 AddComponent<LLM>();// モデルのファイル名を使用してモデルを設定します。// モデルをLLM モデル マネージャー (LLM モデル管理を参照) をロードまたはダウンロードします。// それ以外の場合は、モデル ファイルを StreamingAssets フォルダー内に直接コピーできます。llm.SetModel("Phi-3-mini-4k-instruct-q4.gguf") ;// オプション: 同様の方法で lora を設定し、その重みを設定することもできます ( required)llm.AddLora("my-lora.gguf");llm.SetLoraWeight(0.5f);// オプション: モデルが正しく識別されない場合は、モデルのチャット テンプレートを設定できます// のリストを見つけることができます。 ChatTemplate.templates.Keysllm.SetTemplate("phi-3");// オプション: スレッド数を設定llm.numThreads = -1;// オプション: 有効にするオフロードするモデル レイヤーの数を itllm.numGPULayers = 10 に設定して GPU に設定します。// LLMCharacter を追加します。 objectllmCharacter = 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;// オプション: 文法を設定します// await llmCharacter.SetGrammar("json.gbnf");// gameObjectgameObject.SetActive(true) を再度有効にします;}}
リモート サーバーを使用して処理を実行し、リモート サーバーと対話するキャラクターを実装できます。
サーバーを作成する
サーバーを作成するには:
上で説明したように、 LLM
スクリプトを使用してゲームオブジェクトを含むプロジェクトを作成します。
LLM
のRemote
オプションを有効にし、オプションでサーバー パラメーターを構成します: ポート、API キー、SSL 証明書、SSL キー
ビルドして実行してサーバーを起動します
あるいは、展開を容易にするためにサーバー バイナリを使用することもできます。
エディターから上記のシーンを実行し、デバッグ メッセージからコマンド (「サーバー コマンド:」で始まる) をコピーします。
サーバーのバイナリと DLL をダウンロードし、同じフォルダーに抽出します。
上記のフォルダーから興味のあるアーキテクチャを見つけます。たとえば、Windows と CUDA の場合は、 windows-cuda-cu12.2.0
を使用します。
デバッグ メッセージ (「アーキテクチャの使用」で始まる) から、システムで動作するアーキテクチャを確認することもできます。
コマンド ラインから、選択したアーキテクチャ フォルダーにディレクトリを変更し、上からコピーしたコマンドを実行してサーバーを起動します。
キャラクターを作成する
上で説明したように、 LLMCharacter
スクリプトを使用して、ゲーム キャラクターを含む 2 番目のプロジェクトを作成します。 Remote
オプションを有効にし、サーバーの IP アドレス (「http://」で始まる) とポートを使用してホストを構成します。
Embeddings
関数を使用して、フレーズの埋め込みを取得できます。
List<float>embeddings = await llmCharacter.Embeddings("こんにちは、お元気ですか?");
関数レベルの詳細なドキュメントは次の場所にあります。
LLM for Unity は、検索拡張生成 (RAG) システムを使用した超高速の類似性検索機能を実装します。
これは、LLM 機能と、usearch ライブラリからの近似最近傍 (ANN) 検索に基づいています。
セマンティック検索は次のように機能します。
データの構築データに追加するテキスト入力 (フレーズ、段落、ドキュメント) を提供します。
各入力はチャンクに分割され (オプション)、LLM を使用して埋め込みにエンコードされます。
検索次に、クエリ テキスト入力を検索できます。
入力は再度エンコードされ、データ内の最も類似したテキスト入力またはチャンクが取得されます。
セマンティック検索を使用するには:
上で説明したように、LLM のゲームオブジェクトを作成します。提供されている RAG モデルの 1 つをダウンロードするか、独自の 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{ ラグラグ。 async void Game(){...string[] inputs = new string[]{ "こんにちは! 私は検索システムです。"、"天気がいいですね。気に入っています。"、"私は RAG システムです。" "};// 入力を RAGforeach に追加します (入力に文字列入力) await rag.Add(input);// 最も類似した 2 つの入力と、検索クエリまでの距離 (相違度) を取得します(string[] results, float [] distances) = await rag.Search("hello!", 2);// 最も類似したテキスト部分 (chnuks) を取得するには、returnChunks オプションを有効にできますrag.ReturnChunks(true);(results, distances) = await rag.Search (「こんにちは!」、2);... }}
RAG 状態を保存できます ( Assets/StreamingAssets
フォルダーに保存されます)。
rag.Save("rag.zip");
そしてディスクからロードします:
await rag.Load("rag.zip");
RAG を使用すると、ユーザー メッセージに基づいて関連データを LLM にフィードできます。
文字列メッセージ = "天気はどうですか?"; (string[] likePhrases, float[] distances) = await rag.Search(message, 3); 文字列プロンプト = "提供されたデータに基づいてユーザーのクエリに答えます。nn"; プロンプト += $"ユーザークエリ: {メッセージ}nn"; プロンプト += $"データ:n"; foreach (similarPhrases 内の類似したフレーズの文字列) プロンプト += $"n- {similarPhrase}"; _ = llmCharacter.Chat(プロンプト、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~ フォルダーには、対話の例がいくつか含まれています。
SimpleInteraction: AI キャラクターとの単純なインタラクションを示します。
MultipleCharacters: 複数の AI キャラクターを使用した単純なインタラクションをデモします。
RAG: RAG サンプル。 RAG を使用して LLM に情報をフィードする例が含まれています
ChatBot: メッセージング アプリに似た UI を使用して、プレーヤーと AI 間の対話を示します (下の画像を参照)
KnowledgeBaseGame: 知識ベースを使用して、google/mysteryofthreebots に基づいて LLM に情報を提供する単純な探偵ゲーム
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 クォント) をインストールして使用できるようにします。
LLM へのリモート アクセスを提供するRemote
選択
Port
LLM サーバーを実行するポート ( Remote
が設定されている場合)
Num Threads
使用するスレッドの数 (デフォルト: -1 = すべて)
Num GPU Layers
GPU にオフロードするモデル レイヤーの数。 0 に設定すると、GPU は使用されません。 GPU をできるだけ活用するには、30 を超える大きな数値を使用します。コンテキスト サイズの値が大きくなると、より多くの VRAM が使用されることに注意してください。ユーザーの GPU がサポートされていない場合、LLM は CPU にフォールバックします。
Unity エディターでモデルの出力を記録するためのDebug
選択
たとえば、すべての 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
( 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
が設定されていない場合)
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 ライセンスを持つサードパーティ ソフトウェアを使用します。アセットに含まれる一部のモデルは独自のライセンス条項を定義しているため、各モデルを使用する前にそれらを確認してください。サードパーティのライセンスは、(Third Party Notices.md) にあります。