UnityのNPCをローカルLLMで喋らせてみた〜ゲームの中で動くAI会話〜
ゲームのNPCに、決められた台詞ではなくその場で考えた返事を喋らせたい。UnityからローカルLLMを呼んでNPCに人格と記憶を持たせ、ゲームループを止めずに動かせるかを実測しました。同期呼び出しは描画フレーム0枚、平均fpsは2.4%しか落ちないのに1% Lowは20%落ちる、記憶を切り詰めると入力が半分なのに待ち時間は1.8倍——予想が2つ外れた記録です。
プログラミングや3DCGで何か作りたいと思っているエンジニアがいます
ゲームのNPCに、決められた台詞ではなくその場で考えた返事を喋らせたい。UnityからローカルLLMを呼んでNPCに人格と記憶を持たせ、ゲームループを止めずに動かせるかを実測しました。同期呼び出しは描画フレーム0枚、平均fpsは2.4%しか落ちないのに1% Lowは20%落ちる、記憶を切り詰めると入力が半分なのに待ち時間は1.8倍——予想が2つ外れた記録です。
モデルを軽くする量子化は「賢さはほとんど落ちない」と言われます。本当かどうか、F16を1つ落として手元でQ8からQ2まで作り、perplexity・KL divergence・実際の出力の3つで測りました。数字の崖はQ3から。ところがQ2でもFizzBuzzは動き、17×24も当てます。崩れたのは日本語の説明文だけでした。さらに「日本語のほうが先に壊れるのでは」という予想を検証したところ、perplexityでは外れて見えたのにKL divergenceでは1.5倍脆いと出る——測り方で結論が変わる場面に行き当たった記録です。
AIの速さには tok/s・TTFT・スループットと色々な単位が出てきますが、「指示してから出力が終わるまで」は1つの数字では見られません。読み込む時間と書き出す時間に分けて足す、という見方を実測で確かめました。入力8千トークンでは最初の1文字まで39秒かかり、待ち時間の割合は7.9%から95.4%まで入れ替わります。さらに同時に使う人が増えると1人あたりは7分の1に落ちるのに全体の処理量は増える——同じ機械から3つの「速度」が出た記録です。
ローカルLLMで「モデルのどの部分をGPUに置き、どの部分をCPUに逃がすか」は自分で指定できます。llama.cppの -ngl / -ot / --n-cpu-moe を Apple M4・Radeon 780M・RTX 3060 の3構成で実測しました。統合メモリなら逃がしても損は小さいはず——という予想は外れ、M4では専門家をCPUへ回した瞬間に生成速度が37.77から2.53 tok/sへ、全部CPUに置くより10倍遅くなりました。真犯人はmmapで、--no-mmap を付けると6.6倍まで回復します。
クラウド型AIエージェントの『有料・トークン消費が膨大』問題を、完全ローカルで解決できないか試作。Ministral 3 14B(Q4)をllama-cpp-pythonで動かし、Web検索・ファイル読み書き・PC操作(マウス/キーボード)・CLI/MCP・RAG記憶・画像理解を1つのデスクトップアプリに統合。緊急停止と重要操作の確認も実装。Mac(M4)で構築しWindows(RTX3060)でも検証。コード・設定値つきで解説します。
ネット接続なしで動くAIアプリをMacで自作。軽量LLM(Qwen2.5-3B・gguf)をllama-cpp-pythonでデスクトップアプリに直接組み込み、PySide6のGUIで文章生成・要約をオフライン実行。Apple SiliconのGPU(Metal)で約38トークン/秒。インストール・モデル・コード・設定値まで再現できるよう解説します。