😽

UnityでOpenAIのEmbedding APIを使う方法

2024/01/06に公開

はじめに

OpenAIのEmbedding APIは、文章を数値的なベクトルとして表現することで、テキストの意味内容を捉えることが可能です。Unityでこの技術を使えば、ゲーム内のアイテム検索やユーザーテキストの感情分析などが可能になります。APIの詳細は、OpenAIの公式ドキュメントを参照してください。
https://platform.openai.com/docs/guides/embeddings

Embeddingの基本

Embeddingは、単語や文章をベクトル空間にマッピングする技術です。この変換により、テキストの意味を数値的に表現できます。検索エンジンや文章分類、推薦システムなど、多くの応用例が存在します。詳細は次のリンクから参照できます。
https://qiita.com/akeyhero/items/ce371bfed64399027c23
https://dev.classmethod.jp/articles/search-with-openai-embeddings/

ゲームへの応用例

ゲームでは以下のような方法でEmbedding APIを利用できます:

  • ゲーム内アイテム検索:
    ユーザーが「日本の歴史的な刀」と入力した場合、その文章と類似する「日本刀」を検索結果として提案できます。
  • 感情分析:
    ユーザーの文章と「positive」「negative」という埋め込みとの類似度を計算することで、感情を分析できます。

Unityで実際に使う

UnityでEmbedding APIを利用するコード例は以下の通りです。このコードでは、ユーザーからの入力に基づき、その埋め込みをログに出力します。埋め込みはfloat型の配列なので特に数字が表示されるわけではないです。

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

public class Embedding : MonoBehaviour
{
    private string apiUrl = "https://api.openai.com/v1/embeddings"; // OpenAIのEmbedding APIのURL
    private string apiKey = "YOUR_API_KEY"; // OpenAIのAPIキー。実際のAPIキーに置き換える必要があります。

    // 文章のEmbeddingを取得するためのWebリクエストを送信するコルーチン
    private IEnumerator SendRequest(string text)
    {
        var requestBody = new Property()
        {
            input = text, // リクエストの入力として使用されるテキスト
            model = "text-embedding-ada-002" // 使用するEmbeddingモデル
        };

        // リクエストの本文をJSON形式に変換
        string jsonData = JsonUtility.ToJson(requestBody);
        byte[] postData = Encoding.UTF8.GetBytes(jsonData);

        using (UnityWebRequest request = new UnityWebRequest(apiUrl, "POST"))
        {
            request.uploadHandler = new UploadHandlerRaw(postData);
            request.downloadHandler = new DownloadHandlerBuffer();
            request.SetRequestHeader("Authorization", $"Bearer {apiKey}"); // 認証ヘッダーの設定
            request.SetRequestHeader("Content-Type", "application/json"); // コンテントタイプの設定

            // リクエストの送信とレスポンスの待機
            yield return request.SendWebRequest();

            if (request.result != UnityWebRequest.Result.Success)
            {
                Debug.Log($"Error: {request.error}"); // エラーが発生した場合のログ出力
            }
            else
            {
                // 成功した場合はレスポンスをEmbeddingDataオブジェクトに変換
                EmbeddingData embeddingData = JsonUtility.FromJson<EmbeddingData>(request.downloadHandler.text);
                Debug.Log(embeddingData.data[0].embedding);
            }
        }
    }
}

[Serializable]
public class EmbeddingData
{
    public string objectType; // レスポンスのオブジェクトタイプ
    public EmbeddingJson[] data; // Embeddingのデータ配列
    public string model; // 使用されたモデル
    public Usage usage; // API使用状況
}

[Serializable]
public class EmbeddingJson
{
    public string embeddingType; // 埋め込みタイプ
    public int index; // 埋め込みのインデックス
    public float[] embedding; // 実際の埋め込みベクトル
}

[Serializable]
public class Usage
{
    public int prompt_tokens; // プロンプトのトークン数
    public int total_tokens; // 合計のトークン数
}

[System.Serializable]
public class Property
{
    public string input; // リクエストの入力
    public string model; // 使用するモデル
}

まとめ

UnityでOpenAIのEmbedding APIを使用する方法を紹介しました。埋め込みを用いて、ゲーム内のアイテム検索や感情分析などの機能を実装できます。これからの記事で、これらのタスクに関する詳細な解説も予定しています。この記事が役立つと思ったら、ぜひフォローをお願いします。

Discussion