はじめに
この記事は 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を作る
slackの管理者権限のあるワークスペースは持っている前提で進めています。
もってない方は公式を参考に作成してください。
Slackアプリを登録する
-
Slack APIへアクセスし、
Create New App
をクリックしてアプリ名と対象のワークスペースを選択します。 -
作成したAppにスコープを追加します。左のメニューから
OAuth & Permissions
を選択し、ページ下部のScope
の欄に画像のように権限を追加します。
後でGASを作成する際に使うので、OAuthToken
をメモしておきます。(②)
-
Install App
へ遷移しInstall to Workspace
を選択します。
これでWorkspaceに作成したAppがインストールされます。
GPT-3のAPIをcallするGASを作成する。
-
GASのhomeに行き、新しくプロジェクトを作成します。
-
GAS to Slack を行ってくれるライブラリを追加します。
メニューからライブラリ欄の+
を選択します。
表示されたウィンドウでスクリプトIDに
1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq
と入力して検索し、出てきたSlackApp
を追加します。
-
コーディングとデプロイ
// 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する設定を追加する
-
Slackのワークスペースのカスタマイズページでhookイベントを作成します。
slack app directory ページの検索欄にoutgoing
と入力して検索しOutgoing Webhook
が表示されるので選択します。
Slackに追加
を選択すると設定項目ページへ遷移します。
-
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敗)
一昔前のりんなちゃんくらいの精度はあるんじゃないかな...?
さいごに
API提供されてると自分で環境を作る必要もないし、モデル作る必要もないしで楽ですね。いい世の中だぁ
OutgoingWebhook、使ってしまったけどSlack的に新APIへ移行しているようで非推奨っぽいのでそっちに寄せなきゃ...
明日は未定ですがきっと誰か書いてくれるでしょう!楽しみですね