はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】GCPのVertex AI APIにアクセスするためのクライアントライブラリを活用して簡単にChatを実現する方法

はじめに

今回は.NET用のSDKを用いてGCPのVertex AI APIでChatをする方法を紹介したいと思います。

コンソールからVertex AIを利用して対話している様子

前提

Google Cloudプロジェクトが既に作成済である前提で進めていきます。またVertex AI APIを有効化しておいてください。

Vertex AI APIを有効化しておく

ちなみにterraformで有効化するなら以下のようなコードを書きます。

resource "google_project_service" "vertex_ai" {
  // 対象プロジェクト。指定しない場合はデフォルトのプロジェクトが利用される
  project            = "your-project-id"
  // Vertex AI API 
  service            = "aiplatform.googleapis.com"
  // リソースが削除されても API は無効化しない
  disable_on_destroy = false
}

ローカルでGoogle Cloud SDKを用いて操作する場合は以下コマンドを実行し、アプリケーションデフォルトの認証情報を設定する必要があります。

$ gcloud auth application-default login

このコマンドを実行するとブラウザが開き、Googleアカウントにログインが求められます。成功すると認証情報がローカルに保存されてGoogle CloudのAPIを呼び出す際に利用されるようになります。
ローカル開発環境に ADC を設定する  |  Authentication  |  Google Cloud

インストール方法

NuGetで配布されているので、SDKはNuGet経由で入れることができます。
www.nuget.org

適当にコンソールアプリを作成して、以下コマンドによりインストールができます。

# コンソールアプリを作成
$ dotnet new console -o VertexAISandbox

$ cd VertexAISandbox

# NugetからSDKをインストール
$ dotnet add package Google.Cloud.AIPlatform.V1

AIと対話する

対話をコンソール上で行えるコードをサンプルコードを参考にしながら記述しました。
システム指示を使用する  |  Generative AI on Vertex AI  |  Google Cloud

using Google.Cloud.AIPlatform.V1;

public class MultiTurnChatSample
{
    public static async Task Main(string[] args)
    {
        // プロジェクトID、ロケーション、パブリッシャー、モデルを指定する
        const string projectId = "user-project-id";
        const string location = "us-central1";
        const string publisher = "google";
        const string model = "gemini-1.5-flash-001";
        
        var chatSession = new ChatSession($"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}", location);
        
        while (true)
        {
            Console.Write("User: ");
            var prompt = Console.ReadLine();
            if (prompt == "exit" || prompt == "quit")
            {
                break;
            }
            if (string.IsNullOrEmpty(prompt))
            {
                continue;
            }
            
            var response = await chatSession.SendMessageAsync(prompt);
            Console.WriteLine($"Response: {response}");
        }
    }

    private class ChatSession
    {
        private readonly string _modelPath;
        private readonly PredictionServiceClient _predictionServiceClient;

        // ユーザーとAIの会話内容を格納する
        private readonly List<Content> _contents;

        public ChatSession(string modelPath, string location)
        {
            _modelPath = modelPath;

            _predictionServiceClient = new PredictionServiceClientBuilder
            {
                Endpoint = $"{location}-aiplatform.googleapis.com"
            }.Build();
            _contents = [];
        }

        public async Task<string> SendMessageAsync(string prompt)
        {
            // ユーザーの発言を格納する
            var content = new Content
            {
                Role = "USER",
                Parts =
                {
                    new Part { Text = prompt }
                }
            };
            _contents.Add(content);

            // リクエストをする際のパラメーター設定
            var generateContentRequest = new GenerateContentRequest
            {
                Model = _modelPath,
                GenerationConfig = new GenerationConfig
                {
                    Temperature = 0.9f,
                    TopP = 1,
                    TopK = 32,
                    CandidateCount = 1,
                    MaxOutputTokens = 2048
                }
            };
            generateContentRequest.Contents.AddRange(_contents);
            
            // AIにリクエストを送信
            GenerateContentResponse response = await _predictionServiceClient.GenerateContentAsync(generateContentRequest);

            // AIの返答内容も格納しておく(会話の内容を覚えさせるため)
            _contents.Add(response.Candidates[0].Content);
            
            return response.Candidates[0].Content.Parts[0].Text;
        }
    }
}
実際に動作している様子

さいごに

単にAPIリクエスト送るだけなので、想像以上に簡単に実装できちゃいました。

PDFとTXTの内容を理解とかもできるみたいで、ここら辺を使ってみても結構面白いんじゃないかなとか思いました。もっとVertex AI APIで面白いことできないか調べてみたいですね。
ドキュメントの理解  |  Generative AI on Vertex AI  |  Google Cloud