OpenAI-APIを用いて社内研修の質問に答えてくれるAI講師アシスタントアプリを作りました

イントロ

Llama-indexを用いてプロンプトに外部データとして社内研修のテキストを含め、
その内容を参照して精度の高い回答をしてくれるようなAI講師アシスタントアプリケーションを作りました。

システム構成図

実行環境

  • Windows10
  • Python 3.9.6
  • git
  • slack-bolt 1.18.0
  • openai 0.27.7
  • llama-index 0.6.16.post1
  • urllib3 1.26.16

作成の背景

当社の新入社員の増加と、研修を事業とし社外にも拡大していくうえで、講師の負担軽減を目的としたツールとしてこのアプリの作成に取り組みました。
また、講師に対して気を使ってしまい質問しにくいという研修生が、
気軽に質問できるようにという狙いもあります。

社内研修の進行や、各項目に対しての質問にある程度答えてくれるようにテキストとしてある程度の文章量は必要ですが、テキストの内容に沿った回答をしてくれるので個別の事例でも対応可能です。すごい。

Slack上に導入

研修生にアプリケーションを使ってもらうため、
当初はチャット形式のUIを持つサイトを作成することを想定していました。
しかし、ログイン機能を実装しないと質問者の識別が難しく、ログを残す際に誰がどの質問をしたのかわからなくなってしまいます。

今回はなるべく早く実装し、実際に使ってもらうことでフィードバックを得ることが目標だったため、社内でコミュニケーションツールとして使用しているSlack上に、ボットとして導入することにしました。

Slackを利用することでユーザーの識別が容易になり、
チャット形式のUI、スマホでもPCでも利用できる、という要件も一気に満たすことができました。
利用者側から見ても、SlackのDMから人に質問するのと同じようにボットへ質問を投げかけられるのは、かなり便利に感じました。

AI講師アシスタントのアカウントにDolphineという名前を付けました。
Dolphineに対してSlackのDMで質問をするといい感じの回答を返してくれます。

また、講師が参加しているチャンネルにも通知してくれるようにしました。
どんな質問が多いか、誰がどのくらい質問しているかなど統計的なデータはログを確認、
直近にどんな質問があったか確認したいだけの場合はチャンネルを確認、
という使い分けが出来て便利です。

データの参照方法とライブラリの選定

外部データをOpenAIに参照させる方法として、

  1. 多数のデータを用いてあらかじめfine-tuningする
  2. 外部データを埋め込みベクトルとして保存し、質問と類似度が高いものをプロンプトとして入力する

といった手法があります。
研修に関する質問に回答してもらうという都合上、研修内容の改変や想定外の質問に対する対応などを考慮する必要があったので、後者を用いて制作していくことにしました。

調べた結果、外部データをLLMに受け渡してくれる主だったライブラリとして、LlamaIndexとLangChainがあることが分かりました。
どちらのライブラリをメインで使用するか決定するため、パラメータを調整していない状態で両ライブラリに同じテキストデータを与え、同じ質問を投げかけるというテストを行いました。
今回はごんぎつねの原文をテキストとして与え、内容についての質問をしてみました。

結果、LlamaIndexの方が回答の精度が良かったことに加えコードも記述しやすかったため、今回はLlamaIndexを採択しました。

ログの残し方

ログに求められる要件として、

  • 誰かがログファイルを開いていても、ソートや絞り込みなどの操作が行えること
  • 24時間確認できること
  • 誰でも確認できること

がありました。

AWSのリソースやGoogle Sheets APIを利用することを検討していましたが、
書き込み制限や料金などを考慮し、社内で立ち上げているNASを利用することにしました。

また、ログは最初CSV形式で保存していたのですが、エクセルで開くとロックがかかってしまい、書き込みが行えないなど不都合が多かったためSQLiteを利用し、dbファイルとして保存することにしました。

ログファイルをNAS上に格納し、質問のログが追加されるごとに反映させるようにしたかったのですが、sqliteとSMBでマウントされたNASは相性が悪かったのか「databese is locked」というエラーが出るばかりでした。
一度ローカルに保存し、コピーしたファイルをNAS上に格納するという手法で一応の解決はしましたが、あまりスマートではないですね。

与えるテキストデータ

研修のヒントのみをまとめたテキストとヒントに加えて答えを含めたテキストをAIに与えて回答の精度比較を行いました。

AIが研修の答えとなるテキストから研修生に対するヒントを生成してくれる、
という動作が理想だったのですが、答えを追加したところで回答の精度には影響がなかったうえ、いくらプロンプトで制御しようとしても、答えをそのまま引用してしまうことがありました。

質問に対し適切な箇所を引用して答えてはくれるのですが、内容を理解したうえでぼかして回答するといったことは難しいようでした。

まとめ

LlamaIndexとSlack APIを使ってSlack上から呼び出せるAIアシスタントを作成しました。
今回は社内研修で利用することが目的でしたが、様々な応用が利くと思うのでぜひ皆さんも作ってみてはいかがでしょうか。

参考文献

https://recruit.gmo.jp/engineer/jisedai/blog/llamaindex-chatgpt-tuning/