GASでChatGPTのAPIリクエスト方法!文脈に沿った応答のサンプルコードを解説

2023年3月2日より、ChatGPTのAPIが一般公開されて利用できるようになりました。

ChatGPTのAPIを使えば、OpenAIの従来の文章生成APIではできなかった文脈に応じた応答を返すことが可能です。

そこで、Google Apps Script(GAS)を使って、ChatGPTのAPIにリクエストして文脈に沿った応答を受け取る方法をサンプルコードでわかりやすく解説します。

ChatGPTのAPIがついに3/2一般公開

ChatGPTのAPIが日本時間2023年3月2日に一般公開されました。

ChatGPTのAPIについては約1ヶ月半前の2023年1月17日にリリース予定との発表がありました。

特にウェイトリストに登録したユーザーから順次という形ではなく、日本では一斉にChatGPTのAPIが利用できるようになりました。

ChatGPTのAPIをGASで利用

ChatGPTのAPIを試したい場合にオススメなのが、Google Apps Script(GAS)です。

GASは無料で利用できるスクリプトサービスで、トリガー実行やスプレッドシートやGoogleドキュメントと連携できるメリットがあります。

LINEやSlackでのAIチャットボットや、ちょっとしたアプリケーションを試作するのに便利です。

そこで、GASでChatGPTのAPIを利用する方法を初心者向けに解説します。

ChatGPTのAPI利用登録とAPIキー発行

ChatpGPTのAPIを利用するにはOpenAIへの利用登録とAPIキー発行が必要になります。

ChatGPTのAPIは従来のOpenAIのAPIサービスの1つとなっているため、利用登録とAPIキー発行手順は従来と同じです。

※OpenAIのAPI利用登録とAPIキーの発行方法は以下の記事で解説しています。

メールアドレスと携帯電話番号さえあれば解説記事の手順に従って、OpenAIに会員登録して、APIキーを発行して利用できます。

※3ヶ月間利用可能な$18ドル分のクレジットが付与されます。

APIキーの発行ができたら、Google Apps Script(GAS)でAPIキーを使用するので、メモ帳などに控えておきましょう。

ChatGPTのAPIのメッセージのロールは3種類

ChatGPTのAPIパラメータでは、投稿メッセージ内容に加えて、3種類のロールを設定します。

  1. ユーザーロール
  2. アシスタントロール
  3. システムロール

ユーザーロールは、ChatGPTの利用者に当たる役割です。

ユーザーロールが設定されたメッセージはChatGPTの利用者が投稿した文章になります。

一方アシスタントロールは、ChatGPTの応答AIに当たる役割です。

アシスタントロールが設定されたメッセージはChatGPTの応答AIが返答した文章になります。

システムロールは、初回実行時などにフォーマットとしてアシスタントに指示する役割です。

ChatGPTのAPIでAIチャットボットを作る場合に、どんなユーザーからの投稿の場合も、システムロールでChatGPTに振る舞いについて初期設定します。

これによって、「毎回語尾に特定ワードをつける」や「前提条件を設けた上でChatGPTに回答させる」といった挙動が可能です。

ユーザーロール、アシスタントロール、システムロールは文章の説明だけではわかりにくいので、実際にサンプルコードを動かして確認してみます。

GASでChatGPTのAPIを実行する事前準備

Google Apps Script(GAS)でChatGPTのAPIをリクエストするにあたって、事前準備があります。

GASスクリプトプロパティに前述した手順で取得したChatGPTのAPIキーを設定することです。

APIキーはGASスクリプトに直書きすることもできますが、スクリプトをGithubなどで管理する際に流出する恐れがあります。

そのため、GASではスクリプトプロパティにAPIキーを格納して、コードからスクリプトプロパティを読み込むのがオススメです。

1.GASスクリプトエディタを開いたら、左メニューにある「プロジェクトの設定」をクリックします。

2.プロジェクトの設定画面をスクロールするとスクリプトプロパティの項目が表示されるので、「スクリプトプロパティを追加」を選択します。

3.プロパティに「APIKEY」と入れて、値に事前に取得したChatGPTのAPIキーをコピペし、「スクリプトプロパティを保存」をクリックします。

以上でスクリプトプロパティにChatGPTのAPIキーを追加し、GASコードから呼び出せるようになったので完了です。

左メニューにあるエディタを表す「<>」アイコン、GASのスクリプトエディタに戻ることができます。

ChatGPTのAPIを叩くGASサンプルコード①

まずは最もシンプルな形でChatGPTのAPIを叩くGASサンプルコードを解説します。

ユーザーロールのみ単体投稿をAPI経由で送り、ChatGPTのAPIの応答結果をログ出力するサンプルコードです。

function requestChatCompletion() {
  //スクリプトプロパティに設定したOpenAIのAPIキーを取得
  const apiKey = ScriptProperties.getProperty('APIKEY');
  //ChatGPTのAPIのエンドポイントを設定
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  //ChatGPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
  const messages = [{'role': 'user', 'content': 'Google Apps Scriptの活用事例を教えてください'}];
  //OpenAIのAPIリクエストに必要なヘッダー情報を設定
  const headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  //ChatGPTモデルやトークン上限、プロンプトをオプションに設定
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens' : 1024,
      'temperature' : 0.9,
      'messages': messages})
  };
  //OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
  //ChatGPTのAPIレスポンスをログ出力
  console.log(response.choices[0].message.content);
}

まず、事前に設定したChatGPTのAPIキーをスクリプトプロパティから読み込みます。

次にChatGPTのAPIのエンドポイント(URL)である「https://api.openai.com/v1/chat/completions」を定義します。

roleとcontentが設定されたオブジェクトの配列として定義し、roleはuser、contentにChatGPTに応答してほしいプロンプトをセットします。

APIリクエストに必要なAPIキーを含めたヘッダー情報を定義します。

modelにChatGPTのモデルである「gpt-3.5-turbo」や、最大トークン数、投稿の創造性を調整するtemperature(0-1.0まで選択、1に近づくほど創造性が高まる)を設定します。

GASコード内で一通りのAPIに関する定義ができたら、UrlFetchAppでAPIリクエストし、応答結果のJSONデータをオブジェクトに変換し、ChatGPTのAPI経由での応答文をログ出力します。

※ChatGPTのAPIリクエスト結果のresponseでは、「response.choices[0].message.content」に投稿文が格納されています。

GASスクリプト「requestChatCompletion」関数を実行すると、実行ログにChatGPTのAPIからの応答結果が出力されます。

※GASのスクリプト初回実行時は承認作業が必要になるので、以下の記事を参考に許可してください。

このようにChatGPTをブラウザで実行しなくても、APIへリクエストして応答結果をGASスクリプト経由で取得することができました。

ChatGPTの文脈に沿った応答を返すGASサンプルコード②

先程のGoogle Apps Script(GAS)のサンプルコードはChatGPTのAPIにリクエストできましたが、ChatGPTの特徴である「文脈に沿った」応答を返すことができません。

ChatGPTのAPIのパラメータとして設定したmessagesには役割ごとの複数メッセージを配列で設定できます。

過去のChatGPTへの投稿文と応答文をセットしておくことで、文脈に沿った回答が可能になります。

function requestChatCompletionV2() {
  //スクリプトプロパティに設定したOpenAIのAPIキーを取得
  const apiKey = ScriptProperties.getProperty('APIKEY');
  //ChatGPTのAPIのエンドポイントを設定
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  //ChatGPTに投げるメッセージを定義(過去のやり取りも含めた形)
  const messages = [
    {'role': 'user', 'content': '日本で最も人口の多い都市はどこですか?'},
    {'role': 'assistant', 'content': '東京です。'},
    {'role': 'user', 'content': 'その次はどこですか?'},
    {'role': 'assistant', 'content': '横浜市です。'},
    {'role': 'user', 'content': 'その次はどこですか?'},
  ];
  //OpenAIのAPIリクエストに必要なヘッダー情報を設定
  const headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  //ChatGPTモデルやトークン上限、プロンプトをオプションに設定
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens' : 1024,
      'temperature' : 0.9,
      'messages': messages})
  };
  //OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
  //ChatGPTのAPIレスポンスをログ出力
  console.log(response.choices[0].message.content);
}

GASのサンプルコードはほとんど同じで、messages定数定義の部分が変わっています。

「日本の人口が最も多い都市はどこか?」という質問の回答として、「東京」と受けたあと、「その次はどこか?」という質問を投稿しています。

「その次はどこか?」という質問は前段の文脈が理解できていなければ回答できない質問です。

そうした過去のChatGPTへの投稿文をユーザーロールで設定し、ChatGPTの応答文をアシスタントロールで定義することで、文脈に沿った回答をChatGPTのAPIは返してくれます。

GASサンプルコードを実行すると、「大阪市」と文脈に沿った回答が返ってきました。

予めシステムがルールを設定するGASサンプルコード③

最後は、ChatGPTのAPIにリクエストする際に設定できるシステムロールでのメッセージです。

前段のGoogle Apps Script(GAS)のサンプルコードのmessagesの定義を下記に変更します。

  //ChatGPTに投げるメッセージを定義(冒頭にシステムロールでフォーマットを設定)
  const messages = [
    {'role': 'system', 'content': '語尾は80%の確率でニャン、20%の確率でシャーをつけてください。'},
    {'role': 'user', 'content': '元気が出ないので励ましてください。'},
  ];

このようにuserロールではなく、systemロールでチャット応答に対するルールや取り決めを設定できます。

GASスクリプトを実行すると、systemロールで指示したルールにしたがって、応答結果が返却されています。

systemロールはuserロールでも代替できそうですが、コードを読む際にsystemロールでメッセージを送れば、「ChatGPT応答ルールを定義している」と分かるので可読性が高くなります。

このように、userのメッセージを送るだけでなく、過去のChatGPTのやり取りやシステムロールのメッセージも利用することで、ChatGPTのAPIを使いこなすことができます。

まとめ・終わりに

今回、ChatGPTのAPIをGoogle Apps Script(GAS)でリクエストする方法を紹介しました。

OpenAIのAPI利用登録とAPIキーを発行すれば、GASスクリプトから簡単にAPIを叩いて、ChatGPTの応答結果を得ることができます。

ChatGPTのAPIでは、これまでのOpenAIのAPIと異なり、過去のChatGPTへの投稿文や応答文のやり取りをセット可能です。

そうした過去のChatGPTのやり取りを付与してAPIリクエストすることで、文脈に沿った応答結果が得られます。

さらに、システムロールを使って、ChatGPTの振る舞い方を事前に設定することもできます。

GASを使えば、ChatGPTのAPIを簡単に試すことができます。

ぜひ今回紹介したサンプルコードを改良して活用してみてください。