Slack上でChatGPTと会話するためのSlackBotを作る比較的簡単な方法（API使用）

# Slack上でChatGPTで生成された文章を見たい！

という遊び人向けのTips。
出来ると下記のような会話ができる。レスポンスが早くて感動する。
![FqYQVyFaEAA5HKT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40132/47fd5a02-5a12-20c4-b334-7afca74ac9b9.jpeg)
[OpenAI](https://openai.com/)のGPT-3.5-turboというChat Completion APIが公開されて数日。すでに良い記事があるが、あまり難しくない方法で出来た。
他の記事との違いは、
* Slackアプリを簡単に作るSlack公式のBoltフレームワークのうち、javascriptではなくpythonでコード書いている
* クラウドとか難しいことはやらずに、最初は手元のPC（OSはなんでもいい）で動かし、適当なサーバー（自分の場合はLinux)で作ったコードを実行するだけで済む

という意味で前提知識がpythonだけで済むという意味で簡単な方法だと思う。（一番のハードルはSlackアプリの作り方、これは少しめんどくさい）

# 概要と流れ

Slack上でアプリ（App）を作る。内容としては、このアプリ向けにメンションするとSlack上にChatGPTの生成文が投稿されるもの。私は「ChatGPT先生」と名付けた

1. OpenAIのAPI Key取得（とりあえずなら無料でOK）
2. Slack上でアプリ（App）を作る。[Bolt for Python](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)を参考に、トークン取得とアプリのインストール＆設定をする。
3. コードを書く（後述、pythonで50行ぐらい）
4. 適当なサーバーでコード動かす
以上。簡単。

# 1. OpenAIでAPI key
下記が詳しい。内部向けで遊んでいる限りはほぼ無料枠で十分だろう。

https://1-notes.com/openai-get-api-key/

# 2. Slackでアプリを作る
下記で書かれていることを忠実にやる。飛ばさずにやる。忘れずにやる。正直ここが一番難しい。

https://slack.dev/bolt-python/ja-jp/tutorial/getting-started#tokens-and-installing-apps

Slackのアプリの作り方は公式の通り。
BoltというSlack公式のフレームワークを使うことで簡単なコードでSlackのアプリとのやり取りができるようになる。
特にWebSocketを使っているので、ウェブ系の知識がほとんどなくてもローカル環境でpythonコード動かすだけでSlackアプリが作れるのが強い。

# 3. コード

以下の通り。pythonのモジュールを使っている関係で、以下のものはpipなどでインストールが必要。
dotenv-python(これだけimport文とpipでインストールするのが異なるので注意), slack_bolt, openai。
例えば、以下とする。

```
pip install dotenv-python
pip install slack_bolt
pip install openai
```

肝心のコードは下記。ファイル名はapp.pyとした。ちょっとした工夫を２つ（３つ）入れている。
1. メンション以外のところに「先生」か「Sensei」の文字を入れるとChatGPTにかけるおまじない（ロール、役割）が変わる。「先生」「Sensei」という文字が入ってないと生身のChatGPTになる。人格を複数切り替えられるのがプロンプトエンジニアリングとして重要。21行目からの部分を任意に変えると任意のロール（事前のおまじない、暗示）で動く。

1. スレッドでメンションされるとスレッド内で返信が来る。普通にチャンネル投稿の場合はスレッドにはしない。
1. 工夫と言うか制限に近いが、過去の発言は記憶しない。メンション飛ばされたその投稿だけがプロンプトとなる。本家のように連続会話は出来ない。メリットとしてはOpenAIのAPIのtoken節約。Slack上では何が過去の発言か難しいので無用な複雑さを避けた実装。

https://gist.github.com/ina111/f50f3c5aeb2511bada85fd15477d1943

注意点としては、17行目の<@hogehoge>は実際に作ったSlackアプリのメンバーIDに変更する必要がある。

![スクリーンショット 2023-03-05 005541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40132/ca3a17d7-9a1a-342c-1084-a94522f83ebf.png)

# 4. 適当なサーバーでコード動かす

app.pyだけではなく、以下のような.envファイルもapp.pyと同じフォルダに入れておく必要がある。ここでのTOKENやAPI_KEYはそれぞれSlackアプリやOpenAIで取得したそれぞれのものに置き換える。当然だが、このTOKENやAPI Keyは秘密なので他所の人が見えるところには置かないように注意。

```.env
SLACK_BOT_TOKEN = "xoxb-hogehoge"
SLACK_APP_TOKEN = "xapp-fugafuga"
OPENAI_API_KEY = "sk-piyopiyo"
```

最初に、ローカルのPCで動かして動作確認を行う。
WebSocketという技術を用いているので、手元のPCでapp.pyがある場所で以下だけで動く。動作確認はSlack上でアプリに向かってメンションすれば良い。

```
python app.py
```

動作確認が出来たら、動かしっぱなしの適当なPCかサーバー、自分の場合はNAS上でコードを移し実行させた。
例えば、Linuxの場合であれば、以下の

```
python app․py
```

と打つだけ。
バックグラウンドでログも出力しながら止まらないように動かすなら

```
nohup python3 app․py > log.txt &
```

などとすればOK。PC起動時にプログラム実行させるのもいいだろう。


# おわりに

たのしい
![スクリーンショット 2023-03-05 0142582.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40132/fcd74d56-4e7b-5640-fadd-a84d5da54c3b.png)

真面目な用途に使おうとするとなかなか難しい。Slack上でのコミュニケーションの活性化ぐらいが実利か。

# 参考にさせてもらったもの

https://zenn.dev/ryo_kawamata/articles/56ea2484320def


# 追記（2023年3月11日）

Slack上に別のアプリも作った。同じくOpenAI社のAPIであるwhisperを用いた音声認識Bot
詳細は以下のページで。

https://qiita.com/ina111/items/1a7c3aac1ca02259783f