🤖

【Unity×AI】UnityとOpenAIで簡単なAI連携システムの構築

2024/12/25に公開

今回の記事では、UnityとFastAPIを使って、OpenAI APIを活用する簡単なシステムを構築しています。PythonでFastAPIサーバーをセットアップし、Unityからリクエストを送信してAIの応答を受け取るまでの流れを紹介します。


全体の流れ

  1. FastAPIでAI用のAPIサーバーを作成
  2. UnityからHTTPリクエストを送信
  3. AIの応答をUnityで取得・表示

1. FastAPIでAIサーバーを構築

必要な準備

Pythonをインストールしていない場合は、公式サイトからインストールしてください。また、pipで必要なライブラリをインストールします。

python -m venv venv

仮想環境を有効化します。

venv\Scripts\activate
pip install fastapi uvicorn openai python-dotenv

FastAPIサーバーのコード

以下のコードをmain.pyとして保存してください。


from fastapi import FastAPI, HTTPException, Query
from openai import OpenAI
import os
from dotenv import load_dotenv

# 環境変数からAPIキーをロード
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

if api_key is None:
    raise ValueError("APIキーが環境変数から読み取れませんでした。'.env' ファイルを確認してください。")

# OpenAIクライアントの初期化
client = OpenAI(api_key=api_key)

# FastAPIアプリケーションの作成
app = FastAPI()

@app.get("/generate-text")
async def generate_text(prompt: str = Query(..., description="生成するテキストのプロンプト")):
    try:
        # OpenAI APIを使って補完を作成
        completion = client.chat.completions.create(
            model="gpt-4",
            store=True,
            messages=[
                {"role": "user", "content": prompt}
            ],
            max_tokens=50  # 最大トークン数を固定
        )
        # 応答テキストを取得
        generated_text = completion.choices[0].message.content
        return {"response": generated_text}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    import subprocess
    subprocess.run(["uvicorn", "main:app", "--host", "127.0.0.1", "--port", "5000"])

プロジェクトフォルダに.envファイルを作成し、APIキーを設定します:

OPENAI_API_KEY=your_openai_api_key_here

このサーバーは、/generate-textエンドポイントでリクエストを受け取り、OpenAI APIを使って応答を生成します。


2. Unityでリクエストを送信

次にUnityからFastAPIサーバーにリクエストを送信します。

Unityスクリプト

以下のスクリプトをPythonAPIController.csとして作成し、適当なGameObjectにアタッチしてください。


using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class PythonAPIController : MonoBehaviour
{
    private string _serverUrl = "http://127.0.0.1";
    private string _serverPort = "5000";
    private string _command = "generate-text";
    [SerializeField] private string _prompt = "Hello world";
    [Header("リクエスト送信")]
    [SerializeField] private bool _sendRequest = false;

    private string _requestFullUrl;

    void Start()
    {
        // クエリパラメータを含めないURL
        _requestFullUrl = $"{_serverUrl}:{_serverPort}/{_command}";
    }

    void Update()
    {
        if (_sendRequest)
        {
            _sendRequest = false;
            Debug.Log("SendPrompt: " + _prompt);
            SendPrompt(_prompt);
        }
    }

    public void SendPrompt(string prompt)
    {
        StartCoroutine(SendRequest(prompt));
    }

    private IEnumerator SendRequest(string prompt)
    {
        // クエリパラメータを付加した完全なURLを作成
        string fullUrlWithParams = $"{_requestFullUrl}?prompt={UnityWebRequest.EscapeURL(prompt)}";

        using (UnityWebRequest request = UnityWebRequest.Get(fullUrlWithParams))
        {
            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.Success)
            {
                Debug.Log($"Response: {request.downloadHandler.text}");
            }
            else
            {
                Debug.LogError($"Error: {request.error}");
            }
        }
    }
}


3. サーバーとUnityの連携を確認

  1. FastAPIサーバーの起動:

    python main.py
    
  2. Unityからリクエストを送信:
    Unityを実行して、_sendRequesttrueに設定。

  3. 結果:
    UnityのコンソールにAIの応答が表示されれば成功です。


まとめ

  • Python(FastAPI)でAI応答を生成するサーバーを構築。
  • UnityからHTTPリクエストを送信してAIの応答を受け取る。

Discussion