GPT-3 + GASで作るSlackbot


はじめに

この記事は paiza Advent Calendar 2021 9日目の記事です。

こんな感じで会話ができるようになります。優秀。

👈 @imaimai17468さんの前日の記事はこちら

GPT-3について

GPT-3とはOpenAIが開発した文章生成言語モデルです。

公式はこちら

リリースされた当時は日本語は対応していませんでしたが、現在は日本語も文章生成をすることができます。

文章生成のうちで自然言語ではなくプログラムコーディングに関する部分をAPIとして切り出したのがOpenAI Codexで、

さらにGithub(Microsoft)が管理しているのがGithub Copilotです。
エンジニア各位が性能を体感するのに一番手っ取り早いのがCopilotを利用することだと思います。

Copilotはすごい、やばい(語彙消失)

今回は自然言語の方を体感するためにSlackbotを作ってみます。

OpenAIに登録する

こちらから登録できます。
つい先日までwaitlistに登録して登録時に利用目的やユーザーの身分登録が必要だったのですが、
11/18にwaitlistなしで登録できるようになりました

前は利用目的や申請者の情報登録が必要だったんですが...緩くなりましたね

※APIの利用は無料枠の設定があり、超過すると有料になるので注意してください。

ログイン後にAPIを利用するためのAPI KEYを作成します。
ログイン後のヘッダー右のドロップダウンメニューからView API keysを選択します。

その後Create new secret keyをクリックし、新たにAPI KEYを作成します。このAPI KEYは後で使うのでメモしておいてください。 (①)

Slackbotを作る

3分で書いた今回の構成図はこちら

slackの管理者権限のあるワークスペースは持っている前提で進めています。
もってない方は公式を参考に作成してください。

Slackアプリを登録する

  1. Slack APIへアクセスし、Create New Appをクリックしてアプリ名と対象のワークスペースを選択します。

  2. 作成したAppにスコープを追加します。左のメニューからOAuth & Permissionsを選択し、ページ下部のScopeの欄に画像のように権限を追加します。


    後でGASを作成する際に使うので、OAuthTokenをメモしておきます。(②)

  3. App Homeへ遷移し、Editを選択しSlackbotとして投稿する際の名前を設定します。

  4. Install Appへ遷移しInstall to Workspaceを選択します。
    これでWorkspaceに作成したAppがインストールされます。

GPT-3のAPIをcallするGASを作成する。

  1. GASのhomeに行き、新しくプロジェクトを作成します。

  2. GAS to Slack を行ってくれるライブラリを追加します。
    メニューからライブラリ欄の+を選択します。

    表示されたウィンドウでスクリプトIDに
    1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bqと入力して検索し、出てきたSlackAppを追加します。

  3. コーディングとデプロイ

// slackに投稿する
function postSlack(e) {

  const outGoingWebHookToken = 'YOUR_OUTGOING_WEBHOOK_TOKEN'
  const slackBotToken = 'YOUR_SLACKBOT_TOKEN'

  let app = SlackApp.create(slackBotToken);

  if (outGoingWebHookToken != e.parameter.token) {
    console.log('invalid token');
    return
  }

  array = e.parameter.text.split(' ');  
  let message = '';
  if (array.length > 1) {
    message = getGpt3Message(array[1]);
  }

  return app.postMessage('#YOUR_CHANNEL', message , {
  });
}

// gpt-3のAPIをcallしてresponseを得る
function getGpt3Message(message) {
  var uri = 'https://api.openai.com/v1/engines/davinci/completions';

  var headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-type': 'application/json'
  };

  var options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'prompt': 'Human: ' + message + '\nAI: ', 
      'max_tokens': 30, 
      'temperature': 0.9, 
      'frequency_penalty': 0, 
      'presence_penalty': 0.6, 
      'stop': ['\n', ' Human:', 'AI: ']})
  };
  try {
      const response = UrlFetchApp.fetch(uri, options);
      var json=JSON.parse(response.getContentText());
      return json["choices"][0]["text"];
  } catch(e) {
    console.log('error');
  }
}

コピペしてもらえれば後はTOKENやAPI KEYを書き換えるだけで動きます。(後述します)
コードの細かい説明は省きます。GPT-3のAPIをcallする際にいくつかparameterを設定できるのでよければ調べてください。(APIリファレンス)

ここまで完了したらアプリをデプロイします。右上の デプロイ→新しいデプロイ を選択します。

デプロイの種類をウェブアプリに設定しデプロイします。デプロイ後、ウェブアプリのURLが発行されますが後で使うのでメモします。(③)

Slackの投稿をhookする設定を追加する

  1. Slackのワークスペースのカスタマイズページでhookイベントを作成します。

    slack app directory ページの検索欄にoutgoingと入力して検索しOutgoing Webhookが表示されるので選択します。

    Slackに追加を選択すると設定項目ページへ遷移します。

  2. hookイベントの設定をします。
    URL欄にGASのウェブアプリURL(③のこと)を入力します。
    引き金となる言葉は指定した文字列で開始した際にこのイベントがhookされるようになるので、任意に設定してください。(botへのメンションにしておくと都合がよいと思います)
    トークンはこの後で使うのでメモしておいてください。(④)

GASのsecret parameterを設定する

GAS作成時に飛ばしていたparameterを設定します。

YOUR_OUTGOING_WEBHOOK_TOKEN // ④
YOUR_SLACKBOT_TOKEN // ②

YOUR_CHANNEL // メッセージを投稿するslack channel名

YOUR_API_KEY // ①

設定が完了したら保存します。

これで完成です。

会話してみた

それっぽいレスポンスをもらえたのを出してみました

クッソ快晴だった、はずれ(1敗)


パワポケRはクソゲーではありません


代わりに働いてほしい


尾道駅か?

一昔前のりんなちゃんくらいの精度はあるんじゃないかな...?

さいごに

API提供されてると自分で環境を作る必要もないし、モデル作る必要もないしで楽ですね。いい世の中だぁ

OutgoingWebhook、使ってしまったけどSlack的に新APIへ移行しているようで非推奨っぽいのでそっちに寄せなきゃ...

明日は未定ですがきっと誰か書いてくれるでしょう!楽しみですね