GEMINI LABEN
SUNSET — 画像生成モデルの停止まで残り6日です。imagen-4.0 系と Gemini 3 Image 系が8月17日に止まりますMIGRATE — 移行先として gemini-3.1-flash-image が案内されています。generate_images から generate_content への書き換えが必要ですCHECK — 移行後に同じプロンプトで同じ絵が出る保証はありません。必要な生成物は停止前に確保しておく判断が要りますCLASSROOM — 8月17日は Gemini in Classroom のモバイル提供が始まる日でもあります。web は8月10日に全年齢の学生へ広がりましたDEPRECATION — Grok 4.1 ファミリーの停止は8月20日、gemini-robotics-er-1.6-preview は8月31日で、後継は er-2 系ですCHANGELOG — Gemini API の changelog は7月30日が最新のままです。直近の大きな変更は Gemini 3.6 Flash と 3.5 Flash-Lite の GA ですSUNSET — 画像生成モデルの停止まで残り6日です。imagen-4.0 系と Gemini 3 Image 系が8月17日に止まりますMIGRATE — 移行先として gemini-3.1-flash-image が案内されています。generate_images から generate_content への書き換えが必要ですCHECK — 移行後に同じプロンプトで同じ絵が出る保証はありません。必要な生成物は停止前に確保しておく判断が要りますCLASSROOM — 8月17日は Gemini in Classroom のモバイル提供が始まる日でもあります。web は8月10日に全年齢の学生へ広がりましたDEPRECATION — Grok 4.1 ファミリーの停止は8月20日、gemini-robotics-er-1.6-preview は8月31日で、後継は er-2 系ですCHANGELOG — Gemini API の changelog は7月30日が最新のままです。直近の大きな変更は Gemini 3.6 Flash と 3.5 Flash-Lite の GA です
ブログ一覧

Gemini 3 Flash の Function Calling で自律エージェントを作った話

geminifunction-callingagentgoogle-search開発メモ

はじめに

Gemini 3 Flash のリリース以来、ずっと試してみたかったことがありました。Function Calling と Google Search グラウンディングを組み合わせた自律エージェントの構築です。

週末に実際に作ってみたところ、想像以上にスムーズに動いたので、その過程と気づきをまとめます。

作ったもの

「最新ニュースを取得して、指定トピックについて要約レポートを自動生成するエージェント」です。

ユーザーがトピック(例: "AI規制の最新動向")を投げると、エージェントが以下を自動実行します:

  1. Google Search でリアルタイム情報を取得
  2. 複数のソースから情報を統合
  3. 指定フォーマットで日本語レポートを生成
  4. ソース一覧を末尾に付与

コードは200行程度で実装できました。

Function Calling の基本的な流れ

Gemini API における Function Calling の流れはシンプルです。

  1. ツール定義をモデルに渡す
  2. モデルが「このツールを呼び出してほしい」と返す
  3. アプリ側でツールを実行してその結果を返す
  4. モデルが最終回答を生成する

この「人間とモデルの往復」が Function Calling の本質で、モデルが「何をすべきか」を判断し、実際の実行は開発者側が担います。

実装で気づいたこと

1. ツール定義の精度が肝

ツールの description が曖昧だと、モデルが不適切なタイミングで呼び出してしまいます。「いつ使うか」「何を入力するか」「何が返るか」を明確に記述することで精度が上がりました。

tools = [
    {
        "name": "search_web",
        "description": "指定したクエリでウェブ検索を実行し、最新情報を取得する。ユーザーが現在の出来事や最新データを必要としているときに使用する。",
        "parameters": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "検索クエリ(日本語または英語)"
                }
            },
            "required": ["query"]
        }
    }
]

2. Google Search グラウンディングとの使い分け

Gemini API には「Google Search グラウンディング」という機能もあり、モデルが自動でウェブ検索を行ってくれます。Function Calling との違いは:

  • Google Search グラウンディング: モデルが自律的に検索。コードが少なく済む
  • Function Calling: 開発者がツールを定義して制御。複数ツールの組み合わせや独自API連携が可能

今回のエージェントでは、社内APIとの連携も念頭に置いて Function Calling を選択しました。

3. 推論レベルの設定が効く

Gemini 3 Flash の推論レベル(thinking_budget)を high にすると、ツールを呼び出すタイミングの判断がかなり正確になります。コスト最適化を重視するなら medium でも十分でした。

4. ループ制御は必須

エージェントがツールを呼び出し続けるループに入らないよう、最大ステップ数の制限を入れることを強く推奨します。テスト中に API コストが想定外に膨らんだ経験があります。

MAX_STEPS = 5
for step in range(MAX_STEPS):
    response = model.generate_content(messages, tools=tools)
    if not response.candidates[0].function_calls:
        break  # ツール呼び出しなし → 最終回答
    # ツール実行 → 結果をメッセージに追加

Gemini 3 Flash を選んだ理由

今回のエージェント用途には Gemini 3 Flash が最適でした。

  • 速度: エージェントはループが多いので、レスポンスが遅いとUXが壊れる
  • コスト: $0.50/1M入力トークンは、ループ込みでも現実的なコスト
  • Function Calling精度: ProレベルのSWE-bench 78%のおかげで、ツール選択の判断が正確

Gemini 3.1 Pro に比べてコストは大幅に低く、エージェント用途では Flash の方がむしろ実用的だと感じました。

今後やりたいこと

  • 複数のツール(Web検索 + メール送信 + カレンダー登録)を組み合わせたマルチツールエージェント
  • Google Antigravity との統合による完全自律ワークフロー
  • ストリーミング対応で、エージェントの思考プロセスをリアルタイム表示

Function Calling は思ったよりシンプルに実装でき、応用範囲が広いです。Gemini Lab でも今後、具体的なエージェント実装の記事を増やしていく予定です。