本日はAI・Unity枠です。
先日LMStudioを使用してローカル環境でLLMを使用していきました。
これによってネットワーク制限環境であっても無料でLLMを使用できます。

問題点としては現代の最新のGeminiやOpenAIのモデルに比べ制度が劣る点があげられますが、例えば単純なおしゃべりアプリなどではこれでも十分な性能を誇ります。
またLMStudioはサーバー機能をオンにすることで外部アプリからアクセスすることもできます。
今回はUnityでLMStudioと通信を行っていきます。
〇UnityでのLMStudioとの通信
Unityとの通信の前にLMStudio側でサーバー機能を使用しておきます。
これはサイドメニューDevelopmentから

サーバーのトグルを有効化することで実行されます。

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class LLMClient : MonoBehaviour
{
private string apiUrl = "http://localhost:1234/v1/chat/completions";
void Start()
{
// プロンプトを送信して応答を取得
StartCoroutine(SendPrompt());
}
IEnumerator SendPrompt()
{
// 手動でJSONデータを作成
string jsonData = @"
{
""model"": ""gemma-2-2b-it"",
""messages"": [
{ ""role"": ""system"", ""content"": ""常に韻を踏んで答えること。今日は木曜日です"" },
{ ""role"": ""user"", ""content"": ""今日は何曜日?"" }
],
""temperature"": 0.7,
""max_tokens"": -1,
""stream"": false
}";
// HTTPリクエストの設定
UnityWebRequest request = new UnityWebRequest(apiUrl, "POST");
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
// リクエストの送信
yield return request.SendWebRequest();
// 応答の処理
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("Response: " + request.downloadHandler.text);
}
else
{
Debug.LogError("Error: " + request.error);
}
}
}
このコードではローカルホストの1234ポートと通信をしています。
1234ポートがデフォルトのLMStudioのサーバーの使用しているポートになります。
これを実行すると以下のようなレスポンスを得られました。
Response: {
"id": "chatcmpl-plrf1thp7fhm2ps0tm6le",
"object": "chat.completion",
"created": 1741766026,
"model": "gemma-2-2b-it",
"choices": [
{
"index": 0,
"logprobs": null,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "今日は木曜日だ、よっ! 🎤 rhyme-a-licious! \n"
}
}
],
"usage": {
"prompt_tokens": 31,
"completion_tokens": 20,
"total_tokens": 51
},
"stats": {},
"system_fingerprint": "gemma-2-2b-it"
}
以上でローカルLLMをUnityでアクセスすることができました。
なお、system側のロールがChatGPTの役割のprompt、 userのロールがユーザーからのメッセージになります。
本日は以上です。