SlackBotでオンライン質問対応システムを構築した話

## はじめに

2020年、コロナ禍による影響で大学の講義は一変しました。弊大学では上半期は完全オンライン講義、下半期は対面・オンライン混合のハイブリッド講義が実施されました。

上半期で得たオンライン講義での知見を元に、夏休みの自由研究としてSlackで学生と教員・TAの質問対応をサポートする質問対応システムを作成しました。

## 質問対応業務の難しさ

TAとしてのお仕事に質問対応業というものがあります。弊学科ではプログラミング系の実習講義が多くあり、人の理解度に大きな差が生まれやすいです。プログラミングの文法の質問，環境構築，エラーのトラブルシューティングなど、課題を進める上で障害となる要素に当たった時、TAは内容を確認し、適切なアドバイスを行うことで演習を進めるサポートをする必要があります。

### プログラミング科目の質問対応

質問内容は、演習問題の回答が含まれている恐れがあることから、学生同士が共有できる場では行わない方針でした。そこで、Slackのワークフローを用いて質問をプライベートチャンネルへ転送することで、省コストで質問対応の仕組みが作られました。

1. Slackのワークフローを用いて質問内容を投稿する
2. 「質問対応チャンネル」で教員・TAが質問内容を確認し（リアクションで排他制御）、学生へDM。
3. 聞き取りが必要な場合は、さらにDMでやりとりを続ける。

![スクリーンショット 2021-04-24 21.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249063/4af0822b-4ddc-8d87-4de8-fccf98de6008.png)

しかし、200人以上の学生と20人の教員・TAで運用すると、いくつか問題点が発生しました。

* DMを用いることで、教員・TA間での対応情報の共有がなされない
* ワークフローはDMと独立しているため、学生が一度対応する人のアカウントを知ると、直接DMに投げるようになる

これらのことから、質問対応は処理待ち、偏りが発生してしまい、教員・TA・学生の全てにストレスフルな環境になってしまっていたと思います。

![スクリーンショット 2021-04-24 21.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249063/b66dcaa6-888c-0d2c-ea7d-f38ed66e72a5.png)


## 何が必要だったのか

オンライン質問対応において不足しているものは**教員・TA間での情報共有と対応のリダイレクト**だと考えました。対面講義を行っているときには、忙しさは目に見えており、必要に応じて部屋の人員の補充や、対応できない質問があった場合の救援要請などが可能だったのですが、Slackでのコミュニケーションでは難しいところがありました。そこで、これらを可能にする機能をSlack Appに落とし込むことで質問対応が楽になるのではと思い、夏休みの自由研究として実装しました。

特に求めていたのは以下の機能です。

* 質問対応の内容が他の教員・TAにリアルタイムに閲覧できる
    * 訂正や補足があれば、誰でも介入できる
    * 匿名性があれば、DMを防ぐことができる
* 質問対応の窓口を集約することで、学生の負担を減らす
    * 今までの質問窓口は、各講義につき一つ用意されていた（講義により方法が異なる）
    * 複数講義で統一することで、質問をする行為自体のハードルを下げる

# QABot

そこで構築したのは、QABotと名付けられた質問対応をサポートするのSlack Appです。
学生と教員・TAのやりとりを全てQABotが仲介することで、DMを用いることなく、代表アカウントとしてやりとりが可能になります。
![スクリーンショット 2021-04-24 21.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249063/e769121e-8e81-7178-2a13-a3aee6ac4e66.png)

QABotでのやりとりは、学生ーQABot間はDM、QABotー教員・TA間はスレッドとして扱っています。教員・TAはチャンネルに投稿された質問に対してリアクションを行うことで、やりとりの開始・終了を行うことができます。これは、従来の質問対応の仕組みに倣っています。

また、質問回数や対応回数などを集計し、教員・TA側に提示することで、講義の理解度等のパフォーマンスチェックが行えるような機能(beta)も持っています。

学生は、ショートカットから以下のようなモーダルを呼び出し、質問内容を送信。その後BotからDMが届き、教員・TAとマッチングしやりとりする形です。
![スクリーンショット 2021-04-24 21.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249063/6de0d9d3-f543-f4de-30a5-16038768e948.png)

（ BlockKit BuilderというSlackが提供しているWebアプリで簡単に作ることができます！　）

![スクリーンショット 2021-04-24 22.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249063/80a1986a-3693-3597-a493-a9a9df8ed6a9.png)
↑やりとりのサンプル

このSlackBotを設計する時、一番考えたのはどれだけユーザ情報を保存せずに処理できるかでした。マシンリソースの確保が難しかったので、運用時間が長くなるにつれてデータ量がネックになってしまうと考えたからです。
結局このBotでは、講義情報、学生のアカウント、やりとりのセッション情報のみを保存し、やりとりの内容等は全てSlackに委ねることにしました。

## QABotの運用

SlackBotを運用する時に一番問題なのは，SSLを喋れるWebサーバが必要なことです。大学や研究室のサーバでは都合がつかなかったので、AWS EC2で動作させるようにしました．結果としては良い選択肢だったと思います.
（現在はSlackAPIのアップデートでSocketモードが登場し、ファイヤウォールの中でもBotサーバが用意できるようになりました。)

担当教員に（勝手に作ってた）アプリを紹介したところ、なんやかんやで1〜3年生の実習科目（計500人規模）で導入をしていただき、半期の運用を行いました。そこでのフィードバックを受け、短いスパンで改良を重ねました。

* ファイル転送機能の導入
* 質問の種類の選択
* 未対応質問のリストアップ

特に、質問対応では、Slackはmdに対応していることもあり、ファイル（画像)転送は必要ないと思っていたのですが、想像より画像の要望が大きかったのは驚きました。実環境からのフィードバックの重要性を学んだ次第です。

最終的に9月の運用開始から1月の講義終了までで **1200件以上** の質問対応を行いました。

また、講義中にシステムが落ちることないように、prometheusで監視アラートを組んでいたのですが、幸いにも(Slackのダウン以外は)一度も落ちることもなく、無事に24時間稼働で質問対応を提供できました。

### QABotの評価

実施後アンケートを取ったのですが、良い評価をいただきました。オンライン講義への手助けとなれたようで、やりがいを感じています。
（利用用途について記載していなかったので、ここでは総評のみを述べさせていただきます。）

質問対応がデータとして共有されるというのは、自然言語処理のデータセットとしても活用用途が見えるのかなぁと思いました。（プライバシーポリシーをきちんと定めないとなぁというお気持ち）

僕の修了に伴い、今後の運用・開発は所属していた研究室に移ることになるのですが、AI（危険ワード）を用いたサポートや、別のAIプロジェクトとの連携があるかも？と聞いています。知らんけど。

コード: GitHub(https://github.com/ymmtr6/QABot)

## 謝辞

QABotの導入に尽力していただいた担当教員と各科目の教員の皆様。そしてシステムを利用していただいた学生の皆様に御礼申し上げます。

## さいごに

今回のSlackAppは技術的に特筆するようなことは全くありません。
APIドキュメントを元に、ルールを決めてデータを動かしているだけです。
それでも実際に使ってもらえるアプリとして成り立つのは、導入への根回しやドメイン知識、フィードバックからの改善であるということを今回学びました。

* 4月からは対面講義だと思ってたけど、結局緊急事態宣言が発令されました。必要性が上昇してるかも？？
* 学内発表の際、下書きのままで投稿を忘れていたので、適当に修正して上げています。（21/4/24）