GEMINI LABEN
FLASH35 — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestが指す実体になりました。日常的な生成を速く安価にこなせますAGENTS — Gemini APIのManaged Agentsがpublic previewに。Google管理の隔離Linuxサンドボックスで自律的なエージェントを構築できますMEDIA — Nano Banana 2 Lite(画像)とGemini Omni Flash(動画・会話的編集)がAI Studio・API・Enterprise Agent Platformで利用可能にTTS — gemini-3.1-flash-tts-previewの音声生成がstreamGenerateContent経由でストリーミング対応になりましたTRANSLATE — 新しい音声モデルが70以上の言語を自動判別し、話者の自然な抑揚を保ったままライブ音声翻訳を行いますSPENDCAP — AI Studioにプロジェクト単位の費用上限が導入され、支出を安全側に抑えられるようになりましたFLASH35 — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestが指す実体になりました。日常的な生成を速く安価にこなせますAGENTS — Gemini APIのManaged Agentsがpublic previewに。Google管理の隔離Linuxサンドボックスで自律的なエージェントを構築できますMEDIA — Nano Banana 2 Lite(画像)とGemini Omni Flash(動画・会話的編集)がAI Studio・API・Enterprise Agent Platformで利用可能にTTS — gemini-3.1-flash-tts-previewの音声生成がstreamGenerateContent経由でストリーミング対応になりましたTRANSLATE — 新しい音声モデルが70以上の言語を自動判別し、話者の自然な抑揚を保ったままライブ音声翻訳を行いますSPENDCAP — AI Studioにプロジェクト単位の費用上限が導入され、支出を安全側に抑えられるようになりました
記事一覧/API / SDK
API / SDK/2026-07-14上級

Gemini Code Execution の計算結果とモデルの文章がずれる — 実行結果だけを信頼する検証ゲートの実装

Gemini の Code Execution は実際に走らせた計算結果と、それを説明する自然文を別々に返します。文章側の数値を鵜呑みにすると幻覚を掴みます。実行結果だけを真実として抽出し照合する検証ゲートの実装を、動くコードで解説します。

gemini102code-execution4gemini-api276python101検証2

プレミアム記事

先月、個人開発で運営しているアプリの AdMob 月次レポートを Gemini に集計させていたとき、静かにヒヤリとしました。「eCPM の加重平均は 312.4 円です」とモデルが書いてきたのですが、念のため自分で電卓を叩いたら 287.9 円だったのです。Code Execution を有効にしていたので、モデルは裏で実際に Python を走らせていました。ところが、その走らせた結果と、返ってきた文章の中の数値がずれていたのです。

Code Execution は「コードを実行する機能」だと理解されがちですが、本番で使ううえで重要なのはそこではありません。実際に実行された結果と、それを説明する自然文が、別々のパートとして返ってくるという構造です。この二つは一致するとは限りません。ここを分けて扱わないと、せっかくサンドボックスで正確に計算していても、最後の一歩でモデルが書き写した幻覚の数値を掴んでしまいます。

以下では、その二つを分離し、実行結果だけを唯一の真実として抽出し、文章側の数値と突き合わせて弾く検証ゲートを実装します。数値が業務判断に直結する場面、たとえば料金計算やレポート集計に Code Execution を使っている方に向けた内容です。

なぜモデルの文章を信頼できないのか

Code Execution を有効にすると、モデルは「コードを書く → 実行する → 結果を見て考える → 自然文で答える」という流れをたどります。このとき API のレスポンスには、少なくとも三種類のパートが混在します。

パート中身信頼度
executable_codeモデルが生成した Python コード実行された保証はある
code_execution_resultサンドボックスが実際に返した標準出力と結果コード唯一の真実
text結果を要約した自然文幻覚しうる

問題は最後の text です。モデルは実行結果を見たうえで文章を組み立てますが、その転記の段で桁を落としたり、途中式の値と最終値を取り違えたりします。私が遭遇したずれも、実行結果には正しい 287.9 が出ていたのに、文章では別の中間計算の値が最終値として書かれていた、というものでした。

つまり 実行された値は正しかったのに、それを日本語にする段で壊れていたわけです。ここを見抜くには、文章を読むのをやめて、code_execution_result だけを機械的に取り出す必要があります。

レスポンスの3パートを分離する

まず基本の受け取り方です。google-genai SDK では、code_execution ツールを渡すだけで機能が有効になります。返ってきた parts を型ごとに仕分けます。

from google import genai
from google.genai import types
 
client = genai.Client(api_key="YOUR_API_KEY")
 
response = client.models.generate_content(
    model="gemini-2.5-pro",
    contents=(
        "次の日次eCPM(円)の加重平均を、impressionsを重みとして求めてください。"
        "day1: eCPM=280.0, impressions=12000 / "
        "day2: eCPM=305.0, impressions=8000 / "
        "day3: eCPM=290.0, impressions=15000"
    ),
    config=types.GenerateContentConfig(
        tools=[types.Tool(code_execution=types.ToolCodeExecution())],
    ),
)
 
# パートを型ごとに仕分ける
executed_code = []      # モデルが書いたコード
execution_outputs = []  # サンドボックスの実出力(真実)
prose = []              # 自然文(要約)
 
for part in response.candidates[0].content.parts:
    if part.executable_code is not None:
        executed_code.append(part.executable_code.code)
    elif part.code_execution_result is not None:
        execution_outputs.append(part.code_execution_result)
    elif part.text is not None:
        prose.append(part.text)
 
print("実行された出力:", [r.output for r in execution_outputs])
# 実行された出力: ['288.42105263157896\n']
print("自然文:", "".join(prose)[:60])
# 自然文: 加重平均eCPMは約288.4円です。...

ここで大切なのは、code_execution_result.outputサンドボックスの標準出力そのものだという点です。モデルの解釈が一切入っていません。この値だけを下流に流すのが基本方針になります。

なお、パートの順序は「コード → 実行結果 → 文章」とは限らず、モデルが試行錯誤すると executable_code と code_execution_result が交互に何度も現れます。最後の実行結果が最終値とは限らないので、単純に「最後の一個」を取るのではなく、後述のように意図した最終計算を明示的に取り出す設計にします。

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

この記事の続きを読む

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

この記事で得られること
モデルの文章にある数値を信じて集計を誤っていた人が、サンドボックスが実際に実行した結果だけを取り出して照合できるようになる
executable_code / code_execution_result / text の3パートを分離し、幻覚した数値を弾く検証ゲートのコードを手に入れられる
OUTCOME_OK 以外を静かに握りつぶさず、失敗とタイムアウトを本番で分類して再試行する設計を組める
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-03-20
Gemini API × Python で AI データ分析エージェントを構築する — Code Execution・Function Calling・Structured Output 統合ガイド
Gemini API の Code Execution、Function Calling、Structured Output を組み合わせ、CSV/Excel を自動解析し可視化・レポート生成まで行う AI データ分析エージェントを Python で構築する実践ガイド。
API / SDK2026-07-13
responseSchema で $ref が使えず詰まったら — responseJsonSchema で再帰スキーマを本番で扱う
Gemini の responseSchema は OpenAPI サブセットで $ref/$defs が使えず、共有定義も再帰も表現できません。responseJsonSchema へ移行し、多言語フィールドの再利用とカテゴリ木の再帰を本番で扱う実装をまとめました。
API / SDK2026-06-17
Gemini CLI 終了前に、自動化スクリプトを API へ載せ替えた記録
6/18 に Gemini CLI のホスト応答が停止します。シェルから gemini を呼んでいた自動化スクリプトを、google-genai SDK へ安全に載せ替える手順を、構造化出力・リトライ・コスト計測まで含めて実装ベースでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →