Phase 2 / 1週間

API活用

PythonからVertex AI APIを呼び出す

🎯 このフェーズの目標

🆕 2025年12月時点のSDK情報

2025年6月より、Google Gen AI SDK(google-genai)が推奨されています。 旧SDK(vertexai.generative_models)は2026年6月に削除予定です。

SDK 状態 パッケージ
Google Gen AI SDK ✅ 推奨 google-genai
Vertex AI SDK(旧) ⚠️ 非推奨 google-cloud-aiplatform

📋 前提条件

Day 1-2 環境構築と認証設定

まずはローカル環境からVertex AI APIを呼び出せるようにします。

① 仮想環境の作成

# プロジェクトディレクトリを作成
mkdir vertex-ai-test
cd vertex-ai-test

# venv作成
python -m venv .venv

# 有効化 (Windows PowerShell)
.venv\Scripts\activate

# 有効化 (Mac/Linux)
source .venv/bin/activate
✅ 有効化の確認

ターミナルの先頭に (.venv) と表示されていればOKです。

② Google Cloud SDK のセットアップ

# gcloud CLIで認証
gcloud auth login
gcloud auth application-default login

# プロジェクト一覧を確認
gcloud projects list

# プロジェクト設定(PROJECT_IDを自分のものに置き換え)
gcloud config set project YOUR_PROJECT_ID

# クォータプロジェクトも設定(警告が出た場合)
gcloud auth application-default set-quota-project YOUR_PROJECT_ID
📝 プロジェクトIDの確認方法

gcloud projects list で表示される PROJECT_ID 列の値を使います。 プロジェクト名(NAME)ではなく、ID(例: driven-current-480303-n8)を使用してください。

③ Python パッケージのインストール

# Google Gen AI SDK と dotenv をインストール
pip install google-genai python-dotenv

# requirements.txtを作成(他の人と共有用)
pip freeze > requirements.txt

④ 環境変数の設定

プロジェクトIDなどの設定値は環境変数で管理します。.env ファイルを作成してください。

# .env ファイルを作成
GCP_PROJECT_ID=your-project-id-here
GCP_LOCATION=us-central1
⚠️ .gitignore に追加

.env ファイルはGitにコミットしないでください。 .gitignore.env を追加しておきましょう。

📝 requirements.txt からインストールする場合

他の人の環境では pip install -r requirements.txt で同じパッケージをインストールできます。

⑤ 動作確認

import os
from dotenv import load_dotenv
from google import genai

# 環境変数を読み込み
load_dotenv()

# クライアント初期化(Vertex AI モード)
client = genai.Client(
    vertexai=True,
    project=os.getenv("GCP_PROJECT_ID"),
    location=os.getenv("GCP_LOCATION")
)

# モデル呼び出し
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="こんにちは!"
)
print(response.text)
💡 ポイント

vertexai=True を指定すると Vertex AI 経由で API を呼び出します。 認証は gcloud auth application-default login で設定した情報が自動的に使われます。

📋 実行例を見る
こんにちは!
何かお手伝いできることはありますか?

🔧 トラブルシューティング

「Permission denied」エラー

gcloud auth logingcloud auth application-default login の両方を実行したか確認

「Quota project」警告

gcloud auth application-default set-quota-project YOUR_PROJECT_ID を実行

「API not enabled」エラー

→ Phase 1 で「Vertex AI API を有効にする」を実行したか確認。または gcloud services enable aiplatform.googleapis.com

Day 3-4 基本的なAPI呼び出し

様々なパターンでAPIを呼び出してみましょう。

① System Instruction 付き

import os
from dotenv import load_dotenv
from google import genai
from google.genai import types

load_dotenv()
client = genai.Client(
    vertexai=True,
    project=os.getenv("GCP_PROJECT_ID"),
    location=os.getenv("GCP_LOCATION")
)

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="今日の調子はどう?",
    config=types.GenerateContentConfig(
        system_instruction="あなたは関西弁で話すAIです。"
    )
)
print(response.text)
📋 実行例を見る
絶好調やで! なんでも聞いてや! あんたはどうなん? ええ感じ?😁

② パラメータ設定

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Pythonでフィボナッチ数列を計算する関数を書いて",
    config=types.GenerateContentConfig(
        temperature=0.1,          # 創造性(低め)
        max_output_tokens=1024,   # 最大出力トークン
        top_p=0.8,               # 多様性
    )
)
print(response.text)

③ マルチモーダル(画像入力)

import os, base64
from dotenv import load_dotenv
from google import genai
from google.genai import types

load_dotenv()
client = genai.Client(
    vertexai=True,
    project=os.getenv("GCP_PROJECT_ID"),
    location=os.getenv("GCP_LOCATION")
)

# 画像をBase64で読み込む
with open("image.png", "rb") as f:
    image_data = base64.b64encode(f.read()).decode()

# 画像とテキストを一緒に送信
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[
        types.Part.from_bytes(
            data=base64.b64decode(image_data),
            mime_type="image/png"
        ),
        "この画像を説明して"
    ]
)
print(response.text)
📋 実行例を見る(Vertex AI Studioのスクリーンショットを入力)
これは、Vertex AIのチャットインターフェースのスクリーンショットです。

画像には以下の要素が見られます:

1. ヘッダー: 「Vertex AI / スタジオ / チャット」と表示
2. サイドバー: 新しいチャットを開始するための「+」ボタン
3. チャット履歴: 「むかしむかし」で始まる物語の書き出しを複数生成
4. 評価ボタン: 👍、👎などのAI応答を評価する機能

全体として、AIがユーザーの指示に基づいて物語の書き出しを複数パターン生成し、その結果がチャット形式で表示されている様子を示しています。
📝 ポイント

Phase 1 で Vertex AI Studio で試したことが、すべてコードで再現できます。 Studio で動作確認 → コード化という流れがおすすめです。

💡 Tips: Thinking モードと response.text

gemini-2.5-flash はコード生成などの複雑なタスクで 内部的に「思考(Thinking)」を行います。この場合、response.textNone を返すことがあります。

# response.text が None の場合のフォールバック
def get_response_text(response):
    """Thinkingモデル対応のテキスト取得"""
    if response.text:
        return response.text
    # Thinkingモードの場合、最後のpartにテキストがある
    return response.candidates[0].content.parts[-1].text

# 使用例
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Pythonでフィボナッチ数列を計算する関数を書いて"
)
print(get_response_text(response))
⚠️ なぜ None になる?

Gemini 2.5 の Thinking モードでは、応答が複数の parts に分かれます。 最初の parts に「思考過程」、最後の parts に「実際の回答」が入ります。 response.text は単一partの場合のショートカットなので、 複数partsでは None になります。

📋 実行例を見る(フィボナッチ数列のコード生成)
Pythonでフィボナッチ数列を計算する関数はいくつかのアプローチで実装できます。

フィボナッチ数列は、以下のように定義されます。
* F(0) = 0
* F(1) = 1
* F(n) = F(n-1) + F(n-2) (n >= 2の場合)

### 方法1: ループ(反復処理)を使う方法 - 最も一般的で効率的
def fibonacci_iterative(n):
    """
    ループを使ってN番目のフィボナッチ数を計算します。
    """
    if n == 0: return 0
    elif n == 1: return 1
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

# 使用例
print(f"F(10) = {fibonacci_iterative(10)}")  # 出力: F(10) = 55

### 方法2: メモ化再帰、方法3: ジェネレータ... など複数の実装方法も提案されます

※ Thinkingモードでは、コード生成など複雑なタスクで詳細な回答が生成されます。

Day 5-7 ミニアプリを作ってみる

学んだことを活かして、簡単なアプリケーションを作成しましょう。

例: シンプルなチャットボット

import os
from dotenv import load_dotenv
from google import genai
from google.genai import types

load_dotenv()
client = genai.Client(
    vertexai=True,
    project=os.getenv("GCP_PROJECT_ID"),
    location=os.getenv("GCP_LOCATION")
)

# チャット履歴を保持
chat_history = []

system_instruction = "あなたは親切なAIアシスタントです。"

while True:
    user_input = input("あなた: ")
    if user_input.lower() in ["quit", "exit"]:
        break
    
    # ユーザーメッセージを履歴に追加
    chat_history.append(types.Content(
        role="user",
        parts=[types.Part.from_text(text=user_input)]
    ))
    
    # APIリクエスト
    response = client.models.generate_content(
        model="gemini-2.5-flash",
        contents=chat_history,
        config=types.GenerateContentConfig(
            system_instruction=system_instruction
        )
    )
    
    # アシスタント応答を履歴に追加
    chat_history.append(types.Content(
        role="model",
        parts=[types.Part.from_text(text=response.text)]
    ))
    
    print("AI: " + response.text + "\n")
📋 実行例を見る(履歴保持の確認)
あなた: もしもし
AI: はい、なんでしょうか?何かお手伝いできることはありますか?

あなた: 今日は何曜日?
AI: 今日は 水曜日 です。

あなた: 昨日は?
AI: 昨日は 火曜日 でした。

あなた: 最初の質問は何だったか覚えてる?
AI: はい、覚えていますよ!
最初の質問は「もしもし」でした。
それに対して私は「はい、なんでしょうか?...」とお答えしました。

chat_history に履歴を保持することで、AIが過去の会話を記憶しています。

発展課題

📄 ドキュメント要約ツール

テキストファイルを読み込んで要約する CLI ツールを作成

🌐 Streamlit でWeb UI

Streamlit を使ってブラウザで動くチャットアプリを作成

📧 メール下書き生成

要点を入力するとビジネスメールの下書きを生成

🔄 翻訳ツール

日本語↔英語の翻訳を行うシンプルなツール

💰 このフェーズのコスト目安

項目 目安
Gemini 2.5 Flash API 〜$5(開発・テスト程度)
Cloud Shell(無料枠) $0
✅ 無料クレジットで十分

$300 の無料クレジット内で十分に学習できます。

✅ 完了チェックリスト

← Phase 1 に戻る Phase 3 へ進む →