Google Gemini CLI で非同期バッチ処理を使いこなそう!AIと働く新しいスタイル

2025年10月06日 | AI技術

Google Gemini CLI で非同期バッチ処理を使いこなそう!AIと働く新しいスタイル

この記事をシェア

なぜ「非同期」「バックグラウンド」なのか?

AIを仕事で使うなら、絶対に非同期・バックグラウンド処理を選ぶべきです。理由はシンプルです。

想像してみてください。AIに質問を投げて、画面の前でじっと待つ。回答が返ってくるまで何もできない...これでは人間が機械に縛られているようなものです。

AIは「待たせる相手」ではなく、「働いてもらう相手」です。

  • 100件の商品説明を生成したい?
  • 大量の文章を要約したい?
  • 複数の質問に一気に答えてほしい?

こういうとき、1件ずつ処理して待つのは時間の無駄です。バッチ処理なら、まとめて依頼して、その間に別の仕事ができます。コーヒーを淹れてもいいし、次のタスクに取りかかってもいい。人間は人間の仕事に集中し、AIにはAIの仕事を任せる。これが本当の意味での「AIとの協働」です。

今回は、Google Gemini APIのバッチ処理機能を使って、この理想的な働き方を実現する方法を解説します。

Gemini Batch APIって何?

Gemini Batch APIは、複数のAIリクエストを1回のAPI呼び出しでまとめて処理できる機能です。

普通のAPI呼び出しとの違い

通常のやり方(1件ずつ処理):

  • 質問1を送信 → 待つ → 回答1を受信
  • 質問2を送信 → 待つ → 回答2を受信
  • 質問3を送信 → 待つ → 回答3を受信

バッチAPIのやり方(まとめて処理):

  • 質問1,2,3をまとめて送信 → 待つ → 回答1,2,3をまとめて受信

見た目は地味ですが、効果は絶大です。

バッチAPIの基本情報

どこにアクセスするの?

エンドポイント:

https://generativelanguage.googleapis.com/v1beta/models/{model}:batchGenerateContent

このURLに対して、POSTリクエストを送ります。

制限事項を知っておこう

バッチAPIには制限があります:

項目 制限
1回のリクエストで送れる質問数 最大100件
無料プラン(1分あたり) 15バッチリクエスト
無料プラン(1日あたり) 1,000バッチリクエスト
有料プラン(1分あたり) 60バッチリクエスト

100件までまとめて送れるので、かなり効率的です。

実践:シンプルなバッチ処理

まずは基本的な使い方から見ていきましょう。

ステップ1:必要なライブラリをインストール

npm install @google/generative-ai

ステップ2:基本的なバッチ処理コード

const { GoogleGenerativeAI } = require("@google/generative-ai");

async function simpleGeminiBatch() {
  // APIキーを設定(あなたのAPIキーに置き換えてください)
  const genAI = new GoogleGenerativeAI("YOUR_API_KEY");
  
  // 使用するモデルを選択
  const model = genAI.getGenerativeModel({ 
    model: "gemini-pro",
    generationConfig: {
      maxOutputTokens: 100, // 回答の長さを制限
    }
  });

  // まとめて送りたい質問リストを作成
  const questions = [
    { contents: [{ parts: [{ text: "夏の海について3文で説明してください" }] }] },
    { contents: [{ parts: [{ text: "AIの未来について100文字で述べてください" }] }] },
    { contents: [{ parts: [{ text: "プログラミングのメリットを3つ挙げてください" }] }] }
  ];

  try {
    // バッチ処理を実行(ここで一気に送信!)
    const batchResult = await model.batchGenerateContent(questions);
    
    // 結果を表示
    console.log("=== バッチ処理完了! ===");
    batchResult.response.forEach((result, index) => {
      console.log(`\n質問 ${index + 1} の回答:`);
      console.log(result.text());
      console.log("---");
    });
  } catch (error) {
    console.error("エラーが発生しました:", error);
  }
}

// 実行
simpleGeminiBatch();

このコードのポイント

  • questions配列に質問をまとめて入れる
  • batchGenerateContentで一気に送信
  • 結果も配列でまとめて返ってくる

これだけで、3つの質問を効率的に処理できます!

もっと実践的:大量処理に対応したクラス

実際の業務では、もっと多くのタスクを処理したいですよね。そこで、100件ずつ自動的に分割して処理してくれるクラスを作りましょう。

class GeminiBatchProcessor {
  constructor(apiKey, batchSize = 50) {
    this.genAI = new GoogleGenerativeAI(apiKey);
    this.model = this.genAI.getGenerativeModel({ model: "gemini-pro" });
    this.batchSize = batchSize; // 1回に何件送るか
    this.queue = []; // タスクの待ち行列
  }

  // タスクを追加するメソッド
  addTask(prompt, config = {}) {
    this.queue.push({
      contents: [{ parts: [{ text: prompt }] }],
      generationConfig: {
        maxOutputTokens: config.maxTokens || 100,
        temperature: config.temperature || 0.7,
        ...config
      }
    });
  }

  // 溜まったタスクを一気に処理
  async processBatch() {
    const results = [];
    
    // キューを50件(または指定したサイズ)ずつに分割
    for (let i = 0; i < this.queue.length; i += this.batchSize) {
      const batch = this.queue.slice(i, i + this.batchSize);
      
      try {
        console.log(`処理中: ${i + 1}件目〜${Math.min(i + this.batchSize, this.queue.length)}件目`);
        const batchResult = await this.model.batchGenerateContent(batch);
        
        // 結果を保存
        batchResult.response.forEach((result, index) => {
          results.push({
            success: true,
            data: result.text(),
            index: i + index
          });
        });

        // レート制限を避けるため1秒待つ
        await this.delay(1000);
        
      } catch (error) {
        console.error(`エラー発生(${i}件目付近):`, error.message);
        // エラーが起きても他のタスクは続ける
        for (let j = 0; j < batch.length; j++) {
          results.push({
            success: false,
            error: error.message,
            index: i + j
          });
        }
      }
    }
    
    this.queue = []; // 処理済みなのでキューをクリア
    return results;
  }

  // 待機用のヘルパー関数
  delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
  }
}

このクラスの使い方

async function runBigBatch() {
  // プロセッサーを作成(1バッチ10件ずつ処理)
  const processor = new GeminiBatchProcessor("YOUR_API_KEY", 10);
  
  // タスクをどんどん追加
  processor.addTask("東京の観光スポットを3つ教えて");
  processor.addTask("健康的な朝食メニューは?");
  processor.addTask("JavaScriptの配列操作を説明して");
  
  // さらに大量に追加(実際は100件でも200件でもOK)
  for (let i = 1; i <= 25; i++) {
    processor.addTask(`テーマ${i}について簡潔に説明してください`, {
      maxTokens: 50,
      temperature: 0.5
    });
  }
  
  // 一気に処理開始!
  console.log("バッチ処理開始...");
  const results = await processor.processBatch();
  
  // 結果の確認
  results.forEach(result => {
    if (result.success) {
      console.log(`✓ タスク${result.index + 1}: ${result.data.substring(0, 30)}...`);
    } else {
      console.log(`✗ タスク${result.index + 1}: エラー`);
    }
  });
  
  console.log(`\n完了! 成功: ${results.filter(r => r.success).length}件`);
}

runBigBatch();

REST APIで直接叩く方法

ライブラリを使わずに、直接HTTP通信でバッチAPIを使うこともできます。

const axios = require('axios');

async function directBatchCall() {
  const apiKey = 'YOUR_API_KEY';
  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:batchGenerateContent?key=${apiKey}`;

  const requestData = {
    requests: [
      {
        contents: [{ parts: [{ text: "日本の伝統文化について教えて" }] }],
        generationConfig: {
          temperature: 0.7,
          maxOutputTokens: 200
        }
      },
      {
        contents: [{ parts: [{ text: "機械学習とディープラーニングの違いは?" }] }],
        generationConfig: {
          temperature: 0.3,
          maxOutputTokens: 150
        }
      }
    ]
  };

  try {
    const response = await axios.post(url, requestData, {
      headers: { 'Content-Type': 'application/json' }
    });

    // 結果を表示
    response.data.responses.forEach((resp, index) => {
      if (resp.candidates && resp.candidates.length > 0) {
        console.log(`回答${index + 1}:`, resp.candidates[0].content.parts[0].text);
      }
    });
  } catch (error) {
    console.error("エラー:", error.response?.data || error.message);
  }
}

バッチ処理のベストプラクティス

1. 適切なバッチサイズを選ぶ

// おすすめ設定
const config = {
  batchSize: 50,        // 50件が効率的
  delayBetweenBatches: 1000,  // バッチ間は1秒待つ
  maxRetries: 2         // 失敗したら2回まで再試行
};

2. エラーハンドリングを忘れずに

バッチAPIでは、一部が失敗しても他は処理されます。上記のクラスのように、各タスクの成功/失敗を記録しましょう。

3. レート制限に注意

連続で送りすぎると制限に引っかかります。バッチ間に1秒程度の待機時間を入れるのがおすすめです。

まとめ:AIと非同期で働く未来

Gemini Batch APIを使えば:

  • ✅ 複数のタスクを一度に依頼できる
  • ✅ 処理中に他の仕事ができる
  • ✅ ネットワークの無駄を減らせる
  • ✅ コストも削減できる

AIは「待つ相手」ではなく「バックグラウンドで働いてもらう相手」。この発想の転換が、AIを本当に活用する第一歩です。

今日からバッチ処理を使って、AIとの新しい働き方を始めましょう!

参考リンク

この記事が役に立ったらシェアしてください

Google Gemini APIのバッチ処理でAIとの効率的な協働を実現しましょう!

カテゴリ

AI技術

公開日

2025年10月06日

お気軽にご相談ください

記事に関するご質問や、AI・IT技術導入のご相談など、お気軽にお問い合わせください。