OpenAI API連携Slackボットに社内情報を回答させてみた

# はじめに
以前、ChatGPTをSlackから利用できるようにしたことをこちらの記事でご紹介しました。
このSlackボットを最近話題のRAG構成にすることで、社内情報を元に回答するようにしてみました。

https://qiita.com/nishimura-POHD-CCoE/items/556baa843ab32aaaef31

# RAGとは
RAGとはRetrieval Augmented Generationの略称で、日本語では検索拡張生成と訳されています。
LLM（Large Language Model）は例えば企業内部の情報やLLMが学習していない最新の情報を保持していないため、LLM単体では質問に対して正確な回答をしてくれないことがあります。
RAG構成では、LLMが知らない情報を外部データから検索（Retrieval）し、その検索結果を元にLLMが質問への回答を生成（Generation）するため、LLM自身が学習していない情報についても正確な回答が得られるようになります。

# 構成
作成したSlackボットの構成はこちらの図のとおりです。
この図中の③④がRetrievalの処理に該当する部分で、今回はAmazon Kendraを利用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/feea4ddd-401d-386d-2b07-abb58ef9ad85.png)

# Kendraについて
Kendraは機械学習を利用したマネージドの検索サービスです。
キーワード検索だけではなく、日本語で会話をするように検索（セマンティック検索）できる点がポイントです。
下記リリース情報のとおり昨年～今年にかけて日本での利用やRAGに関する状況が整ってきています。

- 2022年11月　[日本語のセマンティック検索をサポート](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-kendra-expanded-language-support-semantic/)
- 2023年2月　[東京リージョンで利用開始](https://aws.amazon.com/jp/about-aws/whats-new/2023/02/amazon-kendra-asia-pacific-tokyo-region/)
- 2023年6月　[検索APIがローンチ](https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-kendra-retrieval-api/)

Kendraの検索に関するAPIとしてはQueryというAPIが以前からありましたが、RAGにより最適化されたRetrieveというAPI（検索API）が利用可能となっています。

> RAG に最適化: Kendra Retriever API は、LLM の回答精度に必要な最適な粒度で、最も関連性の高い文章を返します。

https://aws.amazon.com/jp/kendra/features/

> This API is similar to the Query API. However, by default, the Query API only returns excerpt passages of up to 100 token words. With the Retrieve API, you can retrieve longer passages of up to 200 token words and up to 100 semantically relevant passages.

https://docs.aws.amazon.com/kendra/latest/APIReference/API_Retrieve.html

また、Kendraにはデータソースに接続するためのコネクタが多数用意されており、S3やSharePoint、Slack等に容易に接続することができます。

https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/data-sources.html

取込み可能なドキュメント形式としてはプレーンテキスト、PDF、HTML、PowerPoint、Word、Excelなどがあります。

https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/index-document-types.html


今回、LLMへの問合せの前段にKendraへの検索処理を追加するだけで、社内情報について回答してくれるボットをとても簡単に作成することができました。

# Slackボットに質問してみた
CCoEのチャンネルにKendraを接続し、ボットに質問してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/00cc466d-cea9-ab4a-9b09-c705b5c70ef9.png)

現在は下記ページにて公開されている内容ですが、LLMにはまだ取り込まれていないため、Kendraが取り込んだ社内情報を元に回答していることがわかります。

https://techplay.jp/column/1745

# 実装時の躓きポイント
今回、手始めにデータソースとしてSlackを選択しました。
Slackコネクタの設定項目はシンプルなものではあるのですが、Kendraに接続してデータを取り込むにあたりいくつか躓いたポイントがありました。

**1. Kendraの検索対象のSlackチャンネルにSlackアプリを追加する必要がある**
SlackアプリをSlackワークスペースに追加しただけで、チャンネルには追加しない状態でKendraからデータソースの同期を実行したところ、Kendraにドキュメントが一つも取り込まれませんでした。
Kendraが出力するログをCloudWatchLogsから確認すると、下記のエラーログが出力されていました。
> An exception has occurred while fetching messages for channel XXXXX with id XXXXX - Token is not allowed to access this channel. Unable to retrieve messages from this channel..

最初にSlackアプリの権限不足を疑い、[こちら](https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/data-source-slack.html#prerequisites-slack) のドキュメントを見返しましたが、記載のとおり適切な権限を付与していたため、しばらく原因に気づけませんでした。
Slackアプリをチャンネルに追加してみたところ、ドキュメントが取得できるようになりました。

**2. Slackアプリの権限変更後はSlackワークスペースへアプリを再度追加する必要がある**
KendraのSlackコネクタではチャンネルに投稿されたメッセージや添付ファイルを取り込むことができます。
そのために必要な権限をSlackアプリ付与していましたが、なぜかSlackの添付ファイルしかKendraに取り込めない事象が発生していました。
最初にSlackアプリをワークスペースにインストールし、後から不足していた権限をアプリに追加した際、アプリをワークスペースに再インストールすることを忘れていたことに思い当たり、再インストールしたところ無事メッセージも検索結果に出てくるようになりました。

上記ポイントはSlackアプリの作成に慣れている方にとっては当然のことかもしれませんが、Kendraの設定よりもコネクタで接続するデータソース側の設定で躓くというのはSlackに限らず起こり得る気がしています。

# 今後の展望
**1. Slackボットの利用拡大**
社内ではSlackの利用が活発であり、様々な用途のチャンネルが用意されているため、業務改善の糸口は多数潜んでいる可能性があると考えています。例えば、社内ヘルプデスクへの過去の問合を元に回答してくれるようなヘルプデスクサポートボットを作成することで、ヘルプデスク業務の改善に繋がるかもしれません。

**2. データソースの拡充**
現状、データソースはまだSlackのみに留まっています。社内情報が蓄積されているSharePointやファイルサーバも対象とすることで、複数データソースを横断した検索を実現したいと考えています。

# :maple_leaf: 弊社では一緒に働く仲間を募集中です :maple_leaf:
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。
https://engineer.po-holdings.co.jp/