筆者がGemini APIを使い始めたのは2023年末のこと。当初はGPT-4との比較検証が目的でした。印象的だったのは、テキスト品質ではなく、最初からマルチモーダル処理に対応していた点です。画像・PDF・動画を送って直接質問できる。他のAPIでvisionに追加コストがかかる中、GeminiはすべてをひとつのAPIエンドポイントにまとめています。
画像分析、PDF読み取り、多様なコンテンツ処理が必要なプロジェクトなら、Geminiは試す価値があります。特に、多くの競合よりも太っ腹なfree tierが魅力です。
なぜGeminiを選ぶのか?使うべき場面とは
実際的な疑問:OpenAIや他のプロバイダーではなく、Geminiを選ぶべきタイミングはいつか?
多くの開発者が直面する問題は、スケールに伴うコストの急増です。GPT-4oは入力トークン100万件あたり約5ドルかかります。一方、Gemini 2.0 Flashは1Mトークンのcontext windowを持ちながら、毎分15リクエストまで無料。実験プロジェクトや小規模スタートアップには非常に魅力的な数字です。
Geminiの具体的な強み:
- 巨大なContext window:Gemini 1.5 Proは100万トークン対応 — 英単語約70万語相当。ログファイル丸ごと送ってもchunkingが不要
- ネイティブマルチモーダル:テキスト・画像・音声・動画・PDFをひとつのAPI callで処理可能
- Google Searchによるグラウンディング:独自機能で、実際の検索結果で回答を検証できる
- 実用的なfree tier:Gemini 2.0 Flashで1日1,500リクエスト、クレジットカード不要
セットアップとAPIキーの取得
Google AI StudioでAPIキーを取得する
aistudio.google.comにアクセスし、Googleアカウントでログイン後、「Get API key」→「Create API key」を選択します。キーはAIzaSy...の形式です。
注意:AI StudioのAPIキーはGoogle AI直接利用のみで、Vertexは経由しません。SLAが必要な大規模プロジェクトは、Vertex AIへの移行が次のステップです — セットアップは複雑になりますが、SLAとより高度なコントロールが手に入ります。
ライブラリのインストールと認証情報の保存
pip install google-genai
APIキーはenvironment variableに保存し、ソースコードにハードコードしないようにしましょう:
export GEMINI_API_KEY="AIzaSy..."
または.envファイルを作成してpython-dotenvを使用する方法もあります:
# .env
GEMINI_API_KEY=AIzaSy...
詳細設定と使い方
最初のリクエスト
import os
from google import genai
client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
response = client.models.generate_content(
model="gemini-2.0-flash",
contents="Giải thích Docker Compose bằng ngôn ngữ đơn giản"
)
print(response.text)
結果はresponse.textで即取得できます。追加のunpackは不要で、anthropicやopenai SDKと比べて、記法がかなりシンプルです。
マルチターンチャット — 会話のコンテキストを保持する
chat = client.chats.create(model="gemini-2.0-flash")
# Lượt 1
response = chat.send_message("Mình đang học Python, bắt đầu từ đâu?")
print("AI:", response.text)
# Lượt 2 — model nhớ context từ lượt 1
response = chat.send_message("Cho mình một ví dụ về list comprehension")
print("AI:", response.text)
画像処理 — マルチモーダル
最もよく使う機能です。エラーのスクリーンショット解析、システムアーキテクチャ図の読み取り、スクリーンショットからのテキスト抽出 — すべてひとつのAPI callで完結します:
from pathlib import Path
image_data = Path("screenshot.png").read_bytes()
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=[
{
"inline_data": {
"mime_type": "image/png",
"data": image_data
}
},
"Đây là lỗi gì? Cách fix như thế nào?"
]
)
print(response.text)
Structured Output — JSONスキーマの強制
テキストを手動でparse(エッジケース処理が終わらない)する代わりに、Geminiはresponse_schemaによるJSONスキーマの強制に対応しています。自動化pipelineを構築する際に非常に便利です:
from google.genai import types
import json
response = client.models.generate_content(
model="gemini-2.0-flash",
contents="Liệt kê 3 lệnh Linux hay dùng nhất cho sysadmin",
config=types.GenerateContentConfig(
response_mime_type="application/json",
response_schema={
"type": "array",
"items": {
"type": "object",
"properties": {
"command": {"type": "string"},
"description": {"type": "string"},
"example": {"type": "string"}
}
}
}
)
)
data = json.loads(response.text)
for item in data:
print(f"$ {item['command']}: {item['description']}")
Generation configとSafety settings
GeminiのSafety filterはデフォルトでかなり厳しく、penetration testingやセキュリティリサーチの解説といった完全に正当な技術コンテンツをブロックすることがあります。以下のように調整できます:
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=prompt,
config=types.GenerateContentConfig(
temperature=0.7, # 0.0 = deterministic, 2.0 = creative
top_p=0.95,
max_output_tokens=8192,
safety_settings=[
types.SafetySetting(
category="HARM_CATEGORY_DANGEROUS_CONTENT",
threshold="BLOCK_ONLY_HIGH"
)
]
)
)
Streaming response
長いレスポンスを全部受信してから表示するのはUXが悪いです。Streamingならこの問題を解決できます — ユーザーはChatGPTのようにテキストが徐々に表示されるのを見られます:
for chunk in client.models.generate_content_stream(
model="gemini-2.0-flash",
contents="Viết hướng dẫn cài đặt Nginx trên Ubuntu"
):
print(chunk.text, end="", flush=True)
確認とモニタリング
Token usageの追跡
Geminiのレスポンスには使用トークンのメタデータが含まれています — free tier利用中でもコストを管理するために重要です:
usage = response.usage_metadata
print(f"Input tokens: {usage.prompt_token_count}")
print(f"Output tokens: {usage.candidates_token_count}")
print(f"Total tokens: {usage.total_token_count}")
retryとexponential backoffによるエラーハンドリング
本番環境では、適切なexception typeをキャッチすることでデバッグが格段に速くなります:
from google.genai import errors
import time
def safe_generate(client, prompt, retries=3):
for attempt in range(retries):
try:
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=prompt
)
return response.text
except errors.ClientError as e:
if "RATE_LIMIT_EXCEEDED" in str(e):
wait = 2 ** attempt # exponential backoff
print(f"Rate limit, chờ {wait}s...")
time.sleep(wait)
elif "INVALID_API_KEY" in str(e):
raise # Lỗi này không retry được
else:
raise
except errors.ServerError as e:
print(f"Lỗi server Gemini (attempt {attempt+1}): {e}")
time.sleep(2)
return None
知っておくべきQuotaとRate Limit
Gemini 2.0 Flashのfree tierは15 RPM、1,500 RPD、1M TPMです。個人プロジェクトやプロトタイプには十分な余裕があります。使用中のquotaを確認するには、console.cloud.google.com → APIs & Services → Generative Language API → Quotasに進んでください。
スケールアップが必要になったら、Vertex AI Geminiでquotaを需要に応じて増やすことができます。ただし、Google CloudプロジェクトとBillingアカウントのセットアップが必要で、AI Studioよりかなり複雑です。
筆者はGemini APIをログ自動分析の社内ツールに活用しています。ログのchunkを送って「異常はないか?」と質問するわけです。Gemini 1.5 Proの1Mトークンcontext windowが、他のモデルではなくこれを選んだ理由です:ログを分割してから結果をマージする必要がなく、ファイルをそのまま送れます。大量テキスト処理が必要なユースケースでは、見逃せないアドバンテージです。

