Google スプレッドシートでGemini やGPT-4 等、複数の生成AIモデル の生成結果を比較するGASを書いてみた

2024年3月28日掲載

Google 生成AI

生産性向上は、個人や企業にとって永遠のテーマです。多くの人は、より効率的に仕事を進め、成果を上げたいと考えています。もちろん多くの企業も生産性をあげるためにさまざまな取り組みを行っています。社員のモチベーション管理、スキル向上やツールの活用がその取り組みの例となります。

生成AI の時代が来ていて、さらに生成AI を活用して何かを取り組もうと考えているが、どの生成AI を使えばよいのか、どのモデルがいいのか、どのように比較してみればいいのかよくわからない、といった場面がありませんか。

今回はGoogle スプレッドシートで簡単にさまざまな生成AI モデルの生成結果を比較してみるGoogle Apps Script(以下、GAS)を書いてみたので、その方法を紹介します。

目次

対象の生成AI モデル

今回取り上げる生成AI モデルは、Google 社とMicrosoft 社の生成AI モデルです。料金についてはここでは触れませんので、ご興味がありましたらお気軽に弊社までお問い合わせください。

  • Gemini
    Google DeepMind によって開発されたマルチモーダル大規模言語モデルのファミリーです。PaLM2 の後継として位置づけられ、テキスト、画像、音声など、さまざまな種類のデータを取り扱うことができる、マルチモーダルAIモデルです。自然言語処理や音声認識のほかに、「マルチモーダル」こそ、Gemini の大きな特徴となり、テキスト、画像、音声など、さまざまな種類のデータを使ってマルチモーダル検索を行うことができます。
  • PaLM 2
    Google AI が開発した大規模言語モデルです。PaLM 2 は、100 以上の言語にわたる多言語テキストに、より重点をおいて学習しているモデルとなっています。自然言語処理はもちろん、Python、JavaScript などのプログラミング言語でコード生成することも可能です。
  • GPT-4
    OpenAI によって開発された、大規模なマルチモーダル モデル (テキストまたは画像の入力を受け入れ、テキストを生成可能) であり、Azure OpenAI Service で利用可能です。GPT-3.5 Turbo と同様に、GPT-4 はチャット用に最適化されており、従来の補完タスクでも適切に動作します。なお、 GPT-4 Turbo with Vision は、画像入力を受け入れる GPT-4 のバージョンです。
  • GPT-3.5
    GPT-4と同様、OpenAI によって開発された、自然言語とコードを理解および生成できます。 GPT-3.5 ファミリで最も能力とコスト効率の高いモデルは GPT-3.5 Turbo で、チャット用に最適化されており、従来の補完タスクでも適切に動作します。

構成図

構成はとても簡単です。スプレッドシートの指定したセルにプロンプトを記載、そのプロンプトをもとに各生成AI モデルが返したレスポンスをスプレッドシートに書き込むといった流れになります。

Google スプレッドシートでGemini やGPT-4 等、複数の生成AI モデルを比較する構成図

事前準備

まず、各生成AI モデルを利用するための事前準備を行います。

Gemini と PaLM 2 モデルを利用するために、Google Cloud プロジェクトとモデルにアクセスするための認証(アクセストークン)が必要です。
参考:Gemini API / テキスト用のPaLM 2

ちなみに、Google AI Studio からAPIキーを発行してモデルにアクセスする方法もあります。
参考:Google AI Studio のクイックスタート

GPT-4 とGPT-3.5 を利用するためには、Azure 上でリソースを作成し、モデルをデプロイする必要があります。
参考: Azure OpenAI Service リソースを作成してデプロイする

実装例

Gemini と GPT-4 にリクエスト送信しレスポンスを取得する流れを参考例として記載します。PaLM 2 と GPT-3.5 も同じ方法ですので、ここでは割愛します。

Gemini 実装例

function requestGemini(prompt) {

  if (!prompt) {
    return "回答取得できませんでした"
  }

  const url = `https://{REGION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/publishers/google/models/gemini-1.0-pro:streamGenerateContent`; //REGIONとPROJECT_IDを適切な値に変更してください

  requestBody = {
    "contents": [
      {
        "role": "user",
        "parts": [
          {
            "text": prompt
          }
        ]
      },
    ],
    "generationConfig": {
      "temperature": number, //numberを適切な値に変更してください
      "topP": number, //numberを適切な値に変更してください
      "topK": number, //numberを適切な値に変更してください
      "candidateCount": integer, //integerを適切な値に変更してください
      "maxOutputTokens": integer, //integerを適切な値に変更してください
      "stopSequences": [
        string, //stringを適切な値に変更してください
      ]
    }
  }

  const requestOptions = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + アクセストークン //アクセストークンを必要な値に変更してください
    },
    "payload": JSON.stringify(requestBody),
    "muteHttpExceptions": true,
  }

  const obj = JSON.parse(UrlFetchApp.fetch(url, requestOptions).getContentText());

  let answer = "";
  if (obj.candidates.length > 0 && obj.candidates[0].content.parts.length > 0) {

    for (let data of obj) {
      answer += data.candidates[0].content.parts[0].text;
    }
  }
  else {
    answer = "回答取得できませんでした"
  }

  return answer
}


GPT-4 実装例

function requestGPT4(prompt) {

  if (!prompt) {
    return "回答取得できませんでした";
  }

  const url = `https://{リソース名}.openai.azure.com/openai/deployments/{モデルデプロイ名}/chat/completions?api-version=2023-05-15`; //リソース名とモデルデプロイ名を適切な値に変更してください

  requestBody = {
    "model": model,
    "messages": [
      {
        "role": "user",
        'content': prompt
      }
    ],
    "temperature": number, //numberを適切な値に変更してください
    "top_p": number, //numberを適切な値に変更してください
    "max_tokens": integer, //integerを適切な値に変更してください
  }

  const requestOptions = {
    "method": "POST",
    "headers": {
      "Content-Type": "application/json",
      "api-key": APIキー
    },
    "payload": JSON.stringify(requestBody)
  };

  const obj = JSON.parse(UrlFetchApp.fetch(url, requestOptions).getContentText());
  let answer = obj.choices[0].message.content.trim();

  return answer;
}

動かしてみる

動かす前に、まず今回スプレッドシートで実装した動作仕様を簡単に紹介します。
A列〜C列は入力値です。


E列〜I列は生成AI から取得したレスポンスです。
スプレッドシートの【実行】>【レスポンス取得】 ボタンをクリックすると、Outputの値がスプレッドシートの該当列に書き込まれるように実装しています。

それでは実際のスプレッドシートで動かしてみたいと思います!
今回は以下の条件でリクエスト送信し、レスポンスを取得します。

<条件>
・カテゴリ:翻訳
・プロンプト:
以下の文書をわかりやすい日本語に表現してください
SDGs Actions: Providing Connectivity from the Sky to Enhance Education in Africa(*)

(*) 引用元:SoftBank Newsのタイトル

<結果>
スプレッドシートの実行>レスポンスを取得 ボタンをクリックするとE列〜から順次生成AI より取得した値が書き込まれます。
今回はカテゴリを「翻訳」にしたので、I列にGoogle翻訳を使った文書も書き込まれました。

複数の生成AIでの回答の比較


まとめ

いかがでしょうか。
生成AI に「わかりやすい日本語に表現してください」というリクエストをしたところ、単純な翻訳だけでなく、追加の説明文書も生成してくれましたね。

個人的な所見ではありますが、試してみた中で、わかりやすい日本語に表現する能力は、Gemini に比べPaLM 2 の方がよかったり、GPT-4 に比べGPT-3.5 の方がよかったりする場合も結構ありました。

世の中どんどん新しいモデルや、最新モデルが日々出ていく中、これからは複数のモデルを上手に使い分ける時代です必ずしも最新モデルがどの領域でも優秀とは限らないので、必ず自分の要件で事前検証することが一番重要だと思います。

もちろん、コンシューマ向けのGemini(旧Bard)やChatGPT 、そしてエンタープライズ向けのVertex AI Studio 等からも、同じプロンプトを投げるとそれぞれレスポンスを取得できます。

ですが、今回のようにさまざまな生成AI でレスポンスを得て簡単に結果や精度を試してみたい時は、それぞれのツールで複数回実行しないといけない点は手間がかかりますね。

ほかにも、生成AI は適切な指示を与えなければ、望む結果を得られない可能性があるため、プロンプトエンジニアリングを行う際も、本仕組みが役に立つのではと思っています。

生成AI の利用を検討しているが、どのモデルがよいか、どんなプロンプトがよいか迷っているなら、ぜひ試してみてはいかがでしょうか。

当社で新たにリリースした「Vertex AI DIYプラン」をご紹介して終わりにします。Vertex AI Search では生成AI を使った検索を体験できるほか、どのモデルを使うかも選ぶことができます。


Vertex AI DIYプランについて

Vertex AI Search を使って社内文書を検索する生成AIを構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。

Vertex AI DIYプランでは、以下の3つのことをご体験いただけます。
詳細は、関連サービスにある「Vertex AI DIYプラン」をご確認ください。

Vertex AI DIY プラン


関連サービス

Vertex AI DIYプラン

Vertex AI Search を使って社内文書を検索する生成AIを構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。
Google の生成AIの導入を考えている方はもちろん、どのようなものか確認したいという方でもご活用いただけます。

Google Cloud

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません