はじめに
先日リリースしたHEROZ ASKではGeminiやClaudeも動くプロトタイプを準備しています。 まずはGeminiを組み込もうと思ったのですが、HEROZ ASK プロトタイプというサービスから呼び出すにあたっては認証方法に以下のような要件があり、動作させるのに苦労しました。
- Googleアカウントに紐付くGoogle AIのAPIキーではなく、Vertex AIのサービスアカウント(SA)を使いたい
- 動作させるアカウントの権限はなるべく小さくしたい
- 認証情報(credentials)はローカルファイルではなく文字列渡しとしたい
- langchainから呼び出したい
1.についてはサービスとして動作させる上では特定の個人と結びつくGoogleアカウントではなく、サービスアカウント(SA)のような専用のアカウントの方が権限管理や課金管理の関係で望ましいと考えています。
2.については管理者のようなフル権限にしてしまえば問題なく動作するのですが、セキュリティを考えるとなるべく小さくすることに越したことはありません。
3.については環境と設定を分離するためにも認証情報(credentials)のローカルファイル埋め込みは避けたいです。
4.についてはHEROZ ASKがlangchainで動作しているので、それに準じています。
以上を満たす方法について、これから説明してます。
サービスアカウント(SA)の鍵の作成
サービスアカウント(SA)の鍵は以下の手順で作成します。
- [IAMと管理]から[サービスアカウント]を選択し、[サービスアカウントを作成]をクリックします。
- サービスアカウント名とサービスアカウントIDを入力してから[作成して続行]をクリックし、権限を付与せずに[完了]をクリックします。
- サービスアカウント一覧から2.で作成したアカウントをクリックする。
- [キー]タブを選択する。
- [鍵を追加]をクリックし、[新しい鍵を作成]をクリックする。
- [作成]をクリックすると、鍵のjsonファイルがダウンロードされる。
権限(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点でハマりました。
- 認証情報(credentials)を文字列で渡す時に
service_account.Credentials.from_service_account_info()
で読み込み、vertexai.init()
を実行する手順が分からなかった。 - サービスアカウント(SA)に付与する権限を最小にしようとすると、GUIでの選択にない
roles/aiplatform.user
をCLIで設定する必要があった。
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 弊社ブースへのご来場もお待ちしております。