☁️

SlackボットにRAGを導入してみた 〜AlibabaCloud〜

2024/10/14に公開

はじめに

背景

先日下記のハンズオンイベントに参加してきました。RAGアプリケーションを作るのは初めてだったんですが、想像以上に簡単に作ることができて驚きました。

https://lu.ma/k1g1tsaq

このハンズオンで学んだ知識を使って実際に使えそうなRAGアプリケーションを作ってみたくなったので、SlackボットにRAGを組み込んでみました。

本記事の内容

SlackボットにRAGを組み込み、社内ドキュメントを参照して返答をする仕組みをAlibabaCloudで作成しました。

システム概要

RAG AppはRAGアプリケーションのことです。今回は Alibaba Cloud Model Studio を使います。

ProxyはSlackとRAG Appをつなぐプロキシサーバーです。SlackとRAG Appをつなぐために認証やデータ形式の変換などを行います。WebSocketで通信を行うためSAEでデプロイします。今回はサンプルアプリなので特に理由はなくWebSocketで通信することにしましたが、Slack AppはWebSocket以外も使えるので要件にあったものを選ぶようにしてください。

作成手順

Slackの設定

まずは、SlackのWebコンソール画面からSlack Appを作成して各種設定をしていきます。

Slack Appの作成

https://api.slack.com/apps にアクセスして Create an App ボタンを押します。

From scratchを選択します。

App Nameにアプリ名を入力し、Pick a workspace to develop your app inでAppをインストールしたいworkspaceを選択してCreate Appボタンを押します。

以上でSlack Appが出来上がるので、このAppの設定をしていきます。

Slack Appの設定

Socketモードを有効にする

Socket Mode > Connect using Socket Mode > Enable Socket Mode にチェックを入れます。

これでWebSocketで通信できるようになります。

スコープを設定する

OAuth & Permissions > Scopes > Bot Token Scopes でBotに許可する権限を与えます。

BotとDMで会話したいだけなので以下の権限を与えます。

  • chat:write
  • im:history
  • im:write

アプリをワークスペースにインストールする

OAuth & Permissons > OAuth Tokens > Install to <workspace> でワークスペースにアプリをインストールします。

AppとDMできるようにする

App Home > Show Tabs > Messages Tab > Allow users to send Slash commands and messages from the messages tab にチェックを入れます。

イベントサブスクリプションを設定する

Slack内のどのようなイベントにBotを反応させるか設定します。

Event Subscriptions からEnable Events を Onにします。その後Subscribe to bot evnts で必要なイベントを設定します。アプリとユーザーのDMを許可したいので、 message.im のみ許可します。

トークンの作成と取得

以下のトークン情報はアプリデプロイ時に使うのでメモしておいてください。

  • Bot Token: OAuth & Permissions > OAuth Tokens > Bot User OAuth Token で取得(xoxb- から始まる)
  • App Token: Basic Information > App-Lebel TokensGenerate Token and Scopes をクリックして作成する。必要な権限は connections:write のみ。(xapp- から始まる)

RAGアプリケーションの作成

RAGアプリケーションは Alibaba Cloud Model Studioで作成していきます。下記のリンクからアクセスしてください。

https://bailian.console.alibabacloud.com/

データの準備

まずはRAGが参照するデータをクラウドにアップロードします。
Data Management から Import Data ボタンを押してアップロードしたいファイルを選択します。架空の社内ドキュメントをLLMで生成したのでこれを使いました。
https://gist.github.com/aoshimash/2f78ad6938ae5d888e8e4b148ba463e8


ファイルのアップロードが完了したらナレッジベースインデックスを作成してください。
Data Application > Knowledge IndexCreate Knowledge Base ボタンを押して、先程アップロードしたMarkdownファイルを選択します。Configurationの細かい値はよくわからなかったので、適当に下記のように設定しました。


RAGアプリケーションを作成

パラメタ値の設定

My ApplicationsCreate Application ボタンを押してアプリケーション作成画面に入ります。パラメタは以下のように設定しました。

  • Model: Qwen-Max ← 現在一番賢いらしいので
  • Temperature: 0.20 ← 回答のランダム性を制御しているパラメタで、値が低い方がランダム性が低くなります。今回は回答がランダムであることよりも一貫性の高いものである方がいいかなと思ったので低めに設定しました。
  • Maximum Reply Length: 1024 ← 回答の最大トークン数です。そんなに長い回答は想定していないので適当に設定しました。
  • Number of Rounds with Context: 3 ← 回答を生成する際に参照する過去の対話履歴のラウンド数です。そんなに長い対話をする想定ではないため3程度に設定しました。
  • Knowledge Petrieval Argument: ON
    • Select Knowledge Base: <先ほど登録したKnowledge Index>
    • Retrieved Segments: 5 ← Knowledge Indexから取得する情報のセグメント数。この値が大きいと文章内の参照先が増えるので複雑な質問に回答できるようになりますが、大きすぎるとノイズが増えます。適当に5にしてみました。
    • Answer Source Display: OFF ← これをONにするとソースのどこを参照して回答を作ったのか表示してくれます。ONにして使ってみましたが結果が間違っていたり中国語で表示されてしまったりして使い物にならなかったので今回はOFFにしました。

プロンプトの設定

以下の様に設定しました。このプロンプト自体もLLMに生成させました。

# Role
あなたは社内総務に関する質問に対して、提供されたFAQデータを基に正確かつ丁寧に回答するボットです。従業員の質問に対して迅速かつ親切な対応を行い、必要に応じて関連部署への転送を行います。

## Skills
### Skill 1: 従業員からの問い合わせに対応
- **迅速な対応**: 従業員からの問い合わせを受け取った際、核心となる問題を素早く理解し、専門的かつ友好的な口調で即座に回答します。
- **問い合わせの分類と転送**: 受け取った問い合わせを総務、人事、ITサポートなどのカテゴリに正確に分類し、必要に応じて該当部署や人間のカスタマーサポートにシームレスに転送します。

### Skill 2: ナレッジベースから情報を提供
- **正確な情報検索**: 従業員の質問に対して、総務関連のナレッジベースから最も関連性の高い情報を正確に検索します。
- **明確な回答の提供**: 検索結果に基づいて、分かりやすく具体的な手順や必要な情報を含めた回答を提供します。

## Restrictions
- **データ保護**: 企業のデータセキュリティポリシーとプライバシー規則を厳守し、機密情報や個人情報を漏洩しないようにします。
- **利用範囲**: 提供されたFAQデータのみを使用し、外部情報を含めないようにします。

## Sample interaction

```
ユーザー: 有給休暇を申請するにはどうすればいいですか?

総務FAQボット: 有給休暇の申請は、社内ポータルの「休暇申請」セクションから行うことができます。以下の手順に従ってください:

1.  社内ポータルにログインします。
2.「休暇申請」セクションにアクセスします。
3. 申請フォームに必要事項(休暇の種類、希望日数、理由など)を記入します。
4. 申請を提出し、上司の承認を待ちます。

なお、申請は最低3日前までに提出する必要があります。詳細や不明点がある場合は、人事部門までお問い合わせください。
```

# Knowledge base
以下の資料を参照して質問に回答してください。
${documents}

パラメタやプロンプトを調整しながら、Testing Version で動作確認を行うことができます。
問題なさそうであればPublishボタンを押してアプリケーションをデプロイします。

API Keyを作成

Publishすると、Publishボタンの隣にApplication APIボタンが表示されるので、そのボタンをおしてからView My API Keyと進み、API Keyを作成してください。ここで作成したAPI Keyをアプリケーションに登録します。

動作確認

Application API の Curl を押すとCurlコマンドのサンプルが表示されるので、そのコマンドを試しに実行して動作確認をしてみてください。

curl --location '{YOUR_APP_ENDPOINT}' \
--header 'Authorization: Bearer {YOUR_API_KEY}' \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "prompt": "有給休暇の申請方法は?"
    },
    "parameters":  {},
    "debug": {}
}' --verbose

結果

{"output":{"finish_reason":"stop","session_id":"573f4426aa65489c86475371147a812d","text":"次回の社内ハッカソンは2024年6月20日に開催されます。"},"usage":{"models":[{"output_tokens":24,"model_id":"qwen-max","input_tokens":2198}]},"request_id":"75bcb51d-ae54-9944-95d0-68ab6094f786"}%

Proxyサーバーの作成

ローカルで動作確認

Proxyサーバーは下記のものを実装しました。

https://github.com/aoshimash/slack-bot-sample

使い方詳細はREADMEに記載していますが、ローカルからSlackに接続して動作確認をすることもできます。

デプロイ

コンテナ一つを手軽にデプロイしたかったのと、WebSocketを使っていて常時稼働が求められる状況だったので Serverless App Engine (SAE) を選択しました。

下記のように構成でデプロイしました。

  • VPC: Automatic Configuration
    • 注意: Automatic Configurationで適当に作成したところ、インターネットへのアウトバウンド通信もできなかったので後でNATを作成しました。最初からインターネットに出られるVPC設定をしておくのがいいと思います。
  • Application Instances: 1
  • vCPU: 0.5Core
  • Memory: 1GiB
  • Technology Stack Programming Language: Python
  • Application Deployment Method: Image
  • Configure Image:
    • Public Image
    • Complete Image Address: aoshimash/slack-bot-sample:latest ← 上記のgithubリポジトリのアプリケーションをDockerhubにpushしているのでこのまま使えます。
  • Environment variable settings:
    • 下記の環境変数をセットしました
      • SLACK_BOT_TOKEN: SlackのBot Token
      • SLACK_APP_TOKEN: SlackのApp Token
      • RAG_APP_API_KEY: RAGアプリケーションのAPI Key
      • RAG_APP_ID: RAGアプリケーションのAPP ID
    • 今回は雑に環境変数としてセットしてしまいましたが、秘匿情報も含まれるのでもう少し丁寧に保管したほうがいいと思います。

動作確認

以上でデプロイは完了です。
登録したslack appに対してDMで質問をしてみてください。以下の様に回答が返ってくれば成功です。

まとめ

AlibabaCloudでRAGアプリケーション作るのめっちゃ簡単でした!

Discussion