Amazon BedrockのKnowledge baseを試す

# はじめに
少し前に、Amazon BedrockにKnowledge baseという機能が追加されました。

https://aws.amazon.com/jp/blogs/aws/knowledge-bases-now-delivers-fully-managed-rag-experience-in-amazon-bedrock/

最近、LLMを利用したQ&Aシステムを構築する際、検索サービスの検索結果をContextとしてモデルに渡し、回答を生成するというアーキテクチャがよく見られるようになりました。

AWSでは従来Amazon Kendraを利用したアーキテクチャが存在していたのですが、Knowledge baseを利用することでAmazon OpenSearch Serviceなどの検索サービスとAmazon BedrockのLLMを組み合わせたQ&Aシステムを簡単に構築できるようになりました。

なお、現状東京リージョンでは提供されていないので、本稿ではバージニア北部リージョンを利用します。

## 利用する主なサービス
利用する主なサービスは以下だと思います。(抜け漏れあったらスミマセン)
なお、Knowledge baseを利用すること自体に料金はかからず、料金はそれぞれのサービスの利用料となるようです。
- 検索システム(ベクトルインデックス,以下のうちどれか)
    - [Amazon OpenSearch Serverless][link-1](Quick createの場合はコレ)
    - Pinecone
    - Redis Enterprise Cloud
- モデル
    - Titan Embedding G1 
        - Embedding処理
- 元データ
    - S3

# ためしてみる

インデックス作成前にS3バケットを作成し、データを配置します。
対応しているデータ形式は以下の通りです。
- [Set up your data for ingestion][link-2]
- txt,md,html,doc/docx,csv,xls/xlsx,pdf

Bedrockのコンソールからアクセスします。
「Orchestration」→ 「Knowledge base」からアクセスします。
サービスが無い場合はバージニア北部でアクセスしているかご確認ください。

![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/adb9c419-83e9-139e-c078-81290c95f8f4.png)

Create Knowledge baseを押下し、作成します。

名前、ロールは全てデフォルトで進めます。
![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/91c479b4-cf1a-c2f5-b3cc-8e0cf85ed05a.png)

次へを押して、データの設定に移ります。
![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/a23b13d6-2dd5-cd0e-822a-602d6db38032.png)

データを配置しているS3バケットをデータソースに指定します。

![image04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/53df5585-d551-0e0c-5df8-5a4592bcaf7c.png)

「Advanced settings」では、データの分割についての設定が行えます。
LLMにドキュメントを渡す際、入力トークン数に制限があるので、元データを分割して検索上位のドキュメントを渡すことが一般的かと思いますが、ここではその1ドキュメントのサイズを決めることができます。
デフォルトでは1ドキュメント300トークンですが、せっかくなので512トークンかつ25%分をオーバーラップさせた形で作成します。
![image05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/18149228-4055-80ae-8000-2d0fca251a2c.png)

Vector DatabaseではQuick createを利用します。これにより、ベクトルインデックスにOpenSearch Serverlessが利用されます。
![image06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/5c8a961a-7a83-af71-4e4b-f751f54947c1.png)

最後に確認画面で「Create Knowledge base」を押します。
すると、リソースが作成されます。(完了まで数分かかりました。)

作成が完了したら最後にデータを同期します。
データソースから「Sync」を押します。
![image07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/14be6190-40af-3839-cb87-e8e8d79da70e.png)

ここでエラーが発生する場合は、Embeddingモデルが有効化されていない可能性があります。
Amazon Bedrockの「Model access」から「Titan Embeddings G1」が有効化されていることを確認してください。
![image08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/92ca91f4-4e2c-b29d-fff8-2c2c76ec347e.png)

同期が完了するとチャットウィンドウが表示され、ここからテストできます。
LLMにClaude v2を選択し、テストするとドキュメントを参照した回答が表示されました。
![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/1f6c617b-38e0-298a-49ac-39afb6094d21.png)

## リソースの削除
Knowledge baseを選択し、削除するだけではすべてのリソースは削除できません。
別途OpenSearch Serverlessのコレクションと各ポリシー,S3バケットを削除してください。
![image12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/3801f4bf-ae8c-3c85-75ca-6b80f1e99baa.png)

# おわりに
Amazon BedrockのKnowledge baseを利用することで、簡単に検索サービスとLLMを組み合わせたQ&Aアーキテクチャが構築できました。より検索精度を出したい場合等はベクトルインデックスをカスタム実装することを検討する必要がありますが、ライトに試したい場合はquick createが楽で良いと思います。


<!--- 以下リンク集 --->
[link-1]:https://aws.amazon.com/jp/opensearch-service/features/serverless/
[link-2]:https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-setup.html