GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/API / SDK
API / SDK/2026-03-27上級

Gemini 3.1 Flash 高速推論APIの実装テクニック — ストリーミング・Function Calling・バッチ処理の最適化

Gemini 3.1 Flash の内部アーキテクチャと高速推論の仕組みを技術的に解説。ストリーミング・Function Calling・バッチ処理の実装パターン、Pro モデルとのコスト・性能比較に基づくモデル選定戦略まで、本番運用に必須の実践テクニックを習得できます。

gemini-3-12flash2api12streaming18performance4optimization4production105cost4

取り組みの背景 — Gemini 3.1 Flash が GA に到達した意味

2026年3月、Google が Gemini 3.1 Flash の一般利用可能(GA)を発表しました。このニュースの背景にある技術的な意味を理解することが、本当に効率的な AI システムを構築する第一歩です。

Gemini 3.1 Flash は、「中程度の複雑さのタスクを高速に処理する」という単一の目的に最適化された軽量モデルです。従来の Gemini Pro(現在は Gemini 2.0 Pro)と比較して、推論速度は 3~5 倍高速でありながら、コスト面でも顕著な優位性を保ちます。

しかし「速い=優秀」ではありません。各モデルの特性を正確に理解し、タスクの複雑度に応じて使い分けることが、API 呼び出しコストを最小化しながら ユーザー体験を向上させる鍵です。

Gemini 3.1 Flash の内部アーキテクチャ

トークン化とコンテキストウィンドウ

Gemini 3.1 Flash は、100 万トークンのコンテキストウィンドウを備えています。これは従来の Gemini Flash(約 10 万トークン)から 10 倍拡大したもので、長文ドキュメントの処理能力が飛躍的に向上しました。

しかし技術的に重要なポイントは、トークン化の効率性です。Flash モデルは、テキストのトークン化に特殊な高速アルゴリズムを採用しており、同じテキストでも Pro より若干少ないトークン数で表現されることが多いです。

// Node.js + @google/generative-ai で Gemini 3.1 Flash を使用
import { GoogleGenerativeAI } from "@google/generative-ai";
 
const client = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
const model = client.getGenerativeModel({
  model: "gemini-3.1-flash",
  generationConfig: {
    temperature: 0.7,
    topP: 0.95,
    topK: 40,
    maxOutputTokens: 2048,
  }
});
 
// トークン数の確認(コスト予測)
const countResponse = await model.countTokens(
  "Gemini 3.1 Flash についての長い質問文..."
);
console.log(`Input tokens: ${countResponse.totalTokens}`);

推論エンジンの特性

Gemini 3.1 Flash が高速である理由は、推論エンジンの設計にあります。Pro モデルは複雑な推論パスを探索し、複数の仮説を並行処理するのに対し、Flash は単一の確率的推論パスに最適化されています。

これにより:

  • テキスト生成(JSON、コード、マークダウン)は高速
  • 複数ステップの論理推論は Pro より低精度
  • 視覚情報(画像・動画)の処理は中程度の複雑さまで対応可能

選択基準:

  • Flash を選ぶべき: Q&A、要約、翻訳、API レスポンス生成、簡単なコード補完
  • Pro を選ぶべき: 複雑なロジック、学術的推論、医療診断支援、多言語の微妙なニュアンス解析

ストリーミング実装の最適化パターン

本番環境ユーザーは、API レスポンスの待機時間に敏感です。ストリーミング(Server-Sent Events) は、ユーザー体験を大幅に向上させる強力なテクニックです。

REST API でのストリーミング実装

// Node.js + Fetch API でストリーミングを実装
async function streamGemini3Flash(prompt) {
  const response = await fetch(
    "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash:streamGenerateContent",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-goog-api-key": process.env.GEMINI_API_KEY,
      },
      body: JSON.stringify({
        contents: [
          {
            role: "user",
            parts: [{ text: prompt }],
          },
        ],
        generationConfig: {
          temperature: 0.7,
          maxOutputTokens: 2048,
        },
      }),
    }
  );
 
  if (!response.ok) {
    throw new Error(`API Error: ${response.statusText}`);
  }
 
  // ストリーミングレスポンスの処理
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  let fullText = "";
 
  try {
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
 
      const chunk = decoder.decode(value);
 
      // 行単位で JSON パースする(改行区切り)
      const lines = chunk.split("\n");
      for (const line of lines) {
        if (!line.trim()) continue;
 
        try {
          const parsed = JSON.parse(line);
          const text =
            parsed.candidates?.[0]?.content?.parts?.[0]?.text || "";
 
          if (text) {
            fullText += text;
            // ここでチャンク単位で処理(フロントエンドへの送信など)
            console.log("Stream chunk:", text);
          }
        } catch (e) {
          // JSON パース失敗は無視(不完全なチャンク対策)
        }
      }
    }
  } finally {
    reader.cancel();
  }
 
  return fullText;
}
 
// 使用例
const result = await streamGemini3Flash(
  "次のデータを JSON にして: 名前: 太郎, 年齢: 30, 職業: エンジニア"
);
console.log("Final result:", result);
// Expected output:
// {"名前": "太郎", "年齢": 30, "職業": "エンジニア"}

@google/generative-ai SDK でのストリーミング

import { GoogleGenerativeAI } from "@google/generative-ai";
 
const client = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
const model = client.getGenerativeModel({ model: "gemini-3.1-flash" });
 
async function streamWithSDK(prompt) {
  // startStream() でストリーミングを開始
  const stream = await model.generateContentStream(prompt);
 
  // text プロパティでテキストチャンクを取得
  for await (const chunk of stream.stream) {
    const chunkText =
      chunk.candidates[0]?.content?.parts[0]?.text || "";
    if (chunkText) {
      process.stdout.write(chunkText); // リアルタイム出力
    }
  }
 
  // 最終レスポンスメタデータ
  const response = await stream.response;
  console.log(
    `\n\nTotal tokens used: ${response.usageMetadata.totalTokenCount}`
  );
}
 
await streamWithSDK("100 個の創造的な起業アイデアをリストアップしてください");

パフォーマンス効果:

  • ストリーミングなし: 2~4 秒待機後、一気に表示
  • ストリーミングあり: 300ms 以内に最初のチャンク表示、リアルタイム更新

Function Calling による API 統合

Gemini 3.1 Flash は Function Calling に優れており、外部 API・ツール連携を高速に実行できます。

Function Calling の定義と実行

import { GoogleGenerativeAI } from "@google/generative-ai";
 
const client = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
const model = client.getGenerativeModel({ model: "gemini-3.1-flash" });
 
// Tool 定義
const tools = {
  googleSearch: {
    description: "Google 検索を実行",
    parameters: {
      type: "object",
      properties: {
        query: {
          type: "string",
          description: "検索クエリ"
        },
      },
      required: ["query"],
    },
  },
  fetchUrl: {
    description: "URL のコンテンツを取得",
    parameters: {
      type: "object",
      properties: {
        url: {
          type: "string",
          description: "フェッチ対象のURL"
        },
      },
      required: ["url"],
    },
  },
};
 
// Function Calling の呼び出し
async function callWithTools(userPrompt) {
  const response = await model.generateContent({
    contents: [
      {
        role: "user",
        parts: [{ text: userPrompt }],
      },
    ],
    tools: [
      {
        functionDeclarations: Object.entries(tools).map(([name, spec]) => ({
          name,
          description: spec.description,
          parameters: spec.parameters,
        })),
      },
    ],
  });
 
  // レスポンスをチェック
  const candidates = response.candidates || [];
  for (const candidate of candidates) {
    const functionCalls =
      candidate.content?.parts?.filter(p => p.functionCall) || [];
 
    for (const part of functionCalls) {
      const { name, args } = part.functionCall;
      console.log(`📞 Function call: ${name}`, args);
 
      // ここで実際のツール実行を行う
      // 今回は仮の結果を返す
    }
  }
 
  return response;
}
 
// 使用例
await callWithTools(
  "最新の Google Cloud Platform 価格情報を検索して、短くまとめてください"
);

バッチ処理による コスト最適化

複数の API 呼び出しをバッチでまとめることで、通常リクエストの 50% 以上コスト削減が可能です。

バッチリクエストの構成

// Batch API リクエストの例(JSON Lines 形式)
// requests.jsonl
/*
{"custom_id":"req-1","params":{"model":"gemini-3.1-flash","contents":[{"role":"user","parts":[{"text":"Python で FizzBuzz を実装"}]}]}}
{"custom_id":"req-2","params":{"model":"gemini-3.1-flash","contents":[{"role":"user","parts":[{"text":"JavaScript で クイックソート を実装"}]}]}}
{"custom_id":"req-3","params":{"model":"gemini-3.1-flash","contents":[{"role":"user","parts":[{"text":"Go で ファイアウォール を実装"}]}]}}
*/
 
import fs from "fs";
import axios from "axios";
 
async function submitBatchRequest() {
  const batchContent = `{"custom_id":"req-1","params":{"model":"gemini-3.1-flash","contents":[{"role":"user","parts":[{"text":"Python で FizzBuzz を実装"}]}]}}
{"custom_id":"req-2","params":{"model":"gemini-3.1-flash","contents":[{"role":"user","parts":[{"text":"JavaScript で クイックソート を実装"}]}]}}
{"custom_id":"req-3","params":{"model":"gemini-3.1-flash","contents":[{"role":"user","parts":[{"text":"Go で ファイアウォール を実装"}]}]}}`;
 
  const formData = new FormData();
  const blob = new Blob([batchContent], { type: "text/plain" });
  formData.append("file", blob, "requests.jsonl");
 
  const response = await axios.post(
    "https://generativelanguage.googleapis.com/v1beta/batches",
    formData,
    {
      headers: {
        "x-goog-api-key": process.env.GEMINI_API_KEY,
        ...formData.getHeaders(),
      },
    }
  );
 
  console.log("Batch submitted:", response.data);
  return response.data.name; // batchId
}
 
// バッチ実行結果の確認
async function checkBatchStatus(batchId) {
  const response = await axios.get(
    `https://generativelanguage.googleapis.com/v1beta/${batchId}`,
    {
      headers: { "x-goog-api-key": process.env.GEMINI_API_KEY },
    }
  );
 
  console.log("Batch status:", response.data.state);
  // state: "PROCESSING" / "COMPLETED" / "FAILED"
 
  if (response.data.state === "COMPLETED") {
    // 結果ファイルの URL から結果を取得
    const resultsUrl = response.data.outputFile;
    console.log("Results available at:", resultsUrl);
  }
 
  return response.data;
}
 
const batchId = await submitBatchRequest();
await new Promise(resolve => setTimeout(resolve, 10000)); // 10秒待機
await checkBatchStatus(batchId);

コスト計算例(単価は調査時点の API 料金):

  • Flash input: $0.075/100万トークン、output: $0.30/100万トークン
  • 100件リクエスト通常送信: ~¥2,500(入力 50万トークン、出力 20万トークン)
  • バッチ送信: ~¥1,250(50% 割引)

Pro モデルとの性能・コスト比較

ユースケース別の推奨モデル

ユースケースFlashPro判断理由
JSON・XML 生成⭐⭐⭐⭐⭐⭐⭐⭐⭐Flash で十分な品質、コスト優位
コード補完(シンプル)⭐⭐⭐⭐⭐⭐⭐⭐⭐Flash の推論で対応可能
テキスト要約⭐⭐⭐⭐⭐⭐⭐⭐要約品質は Flash で十分
複雑なロジック推論⭐⭐⭐⭐⭐⭐⭐Pro の探索能力が必須
医療・法務判定⭐⭐⭐⭐⭐⭐⭐責任度が高い、Pro 推奨
多言語ニュアンス解析⭐⭐⭐⭐⭐⭐⭐⭐言語依存性は Pro が優秀
画像解析(図表)⭐⭐⭐⭐⭐⭐⭐⭐Flash で充分、コスト優位
自動採点・評価⭐⭐⭐⭐⭐⭐⭐⭐一貫性と精度は Pro が上

コスト シミュレーション(月額)

【シナリオ】: 日次 1,000 リクエスト(30日)

パターンA: Flash のみ利用
- 入力: 平均 500 トークン × 1,000 × 30 = 1,500万トークン
  コスト: 1,500万 ÷ 100万 × $0.075 = $112.5 ≈ ¥11,250

パターンB: Flash 70% + Pro 30% 利用(複雑なタスクは Pro に振分)
- Flash: 700リクエスト × 30 = 2,100万トークン = $157.5
- Pro: 300リクエスト × 30 = 900万トークン × $0.15(Pro 入力料金)= $135
- 合計: $292.5 ≈ ¥29,250

パターンC: 完全に Pro で対応
- 3,000万トークン × $0.15 = $450 ≈ ¥45,000

推奨戦略: 初期段階では Flash を試し、品質が不足するタスクのみ Pro に切り替える動的ルーティングが最適です。

本番環境での注意点

レート制限とリトライロジック

async function callWithRetry(prompt, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await model.generateContent(prompt);
      return response;
    } catch (error) {
      if (error.status === 429) {
        // Rate limit exceeded
        const waitTime = Math.pow(2, attempt) * 1000; // Exponential backoff
        console.log(`Rate limited. Waiting ${waitTime}ms...`);
        await new Promise(resolve => setTimeout(resolve, waitTime));
        continue;
      }
      throw error;
    }
  }
  throw new Error("Max retries exceeded");
}

入力検証とプロンプトインジェクション対策

function sanitizePrompt(userInput) {
  // SQL インジェクション・プロンプトインジェクション対策
  const forbidden = [
    "system_prompt",
    "__init__",
    "eval(",
    "exec(",
  ];
 
  for (const pattern of forbidden) {
    if (userInput.toLowerCase().includes(pattern.toLowerCase())) {
      throw new Error("Invalid input detected");
    }
  }
 
  return userInput.trim().substring(0, 4000); // Length limit
}

まとめ

Gemini 3.1 Flash は、高速・低コスト・高精度 の黄金バランスを実現したモデルです。本記事で解説した ストリーミング・Function Calling・バッチ処理 の組み合わせで、本番環境の要件に応じた最適な実装が可能になります。

初期段階では Flash で実験し、品質不足のタスクのみ Pro に振分ける動的ルーティングが、ビジネス効率を最大化する鍵です。

シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

API / SDK2026-04-12
Gemini API 本番パフォーマンスチューニング — レイテンシ・スループット・コストの3軸最適化戦略
Gemini API の本番環境でレイテンシ・スループット・コストを同時に最適化する実装パターンを解説。Flex/Priority推論・Context Caching・モデルルーティング・非同期バッチ処理の統合戦略を、動作するコードとベンチマーク結果で示します。
API / SDK2026-06-25
Gemini API × TypeScript 型安全AIアプリケーション設計ガイド — Zodスキーマ・Structured Output・ストリーミングの統合アーキテクチャ
Gemini APIとTypeScriptで型安全なAIアプリケーションを構築する方法を解説。Zodバリデーション、Structured Output、ストリーミング、エラーハンドリングを統合した本番アーキテクチャを実装します。
API / SDK2026-05-23
Gemini API のストリーミングが本番で「途中で切れる」とき、私が試している原因切り分けの順序
Gemini API のストリーミング応答が本番で途中で切れる症状を、ネットワーク・SDK・サーバー側のどこから疑うかの順序を、個人開発で実際に踏んだ事例ごとに整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →