GEMINI LABEN
CHAT — 明日8月26日から Google Chat が Ask Gemini のハブになります。検索・下書き・会話の追いつき・タスクとイベントの管理が、Workspace の文脈を保ったまま同じ場所に集まりますSEARCH — Google 検索の AI Mode が、場面によって Gemini 3.7 Flash で動くようになりました。検索側の応答特性が変わるため、流入の内訳を見ている方は一度確認しておきたいところですSTUDIO — Interactions API の開発者ログに対応しました。対象の呼び出しは AI Studio のダッシュボードからログを追えます。手元にログ基盤を持たない段階の切り分けが楽になりますTTS — gemini-3.1-flash-tts-preview が streamGenerateContent 経由でのストリーミング音声生成に対応しました。生成が終わるまで待たずに再生を始められますROBOTICS — gemini-robotics-er-1.6-preview は8月31日で停止します。残り6日です。後継の ER 2 系は空間推論・多段のツール連携・複数ロボットの協調に対応していますSTUDENT — 学生向けのハブ・スタディノートブック・対話的な可視化・Gemini Live での Deep Research が追加され、対象の学生は Google AI プランを1年間無料で使えますCHAT — 明日8月26日から Google Chat が Ask Gemini のハブになります。検索・下書き・会話の追いつき・タスクとイベントの管理が、Workspace の文脈を保ったまま同じ場所に集まりますSEARCH — Google 検索の AI Mode が、場面によって Gemini 3.7 Flash で動くようになりました。検索側の応答特性が変わるため、流入の内訳を見ている方は一度確認しておきたいところですSTUDIO — Interactions API の開発者ログに対応しました。対象の呼び出しは AI Studio のダッシュボードからログを追えます。手元にログ基盤を持たない段階の切り分けが楽になりますTTS — gemini-3.1-flash-tts-preview が streamGenerateContent 経由でのストリーミング音声生成に対応しました。生成が終わるまで待たずに再生を始められますROBOTICS — gemini-robotics-er-1.6-preview は8月31日で停止します。残り6日です。後継の ER 2 系は空間推論・多段のツール連携・複数ロボットの協調に対応していますSTUDENT — 学生向けのハブ・スタディノートブック・対話的な可視化・Gemini Live での Deep Research が追加され、対象の学生は Google AI プランを1年間無料で使えます
記事一覧/高度な活用
高度な活用/2026-07-11上級

Gemini の Function Calling に危険度別の承認ゲートを挟む実装

自律エージェントに全権を渡すのは怖い。Gemini の Function Calling ループで、危険度に応じてツール呼び出しを自動実行と承認待ちに振り分け、承認後に結果をモデルへ返す承認ゲートを実装します。

gemini108function-calling20agent9human-in-the-loop2

プレミアム記事

無人で回していた深夜バッチのログを翌朝に眺めていて、思わず手が止まったことがあります。要約だけを任せていたつもりのエージェントが、空き容量を確保しようと古いファイルの削除に手をのばしかけていたのです。実行はされていませんでした。ツールとして登録していなかったから、というだけの理由で。

個人開発で自動処理を無人運用していると、この「たまたま登録していなかったから助かった」に何度か出会います。安全が設計ではなく偶然に依存している状態です。かといって、すべてのツール呼び出しに承認を挟めば、無人で回す意味がなくなります。

私が落ち着いたのは、その中間でした。読み取りのような無害な操作は自動で流し、削除や課金や外部送信のような取り返しのつかない操作だけ、人間の承認を挟む。ツールを危険度で階層化し、階層ごとに扱いを変える承認ゲートです。以下では、Gemini の Function Calling ループにこのゲートを組み込む実装を、動くコードと一緒に組み立てていきます。

「全部自動」でも「全部承認」でもうまくいかない理由

Function Calling の素直な実装は、モデルが返した functionCall をそのまま実行し、結果を functionResponse として戻す、という往復です。この素直さが、無人運用では危うさになります。モデルは基本的に善意で動きますが、プロンプトの言い回しひとつ、あるいは想定外の入力ひとつで、破壊的なツールを選ぶ確率はゼロにはなりません。

逆に、すべての呼び出しを承認制にすると、今度は人間がボトルネックになります。私が計測した範囲では、無人バッチ200件の実行でモデルが要求したツール呼び出しは合計612回でした。この612回すべてに承認を求めていたら、無人運用は成立しません。

鍵は、612回のうち本当に危険なものがどれだけあるか、です。実際に危険度でタグ付けしてみると、破壊的・不可逆な操作は18回、全体の約3%にすぎませんでした。残りの97%は読み取りや冪等な書き込みです。つまり、3%だけ人間に見せて、97%は自動で流す。この配分こそが、無人運用と安全性を両立させる現実的な落としどころでした。

階層性質扱い
green読み取り・副作用なし自動実行ファイル一覧、検索、要約
yellow冪等・復元可能な書き込み方針で切替(既定は自動)レポート出力、タグ付与
red不可逆・課金・外部送信必ず承認待ち削除、決済、メール送信

ツールを危険度でタグ付けする

まず、ツール名と危険度、そして実際の処理を分けて持ちます。危険度の判定を実行ロジックから切り離しておくと、後でポリシーだけを差し替えられます。

# risk_policy.py — ツール名 → 危険度階層のマッピング
# 未登録のツールは最も危険な "red" に倒す(fail-safe)
RISK_TIER = {
    "list_files": "green",
    "read_file": "green",
    "search_docs": "green",
    "write_report": "yellow",
    "add_label": "yellow",
    "delete_old_backups": "red",
    "charge_customer": "red",
    "send_email": "red",
}
 
def tier_of(tool_name: str) -> str:
    # 知らないツールは承認必須にする。安全側に倒すのが原則
    return RISK_TIER.get(tool_name, "red")

get の既定値を "red" にしているのが要点です。新しいツールを足してポリシーへの登録を忘れても、勝手に自動実行されることはありません。安全側の初期値は、抜けが必ず起きる前提の設計です。

次に、Gemini へ渡す関数宣言と、実際に処理を行う executor を用意します。ここでは google-genai SDK を使います。

from google import genai
from google.genai import types
 
# 関数宣言(モデルに見せるスキーマ)
tools = types.Tool(function_declarations=[
    types.FunctionDeclaration(
        name="search_docs",
        description="社内ドキュメントをキーワード検索する",
        parameters=types.Schema(
            type=types.Type.OBJECT,
            properties={"query": types.Schema(type=types.Type.STRING)},
            required=["query"],
        ),
    ),
    types.FunctionDeclaration(
        name="delete_old_backups",
        description="指定日数より古いバックアップを削除する",
        parameters=types.Schema(
            type=types.Type.OBJECT,
            properties={"days": types.Schema(type=types.Type.INTEGER)},
            required=["days"],
        ),
    ),
])
 
# 実際の処理(承認を通ったときだけ呼ばれる)
def _search_docs(query: str) -> dict:
    return {"hits": [{"title": "運用手順", "score": 0.82}]}
 
def _delete_old_backups(days: int) -> dict:
    return {"deleted": 3, "days": days}
 
EXECUTORS = {
    "search_docs": _search_docs,
    "delete_old_backups": _delete_old_backups,
}

宣言と executor を別の辞書に分けているのは、承認ゲートが「宣言は知っているが、まだ実行はしない」という状態を扱う必要があるからです。モデルがツールを呼びたいと言ってきても、赤い階層なら executor を呼ばずに保留します。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
ツールを green/yellow/red の3段階でタグ付けし、危険な呼び出しだけ人間の承認を挟む設計
承認待ちを JSON で永続化し、翌朝に承認してからモデルへ結果を返して続きを走らせる再開手順
並列 functionCall の一部だけ却下する、tool_config: ANY で止まらなくなる、といった実運用の落とし穴と回避策
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

高度な活用2026-06-29
Gemini エージェントに3つのツール経路を持たせたら、間違った経路を静かに選んでいたとき
Function Calling・Code Execution・Grounding を1つのエージェントに載せると、モデルが間違った経路を選んでも出力はもっともらしいまま返ります。経路選択を計測し、フェーズ分離と検証ゲートで矯正する運用設計を、動くコードでまとめました。
高度な活用2026-04-25
Gemini API で『自己批判するエージェント』を実装する — Reflection × Critic × Refiner で本番品質を継続的に上げる実装
Gemini 3 Pro と 2.5 Flash を組み合わせて自己批判するエージェントを構築する設計と本番運用ノウハウ。Reflection / Critic-Refiner パターンの実装、コスト上限、過剰修正の防ぎ方まで踏み込んで解説します。
高度な活用2026-03-17
Gemini Live API × Google ADK で構築する本番グレード音声AIエージェント【2026年実装ガイド】
Gemini Live API と Google Agent Development Kit (ADK) を組み合わせ、Function Calling・WebSocket・Cloud Run を活用した本番グレードの音声AIエージェントを設計・実装・デプロイする完全実践ガイド。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →