HEROZ Tech Blog

日本将棋連盟公認「将棋ウォーズ」や、AIを活用したシステム企画・開発を行う、AI企業HEROZの公式テックブログです。

Geminiをサービスから呼ぶ時の認証方法について

はじめに

先日リリースしたHEROZ ASKではGeminiClaudeも動くプロトタイプを準備しています。 まずはGeminiを組み込もうと思ったのですが、HEROZ ASK プロトタイプというサービスから呼び出すにあたっては認証方法に以下のような要件があり、動作させるのに苦労しました。

  1. Googleアカウントに紐付くGoogle AIのAPIキーではなく、Vertex AIのサービスアカウント(SA)を使いたい
  2. 動作させるアカウントの権限はなるべく小さくしたい
  3. 認証情報(credentials)はローカルファイルではなく文字列渡しとしたい
  4. langchainから呼び出したい

1.についてはサービスとして動作させる上では特定の個人と結びつくGoogleアカウントではなく、サービスアカウント(SA)のような専用のアカウントの方が権限管理や課金管理の関係で望ましいと考えています。
2.については管理者のようなフル権限にしてしまえば問題なく動作するのですが、セキュリティを考えるとなるべく小さくすることに越したことはありません。
3.については環境と設定を分離するためにも認証情報(credentials)のローカルファイル埋め込みは避けたいです。
4.についてはHEROZ ASKがlangchainで動作しているので、それに準じています。

以上を満たす方法について、これから説明してます。

サービスアカウント(SA)の鍵の作成

サービスアカウント(SA)の鍵は以下の手順で作成します。

  1. [IAMと管理]から[サービスアカウント]を選択し、[サービスアカウントを作成]をクリックします。
    サービスアカウント作成1
  2. サービスアカウント名とサービスアカウントIDを入力してから[作成して続行]をクリックし、権限を付与せずに[完了]をクリックします。
    サービスアカウント作成2
  3. サービスアカウント一覧から2.で作成したアカウントをクリックする。
    サービスアカウント作成3
  4. [キー]タブを選択する。
    サービスアカウントの作成4
  5. [鍵を追加]をクリックし、[新しい鍵を作成]をクリックする。
    サービスアカウント作成5
  6. [作成]をクリックすると、鍵のjsonファイルがダウンロードされる。
    サービスアカウント作成6

権限(role)の付与

gcloud CLIがインストールされた環境において、人に紐付くGoogleアカウントでログインし、下記のコマンドを実行する。

gcloud projects add-iam-policy-binding {プロジェクト名} \
    --member=serviceAccount:{先ほど作ったサービスアカウント}@{プロジェクト名}.iam.gserviceaccount.com \
    --role="roles/aiplatform.user"

反映には少し時間がかかれます。
GUIにはroles/aiplatform.user権限が見当たらないため、CLIで付与する必要がある。
また、権限エラーとなった場合にはログインしているGoogleアカウントにresourcemanager.projects.setIamPolicy権限を管理者に付与してもらいましょう。

呼び出し方法

以下のコードにてGeminiを呼び出すことができます。

!pip install langchain-google-vertexai google-cloud-aiplatform

from langchain_google_vertexai import ChatVertexAI
from langchain_core.messages import HumanMessage
from google.oauth2 import service_account
import vertexai
import json

# cred_strにjsonファイルの中身を代入する
cred_str = "{\"type\": \"service_account\", ... }"
cred_json = json.loads(cred_str)
credentials = service_account.Credentials.from_service_account_info(cred_json)
vertexai.init(project=credentials.project_id, credentials=credentials)

# langchainからGeminiを呼びます
chat = ChatVertexAI(model_name="gemini-1.0-pro")
answer = chat([HumanMessage(content="日本一高い山は何ですか?")])

answer.content
# '富士山'

おわりに

GeminiをHEROZ ASK プロトタイプというサービスから呼び出そうと思った時に認証関係で以下の2点でハマりました。

  1. 認証情報(credentials)を文字列で渡す時にservice_account.Credentials.from_service_account_info()で読み込み、vertexai.init()を実行する手順が分からなかった。
  2. サービスアカウント(SA)に付与する権限を最小にしようとすると、GUIでの選択にないroles/aiplatform.userCLIで設定する必要があった。

1.は最初はChatVertexAI(credentials=credentials)とこちらにcredentialsを渡したり、vertexai.init()を実行していなかったりして動作しませんでした。 他にもscopesを与えてみたり、locationを追加してみたりといろいろ迷走しましたが、上記の呼び出し方法が最もシンプルに動作するコードとなります。
2.も最初はGUIで付与する「Vertex AI サービスエージェント」が該当かと思って付与していましたが、これは間違いでした。

認証関係も動作するようになりましたので、次回はいよいよGeminiをHEROZ ASK プロトタイプに組み込んでいきたいと思います。

GeminやClaudeも動作するHEROZ ASKのプロトタイプはAI Expo 2024 春で展示予定です。 heroz.co.jp 弊社ブースへのご来場もお待ちしております。