GoogleのVertex AIでGemini APIを利用する

はじめに

この記事では、以下を理解できます。

  • GCPのサービスアカウントの作成と認証設定
  • PythonのVertex AI SDKの使い方
  • Gemini Proモデルの生成
  • モデルへのツールの渡し方 (Function Calling)
  • プロンプトへの問い合わせ

Vertex AIとは

Vertex AI は、Google Cloud 上で機械学習モデルのライフサイクル(データ準備 → 訓練 → デプロイ → 推論 → モニタリング)を一貫して実行できるフルマネージドサービスです。
Gemini API を使う文脈では、具体的に以下のような役割を担います。

  • モデルのホスティング&呼び出し基盤
    Gemini のような大規模言語モデルを Google 側でホストし、REST や SDK(google-cloud-aiplatform)経由で安全に呼び出せる環境を提供
  • 認証・アクセス管理
    IAM/サービスアカウントによる細粒度の権限設定で、誰がどのモデルを呼べるかを制御
  • スケーリング
    オンライン推論(低レイテンシ)もバッチ推論(高スループット)も自動的にスケールアップ・ダウン
  • コスト最適化
    使用量に応じた課金モデルで、max_output_tokens やリージョン選択など設定次第でコストをコントロール
  • 運用監視
    Cloud Logging/Monitoring と統合され、リクエスト数やレイテンシ、エラー率をダッシュボードで可視化

サンプルコード

Googleの基盤モデル(Gemini Proなど)は、基本的に事前デプロイ済みなので、ゼロからサーバーを立ち上げたり、モデルをデプロイしたりする必要はありません。Vertex AI API を有効にし、必要な認証情報を設定すれば、すぐに利用できます。

ステップ0: 事前準備

  1. Vertex AI API の有効化:
    • Google Cloud Console の検索バーで「Vertex AI API」と入力し、検索結果から選択します。
    • 有効にする」ボタンが表示されていたら、クリックして有効にします。
    • 同じように「Cloud Storage API」も有効にしておくと、RAGなどで便利です。
  2. 認証情報の設定: アプリケーションの種類によって設定方法が異なりますが、一般的なものを紹介します。
    • サービスアカウントの作成とキーファイルのダウンロード:
      • Google Cloud Console で「IAM と管理」>「サービスアカウント」に移動します。
      • サービスアカウントを作成」をクリックし、任意のサービスアカウント名を入力します。
      • 役割の選択で、「Vertex AI ユーザー」と「BigQuery データ閲覧者」(もしBigQueryを使う場合)など、必要な権限を付与します。
      • サービスアカウントの作成後、「キーを作成」>「JSON」を選択し、キーファイルをダウンロードします。このJSONファイルには認証情報が含まれており、安全な場所に保管し、Gitなどにはコミットしないでください。
    • 環境変数 GOOGLE_APPLICATION_CREDENTIALS の設定:
      • ダウンロードしたJSONキーファイルのパスを、環境変数に設定します。これにより、Google Cloud SDKやクライアントライブラリが自動的に認証情報を探し出します。
      • Linux/macOSの場合: export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/keyfile.json"
      • Windowsの場合: set GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\keyfile.json"
      • 本番環境では、GCPのマネージドサービス(Cloud Run, Cloud Functionsなど)の「サービスアカウント」に適切な権限を付与するのがよりセキュアな方法です。

ステップ1: Python SDK を使用してAPIを呼び出す

最も一般的な方法で、簡単かつ柔軟に基盤モデルを利用できます。

  1. Vertex AI SDK のインストール:
    • 開発環境のターミナルで、PythonのSDKをインストールします。
pyenv local 3.11.3
python -m venv .venv
source .venv/bin/activate\n
echo google-cloud-aiplatform >> requirements.txt
pip install -r requirements.txt

2. Python コードの記述と実行:

  • 以下のサンプルコードは、Gemini Pro モデルを呼び出し、テキストを生成する例です。
  • YOUR_GCP_PROJECT_ID をあなたのプロジェクトIDに置き換えてください。
import vertexai
from vertexai.generative_models import GenerativeModel, Part, Tool, FunctionDeclaration

# 1. Vertex AIの初期化
# プロジェクトIDとリージョンを指定します。Geminiモデルの利用可能なリージョンを選択してください。
vertexai.init(project="YOUR_GCP_PROJECT_ID", location="us-central1") # あなたのGCPプロジェクトIDに置き換えてください

# ダミーの天気APIツールを定義
# 実際のAPI呼び出しは行いませんが、モデルに「こんな機能があるよ」と教えます
weather_tool_definition = Tool(
    function_declarations=[
        FunctionDeclaration(
            name="get_current_weather",
            description="指定された場所の現在の天気情報を取得します。",
            parameters={
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "天気を知りたい場所の都市名または地名(例: 東京、ニューヨーク)"
                    }
                },
                "required": ["location"]
            }
        )
    ]
)

# ツールを持たないモデルの初期化
# このモデルは、天気に関する質問に答える手段がありません。
model_no_tools = GenerativeModel("gemini-2.5-pro")

# ツールを持つモデルの初期化
# このモデルは、天気情報を取得するためのツールを知っています。
model_with_tools = GenerativeModel("gemini-2.5-pro", tools=[weather_tool_definition])

# 共通のプロンプト(天気に関する質問)
common_prompt = "今日のロンドンの天気はどうですか?"

print(f"共通の質問: 『{common_prompt}』\n")

# --- ツールを**持たない**モデルの場合 ---
print("--- ツールを持たないモデルの応答 ---")
response_no_tools = model_no_tools.generate_content(common_prompt)

if response_no_tools.candidates and response_no_tools.candidates[0].function_calls:
    # 実際にはツールを持たないため、ここには入らないはず
    print(f"AIが提案したツール呼び出し: {response_no_tools.candidates[0].function_calls[0].name}")
    print(f"引数: {response_no_tools.candidates[0].function_calls[0].args}")
else:
    # ツールがないため、モデルは情報がない旨を伝えたり、一般的な応答を返します。
    print(f"AIの直接的な応答: {response_no_tools.text}")
    print("**解説:** モデルに外部ツールが提供されていないため、天気に関する情報を直接回答できません。一般的には「その情報にはアクセスできません」といった内容や、関連する一般的な情報(例: 天気予報の調べ方)を返します。")

print("\n" + "="*50 + "\n")

# --- ツールを**持つ**モデルの場合 ---
print("--- ツールを持つモデルの応答 ---")
response_with_tools = model_with_tools.generate_content(common_prompt)

if response_with_tools.candidates and response_with_tools.candidates[0].function_calls:
    # ツールがあるため、モデルはツール呼び出しを提案します。
    function_call = response_with_tools.candidates[0].function_calls[0]
    print(f"AIが提案したツール呼び出し: {function_call.name}")
    print(f"引数: {function_call.args}")
    print("**解説:** モデルに外部ツールが提供されているため、質問に答えるためにそのツール(`get_current_weather`)の呼び出しを提案します。これにより、後続のステップで実際の天気情報を取得できます。")
else:
    # ツール呼び出しを期待するが、もし直接テキストを返した場合
    print(f"AIの直接的な応答 (予期しない): {response_with_tools.text}")
    print("**解説:** 通常、ツールがある場合はツール呼び出しを提案しますが、まれにモデルが質問の意図を直接解釈して応答する場合があります。")

関連記事

カテゴリー

アーカイブ

Lang »