◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-07-14上級

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

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

gemini119code-execution4gemini-api287python106検証

✦ プレミアム記事

先月、個人開発で運営しているアプリの 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-09-04
ループ音源のプチノイズは、Gemini に聴かせる前に波形の端で切り分けられます
環境音のループ再生で折り返しだけがプチッと鳴る。音声理解に丸ごと投げる前に、波形の端の段差を内部の変化量で正規化してふるい分ける手順と、配布形式への変換で継ぎ目が作り直される落とし穴をまとめました。
◈ API / SDK2026-05-18
Gemini Vision で壁紙アプリの自動カテゴリ分類を実装した話
個人開発の壁紙アプリで Gemini Vision API を使い、画像の自動カテゴリ分類を実装した実体験です。精度改善のプロセスと、公式ドキュメントには載っていない落とし穴、GPT-4o Vision とのコスト比較までまとめました。
◈ API / SDK2026-05-16
Gemini Vision で壁紙アプリのカテゴリ自動分類を試した — 精度と落とし穴の実記録
壁紙アプリの画像カテゴリ自動分類を Gemini Vision で実装した記録。精度67%から87%への改善手順と、confidence 閾値で人間レビューを全体の15%に絞り込む運用設計を紹介します。