Google Apps Script を使用してChatGPTとGoogle スプレッドシートを接続する

スポンサーリンク

Google Apps Script を使用してChatGPTとGoogle スプレッドシートを接続してみます。

今回はGoogle スプレッドシートと Google Apps Script にアクセスする必要がありますので、Googleアカウントを事前に取得しておく必要があります。またOpenAI API キーを取得する必要があります。

■新しいGoogleスプレッドシートを作成する

まずは新しいGoogleスプレッドシートを作成します。作成のために、今回はWebブラウザで「個人向けのクラウド ストレージおよびファイル共有(https://www.google.com/intl/ja_jp/drive/)」にアクセスし、Webサイト上の「ドライブを開く」ボタンをクリックします。

クリックすると、左側に「+新規」ボタンがありますので、こちらをクリックします。

クリックするとプルダウンメニューが表示されメニューから「Googleスプレッドシート」をクリックします。クリック後、さらにメニューが表示されこの中から「空白のスプレッドシート」をクリックします。

クリックすると新しいページに移動し、移動後「無題のスプレッドシート」が作成されます。これで新しい Google スプレッドシートの作成は完了となります。

■新しいGoogleスクリプトを作成する

作成後、新しいGoogleスクリプトを作成します。

作成するために、作成したスプレッドシートのメニューから「拡張機能」をクリックします。クリックするとプルダウンメニューが表示されます。このメニュー内に「Apps Script」がありますので、こちらをクリックします。

クリックすると「Apps Script」の「無題のプロジェクト」が作成されます。これで新しいGoogleスクリプトを作成する準備が完了となりました。

■ChatGPT API に接続する

完了後、「ファイル」の「コード.gs」にChatGPT API に接続するスクリプトを書いていきます。

■コード

function myFunction() {
  var apiKey = "取得したOpenAI API キー";
  var endpoint = "https://api.openai.com/v1/engines/davinci/completions";
  var text = "織田信長とはどんな人物ですか?"
  var payload = {
    "prompt": text,
    "max_tokens":1024,
    "stop": "."
  };
  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + apiKey
    },
    "payload": JSON.stringify(payload)
  };
  var response = UrlFetchApp.fetch(endpoint, options);
  var json = response.getContentText();
  var data = JSON.parse(json);
  var sheet = SpreadsheetApp.getActiveSheet();
      sheet.appendRow([text, data.choices[0].text]);
}

今回はGoogle ScriptのUrlFetchAppを使って、ChatGPT APIに対してテキストを送信し、応答を受け取り、それをスプレッドシートに保存します。

なお、payload変数を宣言し、変数内に引数,パラメータとしてmax_tokens(生成する文章の最大単語数)を渡していますが、「2048」に設定すると下記のエラーが出力されました。

Exception: Request failed for https://api.openai.com returned code 400. Truncated server response: {
"error": {
"message": "This model's maximum context length is 2049 tokens, however you requested 2072 tokens (24 in your prompt; 2048 for t... (use muteHttpExceptions option to examine full response)

”例外です。https://api.openai.com のリクエストに失敗し、コード 400 が返されました。サーバーの応答は切り捨てられています。{
"エラー": {
"message": { "メッセージ": "このモデルの最大コンテキスト長は2049トークンですが、あなたは2072トークンを要求しました(あなたのプロンプトでは24、t...では2048トークンです)。(muteHttpExceptions オプションを使用すると、レスポンス全体を確認することができます。)”
Question regarding max_tokens
If I lower the max_tokens value in my request, does GPT-3 generate shorter but complete texts, or does it just cut off t...
Just a moment...

そのため、「1024」と設定しています。

■実行・検証

スクリプトを書いた後に実行・検証を行います。「コード.gs」のコード編集画面上部に「実行」の文字がありますので、こちらをクリックします。

クリックすると、「承認が必要です」というポップアップが表示されますので、ポップアップ内の「権限を確認」ボタンをクリックします。

クリックすると、「Googleアカウント ログイン(OAuth2.0,認可を行うためのプロトコル)」ページが表示されます。ページ内では「アカウントの選択」でお持ちのGoogleアカウントが表示されていますので、こちらのアカウントを選択します。

選択すると、別のページが表示されページ内に「このアプリは Google で確認されていません」、「アプリが、Google アカウントのプライベートな情報へのアクセスを求めています。デベ ロッパー ( ”お持ちのGoogleアカウント”) と Google によって確認されるまで、このアプリ を使用しないでください。」と表示されていますので、このページ内の「詳細」の文字をクリックします。

クリックすると、「リスクを理解し、デベロッパー( ”お持ちのGoogleアカウント”)を使用できる場合のみ、続行してください。」とページ内に追加の文章が表示され、その下に「無題のプロジェクト(安全ではないページ)に移動」と文字がありますので、こちらをクリックします。

クリックすると、別のページが表示され「無題のプロジェクトがGoogleアカウントへのアクセスをリクエストしています。」などの文章が表示されます。このページの下に「許可」ボタンがありますので、こちらをクリックします。これで無題のプロジェクト(今回はGoogle Scriptを使って、ChatGPT APIに対してテキストを送信し、応答を受け取り、それをスプレッドシートに保存するというプロジェクト)に対して「Googleスプレッドシートのすべてのスプレッドシート参照、編集、作成、削除」を許可します。

許可すると、「Apps Script」の「コード.gs」のコード編集画面の下にある「実行ログ」に「実行開始」と出力され、しばらくすると「実行完了」と出力されます。

出力後、作成したスプレッドシートを確認すると、ChatGPTに対してpromptで指示(今回は「織田信長とはどんな人物ですか?」というもの)を与えているのでその指示に対して回答がスプレッドシート上に保存されていることを確認できました。

確認後、ChatGPTからの今回の回答を確認しましたが、日本語の文章として意味をなしていないことがわかります。

これを改善するために、payload変数を宣言し、変数内に引数,パラメータとしてtemperature(生成する応答の多様性)を渡してみることにしました(https://beta.openai.com/docs/api-reference/completions/create#completions/create-temperature)。temperatureの値が高いほど、モデルがより多くのリスクを負うことを意味し、明確な答えとなります。もしくは変数内に引数,パラメータとしてtop_p(https://beta.openai.com/docs/api-reference/completions/create#completions/create-top_p) を追加し変更することをOpenAI APIでは推奨しているが、temperatureとtop_pの両方を変更することは推奨していない。

■コード(修正版)

function myFunction() {
  var apiKey = "取得したOpenAI API キー";
  var endpoint = "https://api.openai.com/v1/engines/davinci/completions";
  var text = "織田信長とはどんな人物ですか?"
  var payload = {
    "prompt": text,
    "max_tokens":1024,
  "temperature" : 0.5,
    "stop": "."
  };
  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + apiKey
    },
    "payload": JSON.stringify(payload)
  };
  var response = UrlFetchApp.fetch(endpoint, options);
  var json = response.getContentText();
  var data = JSON.parse(json);
  var sheet = SpreadsheetApp.getActiveSheet();
      sheet.appendRow([text, data.choices[0].text]);
}

修正版ではtemperatureの値を「0.5」と設定し、このスクリプトを保存。保存後、実行・検証してみます。

実行・検証後、スプレッドシートで保存されたChatGPTからの回答を確認すると修正前とは異なり、日本語の文章として、同じ文章を生成しているものの意味をなしていることが確認できました。

コメント

タイトルとURLをコピーしました