Amazon Q Businessを使ってRAGチャットアプリを簡単に作ってみた

先日3/6に実施された「AWS Innovate: Generative AI + Data」で紹介されていた、Amazon Q Businessが気になりました。ほかのAmazon Bedrockなどはオフィシャルのハンズオンが結構豊富にネット上にあったのですが、Amazon Q Businessはなかったのでとりあえず動かしてみようと思います。

https://aws.amazon.com/jp/events/aws-innovate/apj/aiml-data/
 

## 実施内容
・登録したデータソースの情報を元に回答してくれるAmazon Q Businessアプリケーションを作成する
・登録したデータソース以外の情報にも回答できるか確認する

## 事前準備

・S3バケット、データソースファイル用意
⇒今回は手元に別のハンズオンで使った下記Amazon Bedrockのドキュメントがあったので、これをデータソースとして利用したいと思います。

 https://docs.aws.amazon.com/pdfs/bedrock/latest/userguide/bedrock-ug.pdf
  
・IAM Identity Center、ユーザ登録
⇒チャット画面へのサインイン時に使用するユーザを登録しておきます。

## アプリケーション作成
Amazon Q Businessのサービスに遷移します。
現在はバージニア北部リージョンか、オレゴンリージョンでしか利用できないので、それ以外のリージョンからアクセスしようとするとこのような画面が出てきます。
今回はオレゴンリージョンを使おうと思います。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/7fe5d9cf-6720-4cb0-a59e-791abc554f89.png)

「Get Started」をクリックします。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/26acfe36-fd61-416e-8d31-2c78543eb309.png)

「Create application」をクリックします。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/a93865b7-e776-47a1-9f17-0c072fd20187.png)

以下のように項目を埋めていきます。
・Application name：任意のアプリケーション名を入力
・Access management method：「AWS IAM Identity Center (recommended)」を選択

⇒AWS IAM Identity Centerを別のリージョンですでに作っていると、以下のようなメッセージが表示されます。
```
Unable to connect to organization instance of IAM Identity Center
```
アプリケーションを作るリージョン（今回の場合オレゴン）と同じリージョンにAWS IAM Identity Centerを用意する必要があるという旨のメッセージです。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/500e49f3-a64e-4052-9df6-1b70ca875544.png)

Amazon Q Businessでは、チャット画面へのアクセス時にユーザー名とパスワードが要求されます。このユーザー管理をAWS IAM Identity Centerで行うため、ここでAWS IAM Identity Centerの設定が必要となっています。

しかし、「Advanced IAM Identity Center settings - optional」を開くと、「Enable cross-region calls to access resources」というスイッチが見えます。これをオンにすれば、「Application connected to IAM Identity Center」というメッセージが出てくるので問題ありません。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/bc37876e-b42c-4188-8e0d-f2673f6152f6.png)

Application detailsは今回デフォルトから特に変更しませんが、軽く中身を見ておこうと思います。
・Application service access：「Create and use a new service-linked role (SLR)」
⇒Amazon Q Businessが動作するうえで必要な権限がサービスリンクロールにて自動で作成されます。
・Encryption：オフ
⇒オフにしておくと、データがKMSキーによって暗号化されます。自分で作成したKMSキーを指定したい場合はオンにします。
・Web experience settings：「Create and use a new service role」
⇒Webアプリケーションとして実行される操作（ドキュメントのインポート、チャット履歴/プラグインのリスト表示など）に必要なIAMロールが自動で作成されます。

これで設定は完了です。「Create」をクリックします。

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/c1a956ac-34b3-481d-bbd0-529cacf3a316.png)

アプリケーションの作成が完了しました。
上に表示されている「Q Recommendations」に沿って作業していきます。

## データソース作成

まずはデータソースを設定します。「Data sources」をクリックします。

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/d6159193-f091-4d8a-9cf7-782f9001d03d.png)

こちらも上に表示されている「How it works」に従って進めます。
まずはインデックスを追加するので、「Add an index」をクリックします。

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/64e80f55-61f8-403b-a4d2-2a11a3a565dd.png)

インデックス名は任意で入力します。
インデックスはEnterpriseとStarterが選べますが、今回はお試しなのでStarterを選びます。
プランによる違いは以下で確認できます。
 
https://aws.amazon.com/jp/q/business/pricing/

「Number of units」はデフォルトのまま1とします。
ドキュメント数/量に応じて変えるのが良いようですが、今回は大きくないファイル1つを入れるだけなので1です。

入力が完了したので、「Add an index」をクリックします。

![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/ac4a6e3c-d31c-4c10-9a2b-9a8dc4041e7e.png)

完了メッセージにもある通り、続いてデータソースを追加するので「Add data sources」をクリックします。

![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/73deb8cb-abd6-4306-b9f4-6d7f4db03e29.png)

色々なデータソースのタイプを選択できます。今回はAmazon S3を選択します。

![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/541ae3e2-d0d2-4d60-9228-4e8fbd1fd79e.png)

以下の通り入力し、入力が完了したら「Add data sources」をクリックします。
・Data source name：任意
・IAM role：「Create a new service role (Recommended)」を選択
・Role name：自動で作成
・Enter the data source location：「Browse S3」を選択し、使用するS3バケットを選択
・Sync mode：「Full sync」を選択
⇒格納されているファイルをすべてデータソースとして同期します。
・Frequency：「Run on demand」を選択
⇒いつデータソースを同期するかを選択します。この場合、この後「Sync now」というボタンを押すことで同期されます。

![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/99537607-5eca-4d5d-b429-b1eb21796210.png)

![013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/1a6877d2-c30f-4bef-a0f7-9ba2c8d4ecef.png)

完了したら、先述したように、「Sync now」をクリックすることでデータを同期させます。
※ここが今回の作業で一番時間がかかりました。18MBのファイル1つで約30分かかりました。

![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/ea14d1b0-7b5e-4f02-ae3c-9a6b30f71fb5.png)

同期が完了しました。データソースの準備はできたので、サイドメニュー等からアプリケーションの画面に戻りましょう。

![015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/528277ec-5629-4812-81cb-86a015e812a5.png)

## ユーザ登録

これから、チャットにアクセスできるユーザを設定していきます。
画面中央の「Manage user access」をクリックします。

![016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/375566b8-be98-4d3e-a76c-d182b3d1b000.png)

「Add groups and users」をクリックします。

![017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/23db2edc-720d-4542-8c68-3f63a34c62c2.png)

2つオプションがあります。
・Add new users：ユーザ名やメールアドレスをこの場で入力して新規ユーザを作成します。
・Assign existing users and groups：IAM Identity Centerに登録しているユーザやグループを選択します。

今回は後者「Assign existing users and groups」を選択していきます。

![018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/8346c9d4-4a12-479f-8104-10dad2f9afd9.png)

検索窓に文字を入力すると候補が出てくるので、追加したいユーザ/グループを選択します。

![019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/a798701e-f964-4956-a012-e5132edc6f8a.png)

今回はユーザを一人選択しました。これで「Assign」をクリックします。

![020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/e2153bfb-5ac7-4860-a1a7-5d18b967b48e.png)

ユーザ追加が完了しました。登録したユーザのメールアドレスに招待メールが届くので、そちらからユーザにパスワードの設定をしてもらいます。

ユーザのサブスクリプションモデルをLite、Proのいずれかから選択します。今回はLiteとします。
プランによる違いは以下で確認できます。
 
https://aws.amazon.com/jp/q/business/pricing/
 
![021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/a3f17f9d-ecd8-4efd-baa3-181b4ce883ff.png)

## サービス利用

さあ、これでサービスを利用できる最低限の設定が完了しました。
アプリケーションの画面に戻り、「Web experience settings」の中にある、「Deployed URL」をクリックします。

![022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/25536d80-a034-465b-bc5d-87a6c4b92ec3.png)

サインイン画面が表示されるので、登録したユーザ名、ユーザが自身で設定したパスワードを入力してログインします。

![023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/7eeaaac6-97e2-48ab-b072-763063229cf7.png)

![024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/594b351e-f780-4e64-b597-afdae40fa3ed.png)

Q Businessのチャット画面が表示されました！
いくつか質問してみましょう。

![025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/4c9cc5d7-73be-4a47-8b52-ba592fd79b92.png)

PDFでS3バケットに格納していた情報を使って、BedrockやEC2に関する質問に答えてくれました。
使ったデータソースの情報も表示してくれています。

![026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/3aa9c61e-7020-41c1-a63b-4fcf4591fe4b.png)

しかし現状はデータソースにある情報のみを使って回答しているので、データソース以外の質問には全く答えられません。

![027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/29565391-f78f-48c1-800e-6385ae9fc259.png)

次節で、データソースに情報がないときでも、LLMにある情報で回答してもらえるようにしてみます。

## Admin controls and guardrails の調整

画面上部にある、「Admin controls and guardrails」をクリックします。

![028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/001b7066-d5a9-4e10-a562-d4b936526434.png)

こちらの「Global controls」を見てみると以下のような設定になっています。
・Allow Amazon Q to fall back to LLM knowledge：Off
⇒LLMの知識は使うことができない設定になっているようです。

この設定を変えてみます。「Global controls」の「Edit」をクリックします。

![029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/02b1b2da-f21a-4050-bd81-74964d80529c.png)

「Allow Amazon Q to fall back to LLM knowledge」をオンにして、「Save」をクリックします。

![030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/41ba1b4f-cbf6-4f4f-838f-c4379a28a8c7.png)

設定が完了しました。改めて先ほどと同じ質問をしてみます。

![031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/570c565f-fed6-4cb9-9cff-5e6c28f2f96f.png)

冒頭に
```
No answer is found

Generating an answer based on what I know...
```
という注釈を入れたうえで回答してくれるようになりました！

![032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/0a45b499-a29c-445a-b627-f9649dbd2d61.png)

## まとめ
特にLLMのモデルの選択やデータソースのチューニングをせずとも、簡単なアプリケーションを作成することができました。実際にビジネスで利用する際は、理想の質問と回答が可能か、ある程度階数を重ねてみて、多少チューニングなど必要になってくるのかなあと思います。