Google AI Studio

Google AI Studio 完全ガイド【中級編】|プロンプトエンジニアリングからエージェント構築まで

2026年1月19日 42分で読める AQUA合同会社
Google AI Studio 完全ガイド【中級編】|プロンプトエンジニアリングからエージェント構築まで

この記事は【初級編】の続きです。基本機能をまだ確認していない方は、先に初級編をお読みください。

初級編では Google AI Studio の基本機能を紹介しましたが、「これだけでは物足りない」と感じた方も多いのではないでしょうか。

実は、Google AI Studio の真価はプロンプトエンジニアリング外部システム連携にあります。適切なプロンプト設計で回答精度は劇的に向上し、Google Apps Script や API 連携により、日常業務を自動化する強力なツールへと進化します。

本記事では、ビジネス現場で即戦力となる実践テクニックを徹底解説。読み終える頃には、Google AI Studio を「使いこなせる」レベルに到達しているはずです。

第1章:プロンプトエンジニアリング実践編

1-1. System Instructions(システム指示)の設計術

System Instructions は、AI の「人格」と「行動規範」を定義する最も重要な設定です。初級編では基本的な使い方を紹介しましたが、ここではビジネスで成果を出すための設計パターンを解説します。

黄金の設計フレームワーク「CRISP」

効果的な System Instructions は、以下の5要素で構成します:

C – Context(文脈):どのような状況で使用されるか

R – Role(役割):AI がどのような専門家として振る舞うか

I – Instructions(指示):具体的に何をすべきか

S – Style(スタイル):どのようなトーン・形式で回答するか

P – Parameters(制約):やってはいけないこと、守るべきルール

実践例:カスタマーサポート AI の設計

## Context(文脈)
あなたは、SaaS プロダクト「TaskFlow」のカスタマーサポート担当です。
TaskFlow は中小企業向けのプロジェクト管理ツールで、
主に IT 企業、デザイン事務所、コンサルティング会社が利用しています。

## Role(役割)
- 製品知識が豊富なシニアサポートエンジニア
- 顧客の課題を技術的に解決できる専門家
- 必要に応じて営業チームへのエスカレーションを判断できる

## Instructions(指示)
1. まず顧客の問題を正確に理解するための質問をする
2. 問題の原因を特定し、段階的な解決手順を提示する
3. 解決後、関連する Tips や活用方法を1つ提案する
4. 解決できない場合は、チケット起票を案内する

## Style(スタイル)
- 敬語を使用(ですます調)
- 技術用語は必要に応じて平易な言葉で補足
- 箇条書きを活用し、視認性を重視
- 絵文字は使用しない

## Parameters(制約)
- 競合製品(Asana, Monday.com, Notion)との比較は行わない
- 価格交渉や返金対応は営業チームへ案内する
- 未発表機能については言及しない
- 個人情報の取得は最小限に留める

この設計により、AI は一貫性のある高品質な対応を実現します。特にParameters(制約)は、AI が「やってはいけないこと」を明確にすることで、予期しない回答を防ぎます。

1-2. Few-shot Prompting:例示の力

Few-shot Prompting は、具体的な入出力例を示すことで AI の出力形式と品質をコントロールする技法です。Gemini では特に効果が高く、2〜3例の提示で劇的に精度が向上します。

Few-shot が効果的なケース

  • 特定のフォーマットで出力させたい場合(レポート、メール、コード)
  • 業界特有の用語や表現を使わせたい場合
  • 評価基準が曖昧なタスク(良い文章とは?適切な回答とは?)
  • 一貫性が重要な大量処理(データ変換、分類)

実践例:商品レビューの感情分析

あなたは商品レビューの感情を分析するアナリストです。
以下の形式で分析結果を出力してください。

【例1】
レビュー: 「配送が予定より2日も早くて驚きました!商品も写真通りで大満足です。」
分析結果:
- 感情スコア: 92/100(非常にポジティブ)
- キーポイント: 配送速度への高評価、商品品質への満足
- 改善示唆: なし
- カテゴリ: 物流体験、商品品質

【例2】
レビュー: 「デザインは気に入っているが、説明書が分かりにくく設定に1時間かかった。」
分析結果:
- 感情スコア: 58/100(やや不満)
- キーポイント: デザイン評価は高い、セットアップ体験に課題
- 改善示唆: 説明書の改善、動画マニュアルの提供
- カテゴリ: 製品デザイン、ユーザビリティ

【例3】
レビュー: 「3ヶ月使用して壊れました。カスタマーサポートに連絡しても返信がありません。」
分析結果:
- 感情スコア: 15/100(非常にネガティブ)
- キーポイント: 耐久性の問題、サポート対応への強い不満
- 改善示唆: 品質管理の強化、サポート体制の改善
- カテゴリ: 製品品質、カスタマーサポート

---
以下のレビューを分析してください:
「{ユーザーが入力するレビュー}」

Few-shot 設計の3つの原則

原則 説明
多様性 異なるパターンの例を含める ポジティブ・中立・ネガティブを各1例
一貫性 出力形式を統一する 全例で同じ項目・順序を維持
現実性 実際のデータに近い例を使用 架空ではなく実在するレビューを参考に

1-3. Chain of Thought(CoT):思考の連鎖

Chain of Thought は、AI に段階的な思考プロセスを踏ませることで、複雑な推論タスクの精度を大幅に向上させる技法です。

CoT が効果を発揮する場面

  • 数学的計算や論理的推論
  • 多段階の意思決定
  • 複数の条件を考慮する判断
  • 原因分析や問題解決

基本パターン:「ステップバイステップで考えてください」

最もシンプルな CoT は、プロンプトの末尾に「ステップバイステップで考えてください」と追加するだけです。

【問題】
A社は月額1万円のサブスクリプションサービスを提供しています。
現在の解約率は月5%、新規獲得数は月100人です。
顧客獲得コストは1人あたり3,000円です。
6ヶ月後の予想収益を計算してください。

ステップバイステップで考えてください。

応用パターン:構造化された思考フレーム

より高度なタスクでは、思考のフレームワークを明示的に指定します。

以下の手順で分析を行ってください:

【Step 1: 情報の整理】
与えられた情報を箇条書きで整理する

【Step 2: 前提条件の確認】
計算に必要な前提条件を明確にする

【Step 3: 計算プロセス】
各月の顧客数と収益を順番に計算する

【Step 4: 結果の検証】
計算結果が論理的に正しいか確認する

【Step 5: 結論と洞察】
結果から得られるビジネス上の示唆を述べる

1-4. Tree of Thoughts(ToT):思考の木

Tree of Thoughts は CoT の発展形で、複数の思考経路を並行して探索し、最良の解を選択する技法です。

ToT の活用シーン

  • 戦略立案:複数のアプローチを比較検討
  • クリエイティブワーク:複数のアイデアを生成・評価
  • リスク分析:様々なシナリオを検討

実践例:新規事業の戦略検討

【課題】
飲食店向け予約管理SaaSを展開する企業が、新規事業を検討しています。
既存顧客基盤は3,000店舗、月額料金は平均1万円です。

以下のフレームワークで分析してください:

## フェーズ1:アイデア生成
3つの異なる新規事業案を提案してください。
各案について1文で概要を説明してください。

## フェーズ2:深掘り分析
各案について以下を分析:
- 市場規模の推定
- 既存リソースとのシナジー
- 参入障壁
- 収益化までの期間

## フェーズ3:評価と比較
5段階評価で各案を採点:
- 実現可能性
- 収益ポテンシャル
- リスク
- 戦略適合性

## フェーズ4:推奨案の決定
最も推奨する案を1つ選び、その理由と
実行に向けた最初の3ステップを提示してください。

第2章:Structured Output × Grounding の実践

2-1. Structured Output(構造化出力)とは

Structured Output は、AI の出力を JSON などの構造化フォーマットで強制する機能です。これにより、後続のシステム処理が容易になります。

Google AI Studio での設定方法

  1. Chat または Build モードでプロンプトを作成
  2. 右パネルの「Output format」で「JSON」を選択
  3. JSON Schema を定義(手動またはサンプルから自動生成)

JSON Schema の設計例:商品データ抽出

{
  "type": "object",
  "properties": {
    "product_name": {
      "type": "string",
      "description": "商品名"
    },
    "price": {
      "type": "number",
      "description": "価格(税込、円)"
    },
    "category": {
      "type": "string",
      "enum": ["家電", "ファッション", "食品", "その他"],
      "description": "商品カテゴリ"
    },
    "features": {
      "type": "array",
      "items": {"type": "string"},
      "description": "主な特徴(最大5つ)"
    },
    "target_audience": {
      "type": "string",
      "description": "想定ターゲット層"
    },
    "confidence_score": {
      "type": "number",
      "minimum": 0,
      "maximum": 100,
      "description": "抽出の確信度"
    }
  },
  "required": ["product_name", "price", "category"]
}

2-2. Search Grounding:リアルタイム情報との融合

Grounding with Google Search は、AI の回答に最新の Web 情報を組み込む機能です。Gemini 3 では、この機能と Structured Output を同時に使用可能になりました。

Grounding が有効なユースケース

  • 競合分析:最新の競合動向を構造化データで取得
  • 市場調査:リアルタイムの市場情報を分析
  • ニュース要約:最新ニュースを定型フォーマットで整理
  • 価格調査:現在の市場価格を収集

実践例:競合分析の自動化

以下の設定で、競合企業の最新情報を構造化データとして取得できます。

【System Instructions】
あなたは競合分析の専門家です。
指定された企業について、最新の公開情報を収集・分析してください。

【JSON Schema】
{
  "type": "object",
  "properties": {
    "company_name": {"type": "string"},
    "recent_news": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "headline": {"type": "string"},
          "date": {"type": "string"},
          "summary": {"type": "string"},
          "source_url": {"type": "string"}
        }
      },
      "maxItems": 5
    },
    "product_updates": {
      "type": "array",
      "items": {"type": "string"}
    },
    "market_position": {"type": "string"},
    "threats": {"type": "array", "items": {"type": "string"}},
    "opportunities": {"type": "array", "items": {"type": "string"}},
    "analysis_date": {"type": "string"}
  }
}

【プロンプト】
「{競合企業名}」について、直近3ヶ月の動向を分析してください。

2-3. Dynamic Retrieval:必要な時だけ検索

Gemini 3 では、Dynamic Retrieval 機能により、検索が必要かどうかを AI が自動判断します。

// API設定例
{
  "tools": [{
    "google_search": {
      "dynamic_retrieval_config": {
        "mode": "MODE_DYNAMIC",
        "dynamic_threshold": 0.6
      }
    }
  }]
}

dynamic_threshold を調整することで、検索のトリガー感度を制御できます:

  • 0.3以下:ほとんどの質問で検索を実行
  • 0.5〜0.7:バランスの取れた設定(推奨)
  • 0.8以上:明らかに最新情報が必要な場合のみ検索

第3章:Google Apps Script 連携

3-1. GeminiApp ライブラリの導入

Google Apps Script から Gemini API を呼び出すには、GeminiApp ライブラリが便利です。スプレッドシート、ドキュメント、Gmail など、Google Workspace のあらゆるサービスと AI を連携できます。

セットアップ手順

  1. Google Apps Script エディタを開く
  2. 「ライブラリ」→「+」をクリック
  3. スクリプト ID を入力:1OZ0R98VoIjYHl-7anGIob6LIVfB1GRZD2M4O1Lqnvpj4S4Kn-MGLgLWN
  4. 最新バージョンを選択して追加
  5. Google AI Studio で API キーを取得

基本的な使い方

function testGemini() {
  // API キーの設定
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');

  // GeminiApp の初期化
  const gemini = GeminiApp.init(apiKey);

  // シンプルなテキスト生成
  const response = gemini.generateContent("日本の首都はどこですか?");

  Logger.log(response.text);
}

3-2. 実践例:スプレッドシートの自動分類

顧客からの問い合わせを自動で分類するシステムを構築します。

function classifyInquiries() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("問い合わせ");
  const data = sheet.getDataRange().getValues();
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const gemini = GeminiApp.init(apiKey);

  // System Instructions の設定
  gemini.setSystemInstruction(`
    あなたは問い合わせ分類の専門家です。
    問い合わせ内容を以下のカテゴリに分類してください:
    - 製品に関する質問
    - 技術サポート
    - 請求・支払い
    - 解約・退会
    - その他

    JSON形式で回答してください:
    {"category": "カテゴリ名", "urgency": "高/中/低", "summary": "要約"}
  `);

  // ヘッダー行をスキップして処理
  for (let i = 1; i < data.length; i++) {
    const inquiry = data[i][1]; // B列:問い合わせ内容

    if (inquiry && !data[i][2]) { // 未分類の場合のみ処理
      try {
        const result = gemini.generateContent(inquiry);
        const json = JSON.parse(result.text);

        // 結果を書き込み
        sheet.getRange(i + 1, 3).setValue(json.category);  // C列
        sheet.getRange(i + 1, 4).setValue(json.urgency);   // D列
        sheet.getRange(i + 1, 5).setValue(json.summary);   // E列

        // API制限対策:1秒待機
        Utilities.sleep(1000);
      } catch (e) {
        Logger.log(`Error at row ${i + 1}: ${e.message}`);
      }
    }
  }
}

3-3. 実践例:Gmail の自動返信ドラフト作成

受信メールの内容を分析し、返信のドラフトを自動作成するシステムです。

function createReplyDrafts() {
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const gemini = GeminiApp.init(apiKey);

  gemini.setSystemInstruction(`
    あなたはビジネスメールの専門家です。
    受信メールに対する丁寧な返信を作成してください。

    ルール:
    - ビジネス敬語を使用
    - 簡潔かつ的確な内容
    - 相手の質問には明確に回答
    - 必要に応じて追加の確認事項を記載

    出力形式:
    {"subject": "件名", "body": "本文"}
  `);

  // 未読メールを取得
  const threads = GmailApp.search("is:unread label:要返信", 0, 10);

  threads.forEach(thread => {
    const message = thread.getMessages()[0];
    const prompt = `
      差出人: ${message.getFrom()}
      件名: ${message.getSubject()}
      本文:
      ${message.getPlainBody().substring(0, 2000)}

      この問い合わせメールへの返信を作成してください。
    `;

    try {
      const result = gemini.generateContent(prompt);
      const reply = JSON.parse(result.text);

      // 下書きを作成
      message.createDraftReply(reply.body, {
        subject: reply.subject
      });

      // 処理済みラベルを付与
      thread.addLabel(GmailApp.getUserLabelByName("AI下書き済み"));

    } catch (e) {
      Logger.log(`Error: ${e.message}`);
    }
  });
}

3-4. 実践例:会議議事録の自動生成

Google Meet の文字起こしデータから、構造化された議事録を自動生成します。

function generateMeetingMinutes() {
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const gemini = GeminiApp.init(apiKey, {model: "gemini-3-pro"});

  gemini.setSystemInstruction(`
    あなたは議事録作成の専門家です。
    会議の文字起こしデータから、以下の形式で議事録を作成してください。

    ## 会議概要
    - 日時:
    - 参加者:
    - 会議タイトル:

    ## アジェンダと議論内容
    [議題ごとに要約]

    ## 決定事項
    [箇条書きで明確に]

    ## アクションアイテム
    | 担当者 | タスク | 期限 |

    ## 次回会議
    - 予定日:
    - 検討事項:
  `);

  // Google ドキュメントから文字起こしを取得
  const docId = "YOUR_DOCUMENT_ID";
  const doc = DocumentApp.openById(docId);
  const transcript = doc.getBody().getText();

  const result = gemini.generateContent(`
    以下の会議の文字起こしから議事録を作成してください:

    ${transcript}
  `);

  // 新しいドキュメントに議事録を出力
  const minutesDoc = DocumentApp.create("議事録_" + new Date().toLocaleDateString());
  minutesDoc.getBody().setText(result.text);

  Logger.log("議事録を作成しました: " + minutesDoc.getUrl());
}

第4章:API 本格活用

4-1. バッチ処理の実装

大量のデータを効率的に処理するには、バッチ処理の設計が重要です。

バッチ処理の設計原則

  1. レート制限の考慮:API の制限(RPM/TPM)を超えないよう調整
  2. エラーハンドリング:失敗した項目のリトライ機構
  3. 進捗の保存:中断しても再開できる仕組み
  4. コスト最適化:不要なトークン消費を避ける
class BatchProcessor {
  constructor(apiKey, options = {}) {
    this.gemini = GeminiApp.init(apiKey);
    this.rateLimit = options.rateLimit || 15; // RPM
    this.retryCount = options.retryCount || 3;
    this.delay = 60000 / this.rateLimit; // ミリ秒
  }

  async processItems(items, processor) {
    const results = [];
    const errors = [];

    for (let i = 0; i < items.length; i++) {
      const item = items[i];
      let success = false;

      for (let retry = 0; retry < this.retryCount && !success; retry++) {
        try {
          const result = await processor(item, this.gemini);
          results.push({index: i, data: result});
          success = true;
        } catch (e) {
          if (retry === this.retryCount - 1) {
            errors.push({index: i, error: e.message, item: item});
          }
          // エクスポネンシャルバックオフ
          Utilities.sleep(this.delay * Math.pow(2, retry));
        }
      }

      // レート制限対策
      Utilities.sleep(this.delay);

      // 進捗ログ
      if ((i + 1) % 10 === 0) {
        Logger.log(`Progress: ${i + 1}/${items.length}`);
      }
    }

    return {results, errors};
  }
}

// 使用例
function runBatchAnalysis() {
  const processor = new BatchProcessor(API_KEY, {rateLimit: 10});
  const items = getDataFromSheet(); // スプレッドシートからデータ取得

  const {results, errors} = processor.processItems(items, (item, gemini) => {
    return gemini.generateContent(`分析してください: ${item.text}`);
  });

  // 結果を保存
  saveResults(results);
  if (errors.length > 0) {
    Logger.log(`Errors: ${JSON.stringify(errors)}`);
  }
}

4-2. コスト最適化のテクニック

API コストを抑えながら品質を維持するためのテクニックを紹介します。

テクニック 効果 実装方法
モデル選択 コスト50-90%削減 タスクに応じて Flash/Pro を使い分け
プロンプト圧縮 トークン20-40%削減 冗長な指示を削除、箇条書きを活用
キャッシュ活用 重複リクエスト削減 同一プロンプトの結果を保存
出力制限 出力トークン削減 max_output_tokens を適切に設定
Context Caching 入力コスト75%削減 長い System Instructions をキャッシュ

Context Caching の実装例

// 長いコンテキストをキャッシュ
const cachedContent = await ai.cacheManager.create({
  model: "gemini-3-pro",
  contents: [
    {
      role: "user",
      parts: [{text: longDocumentText}]  // 大量のドキュメント
    }
  ],
  systemInstruction: "あなたは文書分析の専門家です...",
  ttl: "3600s"  // 1時間キャッシュ
});

// キャッシュを使用して質問
const response = await ai.generateContent({
  cachedContent: cachedContent.name,
  contents: [{role: "user", parts: [{text: "この文書の要点は?"}]}]
});

4-3. エラーハンドリングのベストプラクティス

async function robustApiCall(prompt, options = {}) {
  const maxRetries = options.maxRetries || 3;
  const baseDelay = options.baseDelay || 1000;

  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await gemini.generateContent(prompt);
      return response;

    } catch (error) {
      const errorCode = error.code || error.status;

      // リトライ不可能なエラー
      if (errorCode === 400) { // Bad Request
        throw new Error(`Invalid request: ${error.message}`);
      }
      if (errorCode === 403) { // Forbidden
        throw new Error(`API key invalid or quota exceeded`);
      }

      // リトライ可能なエラー
      if (errorCode === 429 || errorCode === 503) {
        const delay = baseDelay * Math.pow(2, attempt);
        console.log(`Rate limited. Retrying in ${delay}ms...`);
        await sleep(delay);
        continue;
      }

      // その他のエラー
      if (attempt === maxRetries - 1) {
        throw error;
      }
    }
  }
}

第5章:実践ビジネスユースケース

5-1. カスタマーサポート AI Bot

実際のビジネスで活用できる、本格的なサポート Bot の構築例です。

構成要素:

  • Google Chat または Slack との連携
  • FAQ データベース(スプレッドシート)との RAG 連携
  • エスカレーション判定と通知
  • 対応履歴のログ記録
function handleSupportRequest(userMessage, userId) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const gemini = GeminiApp.init(apiKey);

  // FAQ データベースから関連情報を検索
  const faqData = searchFAQ(userMessage);

  gemini.setSystemInstruction(`
    あなたはカスタマーサポート担当です。
    以下のFAQデータベースを参考に回答してください。

    【FAQ データ】
    ${JSON.stringify(faqData)}

    【ルール】
    1. FAQに該当する回答がある場合は、それを基に回答
    2. 該当がない場合は、一般的なアドバイスを提供
    3. 技術的に複雑な問題は、"ESCALATE" とマーク
    4. 回答の最後に満足度確認を追加

    【出力形式】
    {
      "response": "回答文",
      "escalate": true/false,
      "confidence": 0-100,
      "related_faq_ids": ["FAQ001", ...]
    }
  `);

  const result = gemini.generateContent(userMessage);
  const output = JSON.parse(result.text);

  // ログ記録
  logInteraction(userId, userMessage, output);

  // エスカレーション処理
  if (output.escalate) {
    notifySupport Team(userId, userMessage, output);
  }

  return output.response;
}

function searchFAQ(query) {
  const sheet = SpreadsheetApp.openById(FAQ_SHEET_ID).getSheetByName("FAQ");
  const data = sheet.getDataRange().getValues();

  // 簡易的なキーワードマッチング(本番では Vertex AI Search 推奨)
  return data.filter(row => {
    const keywords = row[2].split(","); // C列:キーワード
    return keywords.some(kw => query.includes(kw.trim()));
  }).map(row => ({
    id: row[0],
    question: row[1],
    answer: row[3]
  }));
}

5-2. 競合モニタリングシステム

定期的に競合の動向を監視し、レポートを自動生成するシステムです。

function dailyCompetitorReport() {
  const competitors = ["CompanyA", "CompanyB", "CompanyC"];
  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const gemini = GeminiApp.init(apiKey, {
    model: "gemini-3-pro",
    tools: [{googleSearch: {}}]  // Grounding 有効化
  });

  gemini.setSystemInstruction(`
    あなたは競合分析のアナリストです。
    Google検索を使用して、指定された企業の最新情報を収集・分析してください。

    分析観点:
    - 新製品・サービスの発表
    - 価格変更
    - 経営陣の異動
    - 資金調達・M&A
    - メディア露出・PR活動
  `);

  const reports = competitors.map(company => {
    const result = gemini.generateContent(`
      ${company}について、過去7日間の重要なニュースや動向を分析してください。

      出力形式:
      {
        "company": "企業名",
        "period": "分析期間",
        "highlights": ["重要ポイント1", "重要ポイント2"],
        "threat_level": "高/中/低",
        "recommended_actions": ["推奨アクション1"],
        "sources": ["情報源URL1", "情報源URL2"]
      }
    `);

    return JSON.parse(result.text);
  });

  // レポートをドキュメントに出力
  generateReport(reports);

  // 重要度が高い場合はSlack通知
  const highPriority = reports.filter(r => r.threat_level === "高");
  if (highPriority.length > 0) {
    sendSlackAlert(highPriority);
  }
}

5-3. 営業資料の自動カスタマイズ

顧客情報に基づいて、提案資料を自動でカスタマイズするシステムです。

function customizeProposal(customerId) {
  // 顧客情報を取得
  const customer = getCustomerData(customerId);

  const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const gemini = GeminiApp.init(apiKey);

  gemini.setSystemInstruction(`
    あなたは営業提案書作成の専門家です。
    顧客情報に基づいて、提案内容をカスタマイズしてください。

    カスタマイズのポイント:
    - 顧客の業界特有の課題に言及
    - 類似企業の導入事例を引用
    - 想定ROIを顧客規模に合わせて調整
    - 顧客の懸念点に先回りして回答
  `);

  const prompt = `
    【顧客情報】
    - 企業名: ${customer.name}
    - 業界: ${customer.industry}
    - 従業員数: ${customer.employees}人
    - 年商: ${customer.revenue}億円
    - 主な課題: ${customer.challenges.join(", ")}
    - 検討状況: ${customer.stage}
    - 競合検討: ${customer.competitors.join(", ")}

    【テンプレート提案書の構成】
    1. エグゼクティブサマリー
    2. 課題認識
    3. ソリューション概要
    4. 導入効果・ROI
    5. 事例紹介
    6. 導入ステップ
    7. 投資概要

    上記テンプレートを、この顧客向けにカスタマイズした提案書を作成してください。
    各セクションで具体的な数値や事例を含めてください。
  `;

  const result = gemini.generateContent(prompt);

  // Google スライドにエクスポート
  createProposalSlides(customer.name, result.text);

  return result.text;
}

第6章:Function Calling とエージェント構築

6-1. Function Calling の基礎

Function Calling は、AI が外部ツールや API を呼び出すための機能です。これにより、AI は情報の取得だけでなく、実際のアクションを実行できるようになります。

Function の定義

const tools = [
  {
    functionDeclarations: [
      {
        name: "get_weather",
        description: "指定された都市の現在の天気を取得します",
        parameters: {
          type: "object",
          properties: {
            city: {
              type: "string",
              description: "都市名(例:東京、大阪)"
            },
            unit: {
              type: "string",
              enum: ["celsius", "fahrenheit"],
              description: "温度の単位"
            }
          },
          required: ["city"]
        }
      },
      {
        name: "send_email",
        description: "指定された宛先にメールを送信します",
        parameters: {
          type: "object",
          properties: {
            to: {type: "string", description: "宛先メールアドレス"},
            subject: {type: "string", description: "件名"},
            body: {type: "string", description: "本文"}
          },
          required: ["to", "subject", "body"]
        }
      },
      {
        name: "search_database",
        description: "社内データベースを検索します",
        parameters: {
          type: "object",
          properties: {
            query: {type: "string", description: "検索クエリ"},
            table: {
              type: "string",
              enum: ["customers", "products", "orders"],
              description: "検索対象テーブル"
            },
            limit: {type: "integer", description: "取得件数上限"}
          },
          required: ["query", "table"]
        }
      }
    ]
  }
];

Function Call の処理フロー

async function handleConversation(userMessage) {
  const response = await gemini.generateContent({
    contents: [{role: "user", parts: [{text: userMessage}]}],
    tools: tools
  });

  const candidate = response.candidates[0];

  // Function Call が要求された場合
  if (candidate.content.parts[0].functionCall) {
    const functionCall = candidate.content.parts[0].functionCall;

    // 実際の関数を実行
    const functionResult = await executeFunction(
      functionCall.name,
      functionCall.args
    );

    // 結果を AI に返して最終回答を生成
    const finalResponse = await gemini.generateContent({
      contents: [
        {role: "user", parts: [{text: userMessage}]},
        {role: "model", parts: [{functionCall: functionCall}]},
        {role: "user", parts: [{
          functionResponse: {
            name: functionCall.name,
            response: functionResult
          }
        }]}
      ],
      tools: tools
    });

    return finalResponse.candidates[0].content.parts[0].text;
  }

  return candidate.content.parts[0].text;
}

async function executeFunction(name, args) {
  switch (name) {
    case "get_weather":
      return await fetchWeatherAPI(args.city, args.unit);
    case "send_email":
      return await sendEmailViaGmail(args.to, args.subject, args.body);
    case "search_database":
      return await queryDatabase(args.query, args.table, args.limit);
    default:
      throw new Error(`Unknown function: ${name}`);
  }
}

6-2. マルチターン Function Calling

複雑なタスクでは、AI が複数の Function を連続して呼び出すことがあります。

// ユーザー: 「東京の天気を確認して、雨なら明日の会議をリスケしてください」

// AI の思考プロセス:
// 1. まず get_weather を呼び出して天気を確認
// 2. 雨の場合、get_calendar で明日の会議を検索
// 3. update_event で会議を変更
// 4. send_notification で参加者に通知

async function handleComplexTask(userMessage) {
  let conversationHistory = [
    {role: "user", parts: [{text: userMessage}]}
  ];

  const maxIterations = 5; // 無限ループ防止

  for (let i = 0; i < maxIterations; i++) {
    const response = await gemini.generateContent({
      contents: conversationHistory,
      tools: tools
    });

    const part = response.candidates[0].content.parts[0];

    // Function Call がない場合は終了
    if (!part.functionCall) {
      return part.text;
    }

    // Function を実行
    const result = await executeFunction(
      part.functionCall.name,
      part.functionCall.args
    );

    // 履歴に追加
    conversationHistory.push(
      {role: "model", parts: [{functionCall: part.functionCall}]},
      {role: "user", parts: [{
        functionResponse: {
          name: part.functionCall.name,
          response: result
        }
      }]}
    );
  }

  throw new Error("Max iterations exceeded");
}

6-3. AI エージェントの構築

Google AI Studio の最新機能であるInteractions APIを使用すると、より高度なエージェントを構築できます。

AI エージェントとは?
単なる Q&A ではなく、目標を達成するために自律的に行動する AI システムです。情報収集、判断、アクション実行を自動で繰り返します。

エージェント設計のパターン

class AIAgent {
  constructor(apiKey, agentConfig) {
    this.gemini = GeminiApp.init(apiKey);
    this.tools = agentConfig.tools;
    this.systemInstruction = agentConfig.systemInstruction;
    this.maxSteps = agentConfig.maxSteps || 10;
    this.memory = [];
  }

  async execute(goal) {
    this.memory.push({role: "user", content: goal});

    for (let step = 0; step < this.maxSteps; step++) {
      // 現在の状況を評価
      const evaluation = await this.evaluate();

      if (evaluation.goalAchieved) {
        return {
          success: true,
          result: evaluation.result,
          steps: step + 1
        };
      }

      // 次のアクションを決定
      const action = await this.plan();

      // アクションを実行
      const result = await this.act(action);

      // メモリに記録
      this.memory.push({
        step: step + 1,
        action: action,
        result: result
      });
    }

    return {
      success: false,
      reason: "Max steps exceeded",
      partialResult: this.memory
    };
  }

  async evaluate() {
    const prompt = `
      【目標】
      ${this.memory[0].content}

      【これまでの行動履歴】
      ${JSON.stringify(this.memory.slice(1))}

      目標は達成されましたか?
      {"goalAchieved": true/false, "reason": "理由", "result": "結果(達成時)"}
    `;

    const response = await this.gemini.generateContent(prompt);
    return JSON.parse(response.text);
  }

  async plan() {
    const prompt = `
      【目標】
      ${this.memory[0].content}

      【利用可能なツール】
      ${JSON.stringify(this.tools.map(t => t.name + ": " + t.description))}

      【これまでの行動】
      ${JSON.stringify(this.memory.slice(1))}

      次に取るべきアクションを1つ決定してください。
      {"tool": "ツール名", "args": {引数}, "reasoning": "理由"}
    `;

    const response = await this.gemini.generateContent(prompt);
    return JSON.parse(response.text);
  }

  async act(action) {
    return await executeFunction(action.tool, action.args);
  }
}

// 使用例
const salesAgent = new AIAgent(API_KEY, {
  tools: [searchCRM, sendEmail, scheduleCall, updateDeal],
  systemInstruction: "あなたは営業支援エージェントです...",
  maxSteps: 8
});

const result = await salesAgent.execute(
  "株式会社ABCの田中様にフォローアップして、次回商談をスケジュールしてください"
);

まとめ:中級者から上級者への道

本記事では、Google AI Studio をビジネスの現場で活用するための実践テクニックを解説しました。

本記事のポイント

第1章:プロンプトエンジニアリング

  • CRISP フレームワークで System Instructions を設計
  • Few-shot で出力品質と一貫性を向上
  • Chain of Thought / Tree of Thoughts で複雑な推論に対応

第2章:Structured Output × Grounding

  • JSON Schema で出力を構造化し、後続処理を効率化
  • Search Grounding で最新情報をリアルタイム取得
  • Dynamic Retrieval で検索コストを最適化

第3章:Google Apps Script 連携

  • GeminiApp ライブラリで簡単セットアップ
  • スプレッドシート自動分類、メール下書き、議事録生成の実装例

第4章:API 本格活用

  • バッチ処理でエラーハンドリングとリトライを実装
  • Context Caching で入力コスト75%削減

第5章:ビジネスユースケース

  • カスタマーサポート Bot の構築
  • 競合モニタリングシステムの自動化
  • 営業資料の顧客別カスタマイズ

第6章:Function Calling とエージェント

  • 外部ツールとの連携で AI の行動範囲を拡大
  • 自律型 AI エージェントの設計パターン

次のステップ

中級編をマスターしたら、次は上級編で以下のトピックに挑戦しましょう:

  • Vertex AI との連携:エンタープライズグレードのセキュリティと可用性
  • カスタムモデルのファインチューニング:自社データで Gemini を最適化
  • マルチモーダルエージェント:画像・動画・音声を統合した高度なシステム
  • MCP(Model Context Protocol):標準化されたツール連携プロトコル

Google AI Studio は、アイデアを素早く形にし、ビジネス価値を創出するための最高のプラットフォームです。本記事の実践例を参考に、ぜひ自社の課題解決に活用してください。

AI開発・導入のご相談はAQUA合同会社へ

「何から始めればいいか分からない」「費用感を知りたい」など、AI導入に関するご相談を無料で承っております。
大手SIerのような高額な費用は不要。経験豊富なエンジニアが直接対応します。

メール: お問い合わせフォームをご利用ください

この記事をシェア