Amazon Bedrockのナレッジベースを試してみた

# 背景・目的
以前、下記でBedrockを試してみました。今回はBedrockでRAGを試してみます。

- [Amazon Bedrockを整理してみた](https://qiita.com/zumax/items/ad61c2ae4cb767aff05f#%E3%81%BE%E3%81%A8%E3%82%81)
- [Amazon Bedrockを試してみた](https://qiita.com/zumax/items/9b0f9e0ed1b57474a72f)


# まとめ
下記に特徴をまとめます。

| 特徴 | 説明 |
| :-- |  :-- | 
|ナレッジベースとは|・データソースを情報のリポジトリにまとめることができる<BR>・ナレッジベースにより、RAGを活用したアプリを簡単に構築できる|
|RAG|データソースから情報を取得し、モデルレスポンスの生成を強化する手法|
| できること|・ナレッジベースは、ユーザのクエリに答える<BR>・プロンプトにコンテキストを提供することで、FMに提供されるプロンプトを強化する<BR>・ナレッジベースのレスポンスには引用もついている<BR>・ユーザはレスポンスの基になっているテキストを正確に調べることで詳細を見つける、レスポンスが意味あるもので事実に基づく正確なものかどうかを確認できる|
|インデックス作成|・ナレッジベース作成後、データソースをナレッジベースに取り込みインデックスを作成する<BR>・取り込みにより、データソース内のみ加工データがベクター埋め込みに変換される<BR>・未加工のテキストとフィルタリング用の設定した関連メタデータを関連させて、クエリ処理を効率化する|

## ナレッジベースがサポートされている環境

|カテゴリ |環境|
|:--|:--|
|リージョン|・US East (N. Virginia)<BR>・US West (Oregon)<BR>・Asia Pacific (Singapore)<BR>・Asia Pacific (Sydney)<BR>・Asia Pacific (Tokyo)<BR>・Europe (Frankfurt)|
|Embeddingに使用できるモデル|・Amazon Titan Embeddings G1 - Text<BR>・Cohere Embed (English)<BR>・Cohere Embed (Multilingual)|
|ナレッジベースからの応答を生成できるモデル|・Amazon Titan Text Premier<BR>・Anthropic Claude v2.0<BR>・Anthropic Claude v2.1<BR>・Anthropic Claude 3 Sonnet v1<BR>・Anthropic Claude 3 Haiku v1<BR>・Anthropic Claude Instant v1|


# 概要
[Amazon ベッドロックのナレッジベース](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base.html)を元に整理します。


> Amazon Bedrock のナレッジベースでは、データソースを情報のリポジトリにまとめることができます。ナレッジベースを使用すると、検索拡張生成 (RAG) を活用したアプリケーションを簡単に構築できます。RAG は、データソースから情報を取得することでモデルレスポンスの生成を強化する手法です。設定後、ナレッジベースは次のように活用できます。
> - RetrieveAndGenerateAPI を使用してナレッジベースにクエリを実行し、取得した情報から応答を生成するように RAG アプリケーションを設定します。
> - ナレッジベースをエージェントに関連付けて (詳細については、「Agents for Amazon Bedrock」を参照) エージェントに RAG 機能を追加し、エージェントがエンドユーザーを支援するための手順を推論できるように支援する。
> - Retrieve API を使用してアプリケーション内にカスタムオーケストレーションフローを作成し、ナレッジベースから直接情報を取得する。

- データソースを情報のリポジトリにまとめることができる
- ナレッジベースにより、RAGを活用したアプリを簡単に構築できる
- RAGとは、データソースから情報を取得し、モデルレスポンスの生成を強化する手法
- ナレッジベースにより下記の活用ができる
    - RetrieveAndGenerate APIにより取得した情報から応答を生成する
    - ナレッジベースをエージェントに感レ付、エージェーントにRAG機能を追加し、エージェントがエンドユーザを支援するための手順を推論できるように支援する
    - Retrieve APIにより、アプリケーション内にカスタムオーケストレーションフローを作成し、ナレッジベースから直接情報を取得する

> ナレッジベースは、ユーザーのクエリに答えるだけでなく、プロンプトにコンテキストを提供することで基盤モデルに提供されるプロンプトを強化するためにも使用できます。ナレッジベースのレスポンスには引用も付いているため、ユーザーはレスポンスの基になっているテキストを正確に調べることで詳細な情報を見つけたり、そのレスポンスが意味のあるもので事実に基づく正確なものかどうかを確認したりできます。

- ナレッジベースは、ユーザのクエリに答える
- プロンプトにコンテキストを提供することで、FMに提供されるプロンプトを強化する
- ナレッジベースのレスポンスには引用もついている
- ユーザはレスポンスの基になっているテキストを正確に調べることで詳細を見つける、レスポンスが意味あるもので事実に基づく正確なものかどうかを確認できる


## 仕組み
> Amazon Bedrock のナレッジベースは、検索拡張生成 (RAG) を活用するのに役立ちます。RAG は、データストアから情報を取得して、大規模言語モデル (LLM) によって生成される応答を補強する一般的な手法です。データソースを使用してナレッジベースを設定すると、アプリケーションはナレッジベースにクエリを実行して情報を返し、ソースから直接引用するか、クエリ結果から生成される自然なレスポンスでクエリに答えることができます。

> ナレッジベースを使用すると、ナレッジベースへのクエリから得られるコンテキストによって強化されたアプリケーションを構築できます。パイプライン構築という面倒な作業から解放され、アプリケーションのビルド時間を短縮する out-of-the-box RAG ソリューションを提供することで、市場投入までの時間を短縮できます。また、ナレッジベースを追加することで、プライベートデータを活用できるようにモデルを継続的にトレーニングする必要がなくなるため、費用対効果も向上します。

- ナレッジベースにより、ナレッジベースへのクエリから得られるコンテキストによりアプリを構築できる
- パイプライン構築の面倒な作業から開放され、アプリケーションのビルド時間を短縮する out-of-the-box RAGソリューションを提供
- ナレッジベースを追加することで、プライベートを活用できるようにモデルを継続的にトレーニングしなくてよく費用対効果も向上する

> 以下の図は、RAG がどのように実行されるかを概略的に示しています。ナレッジベースは、このプロセスのいくつかのステップを自動化することで、RAG の設定と実装を簡素化します。

### データを前処理する
> プライベートデータから効果的に関連ドキュメントを取得できるようにするには、まずドキュメントを管理しやすいチャンクに分割するのが一般的です。その後、チャンクは埋め込みに変換され、元のドキュメントへのマッピングを維持したままベクトルインデックスに書き込まれます。これらの埋め込みは、クエリとデータソースからのテキストの意味上の類似性を判断するために使用されます。以下の図は、ベクトルデータベース用のデータの前処理を示しています。

- プライベートから効果的に関連ドキュメントを取得できるようにするには、ドキュメントを管理しやすいチャンクに分割するのが一般的である
- チャンクは埋め込みに変換され、元のドキュメントへのマッピングを維持したままベクトルインデックスに書き込まれる
- これらの埋め込みは、クエリとデータソースからのテキストの意味上の類似性を判断するために使用される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5c2f2f90-5f70-9bc0-481e-db9b54559b20.png)

※ 出典：[Amazon Bedrock のナレッジベースの仕組み](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/kb-how-it-works.html)

### ランタイムの実行
> 実行時には、埋め込みモデルを使用してユーザーのクエリをベクトルに変換します。次に、ドキュメントベクトルとユーザークエリベクトルを比較して、ベクトルインデックスをクエリしてユーザークエリの検索対象に意味的に類似したチャンクを検索します。最後のステップでは、ベクトルインデックスから取得したチャンクの追加コンテキストがユーザープロンプトに追加されます。その後、追加のコンテキストと共にプロンプトがモデルに送信され、ユーザーへのレスポンスが生成されます。以下の画像は、RAG が実行時にどのように動作してユーザークエリへのレスポンスを補強するかを示しています。

- 実行時に、埋め込みモデルを使用してユーザのクエリをベクトルに変換する
- ドキュメントベクトルとユーザクエリベクトルを比較し、ベクトルインデックスをクエリしユーザクエリの検索対象に意図的に類似したチャンクを検索する
- ベクトルインデックスから取得したチャンクの追加コンテキストがユーザプロンプトに追加される
- 追加のコンテキストとともにプロンプトがモデルに送信され、ユーザへのレスポンスが生成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/30597e1d-8f0d-a9ca-0755-40ac48adb502.png)

※ 出典：[Amazon Bedrock のナレッジベースの仕組み](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/kb-how-it-works.html)

## 同期してデータソースをナレッジベースに取り込む
> ナレッジベースを作成したら、データソースをナレッジベースに取り込み、インデックスを作成してクエリできるようにします。取り込みにより、データソース内の未加工データがベクター埋め込みに変換されます。また、未加工のテキストとフィルタリング用に設定した関連メタデータを関連付けて、クエリ処理を効率化します。

- ナレッジベース作成後、データソースをナレッジベースに取り込みインデックスを作成する
- 取り込みにより、データソース内のみ加工データがベクター埋め込みに変換される
- 未加工のテキストとフィルタリング用の設定した関連メタデータを関連させて、クエリ処理を効率化する

> 取り込みを開始する前に、データソースが次の条件を満たしていることを確認してください。
> - データソースの Amazon S3 バケットは、ナレッジベースと同じリージョンにあります。
> - ファイルはサポートされている形式です。詳細については、「サポート対象のベクターストアにナレッジベースのベクターインデックスを設定する」を参照してください。
> - ファイルは最大ファイルサイズの 50 MB を超えません。詳細については、「ナレッジベースのクォータ」を参照してください。
> - データソースにメタデータファイルが含まれている場合は、次の条件をチェックして、メタデータファイルが無視されないことを確認してください。
>   - .metadata.json各ファイルは、関連付けられているソースファイルと同じ名前を共有します。
>   - ナレッジベースのベクターインデックスが Amazon OpenSearch Serverless ベクターストアにある場合は、faissベクターインデックスがエンジンで設定されていることを確認してください。nmslibベクトルインデックスがエンジンで設定されている場合は、次のいずれかを実行する必要があります。
>     - コンソールで新しいナレッジベースを作成すると、Amazon Bedrock が Amazon OpenSearch サーバーレスのベクターインデックスを自動的に作成してくれます。
>     - ベクターストアに別のベクターインデックスを作成し、faissエンジンとして選択します。次に、新しいナレッジベースを作成し、新しいベクトルインデックスを指定します。
>   - ナレッジベースのベクターインデックスが Amazon Aurora データベースクラスターにある場合は、取り込みを開始する前に、インデックスのテーブルにメタデータファイルの各メタデータプロパティの列が含まれていることを確認してください。

- 条件
    - S3バケットとナレッジベースは同一リージョンであること
    - ファイルはサポートされている形式のみ
    - ファイルは最大50MB
    - データソースにメタデータファイルが含まれている場合、下記
        - .metadata.jsonは、各ファイルとソースと同じ名前にする
        - OpenSearchのベクターストアを使用する場合は
            - faissであること
            - nmslibベクトルインデックスがエンジンに設定されている場合
                - コンソールで新しく作る場合は、自動でベクターインデックスを作る
                - ベクターストアーに別のベクターインデックスを作成しfaissエンジンとして選択する。新しいナレッジベースを作成し、新しいベクトルインデックスを指定
        - ナレッジベースのベクターインデックスがAuroraにある場合は、取り込み開始前にインデックスのテーブルにメタデータファイルの各メタデータプロパティの列が含まれること


## Amazon Bedrock のナレッジベースでサポートされているリージョンとモデル
:::note info
2024/5/11現在の情報です。最新は[こちら](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-supported.html)をご確認ください
:::

- リージョン
    - US East (N. Virginia)
    - US West (Oregon)
    - Asia Pacific (Singapore)
    - Asia Pacific (Sydney)
    - Asia Pacific (Tokyo)
    - Europe (Frankfurt)

- Embeddingに使用できるモデル
    - Amazon Titan Embeddings G1 - Text
    - Cohere Embed (English)
    - Cohere Embed (Multilingual)
- ナレッジベースからの応答を生成できるモデル
    - Amazon Titan Text Premier
    - Anthropic Claude v2.0
    - Anthropic Claude v2.1
    - Anthropic Claude 3 Sonnet v1
    - Anthropic Claude 3 Haiku v1
    - Anthropic Claude Instant v1

# 実践
[Knowledge Bases for Amazon Bedrock (RAG) を活用して設計開発や研究における特許検索を効率化しよう](https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-rag-patent/)を元に試します。

特許データが保管されているデータソースを対象として、RAGを実行します。
下記のような構成により、応答を試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f51b8d30-9e8a-5587-fa81-38a2e07a09e2.png)

※出典：[Knowledge Bases for Amazon Bedrock (RAG) を活用して設計開発や研究における特許検索を効率化しよう](https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-rag-patent/)



## 前提

### S3バケットの用意
1. S3バケットを作成します

### データの準備
1. 下記の特許をダウンロードします
    - [JP2013174393A](https://patents.google.com/patent/JP2013174393A/ja)
    - [JP2013174394A](https://patents.google.com/patent/JP2013174394A/ja?oq=JP2013174394A)
    - [JP2014194291A](https://patents.google.com/patent/JP2014194291A/ja?oq=JP2014194291A)

1. S3バケットにアップロードします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ff8255b9-d867-7b9b-8f1d-d6998415d98b.png)

### レスポンスを生成するためのモデル

1. ナビゲーションペインで「ベースモデル」をクリックします
1. モデルアクセスを管理をクリックします
1. Anthropicの、「ユースケースの詳細」をクリックします
1. ポップアップが表示されるのでユースケースの詳細をクリックします
1. Claude3 Haikuを選択し、「変更を保存」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c4fcb2f1-5c09-2c1e-c4a5-871a2601bfc7.png)

## Knowledgeベースの構築

1. Bedrockに移動します
1. ナビゲーションペインで「ナレッジベース」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d47023a9-8656-f9e5-fb63-ca1db2d25098.png" width=180 />

1. 「ナレッジベースを作成」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9b3929c5-5e10-f7eb-6d46-f676d4d9bdab.png)


1. ①「ナレッジベース名」、IAM許可の②「新しいサービスロールを作成して使用」を入力し、「次へ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9099da6a-a8d0-5cb6-fc8a-e37b28ac3567.png)

1. ①「データソース名」、②「S3のURI」にはアップロードしたPDFのパスを入力し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/784dd704-d5e7-d310-7a31-63cbe4eaafcc.png)

1. 下記を選択し、「次へ」をクリックします
    - 埋め込みモデル：今回は「Titan Embedding G1 - Text」
    - ベクトルデータベース：今回は「新しいベクトルストアをクイック作成」
1. 確認画面で、「ナレッジベースを作成」をクリックします
1. 作成に数分かかりますので待ちます
1. できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/32b8d496-8818-bb87-f992-6e45473631dd.png)

1. OpenSearch Serviceにもコレクションができていました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0802c5a1-a16d-0910-69a4-05b1ac66714f.png)


## 同期してデータソースをKnowledgeベースに取り込む
1. 作成したナレッジベースを選択します
1. データソースセクションで「同期」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ec062a22-a8d4-af02-88cc-de400bed9436.png)
1. ステータスが「Syncing」になります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1a66f0b4-b108-606e-fd6d-30ba12ac00b1.png)
1. しばらくすると「 Available 」になります
1. データソースをクリックします
1. 同期履歴セクションで、先程実行した同期が確認できます 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6e151a45-5b22-3bf1-3a63-9de6b179bf31.png)





## テスト
1. ナビゲーションペインで「ナレッジベース」をクリックします
1. ナレッジベースセクションで対象のナレッジベースを選択し、「ナレッジベースをテスト」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c54038b2-01ff-ed36-5d25-24490b725fd2.png)
1. 画面右にテストウィンドウが開きます

### ナレッジベースから取得した情報を返す
1. 回答を生成をオフにします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/373af7ae-10dc-b9c4-61d4-aba2bbdaf400.png" width =300 />

1. 下記のメッセージに入れ、「実行」を押下します
「特許JP2013174393Aについて。この特許はどのような内容で、どのような点に新規性、進歩性があるのか、中学生にもわかる言葉で簡潔に説明してください。」

1. 下記の結果が返されました
    - ドキュメントの関連する箇所が返されているようですが、該当する文章を確認するとイマイチあっていないようにも見えます。
    - このあたりはベクター検索のエンジンがどのようなものかを私があまり理解してないので、妥当なのか判断つきません。今後、調べてみようと思います

>    1. JP 2014-194291 A 2014.10.9 10 (57)【要約】 【課題】エネルギ消費効率の高い極低温冷凍機を提供す る。 【解決手段】 　作動ガスを圧縮する圧縮機１と、 　圧縮機１により圧縮された作動ガスが流入出する空間 ４１を有するハウジング２３と、 　ハウジング２３に一端が連結され他端に膨張空間１１ ａ，１１ｂを有するシリンダ１０ａ，１０ｂと、シリン ダ１０ａ，１０ｂの内...
    2. シール材としては、例えばスリッパーシー ルを用いることができる。 【００８４】 　また、立設配管６１の収容部６２内への挿入深さは、第１段目ディスプレーサ３ａ移動 しても立設配管６１が収容部６２から離脱せず、接続状態を維持できる長さに設定されて いる。 【００８５】 　本実施形態に係るＧＭ冷凍機は、第１段目ディスプレーサ３ａとハウジング２３とを上 部室１３を介さず接続機構６０（立設配管６１，収容部６...
    3. JP 2013-174393 A 2013.9.5 10 (57)【要約】 【課題】冷媒ガスにより発生する圧力損失に係わらず、 モータに対して逆方向の力が作用することをなるべく抑 制して、モータのスリップを効果的に防止することがで きる極低温冷凍機を提供すること。 【解決手段】本発明による極低温冷凍機１は、シリンダ ２と、シリンダ２に対して往復運動するディスプレーサ ３と、を含み、ディスプ...
    4. さらに、螺合手段つまり変換手段はディスプレーサ２３に対して軸 方向にオーバーラップして位置する雄ネジ部２６ａ、雌ネジ部２３ａにより構成されるの で、従来技術に対して特に軸方向の寸法の短縮や部品点数の削減を図ることができる。 【００４９】 　以上本発明の好ましい実施例について詳細に説明したが、本発明は上述した実施例に制 限されることなく、本発明の範囲を逸脱することなく、上述した実施例に種々の変形およ...
    5. 【００３６】 　シリンダ２２はディスプレーサ２３を長手方向及びモータ５の軸方向に往復移動可能に 収容する。シリンダ２２には、強度、熱伝導率、ヘリウム遮断能の確保を主な観点として 例えばステンレス鋼が用いられる。 【００３７】 　シリンダ２２の高温端には、ディスプレーサ２３を往復駆動するためのモータ５が、デ (7) JP 2013-174394 A 2013.9.5 10 20...
 


### ナレッジベースから取得した情報を基にレスポンスを生成する
1. 回答を生成をオンにします
1. 「モデルを選択」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/41c28689-1816-2058-578c-fec9354ad077.png" width=300 />
1. ポップアップが表示されますので、モデルを選択し「適用」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9e845b3f-2e5f-8793-5b71-ee791ab5c30c.png)
1. 下記のメッセージを入力し、「実行」を押下します
「特許JP2013174393Aについて。この特許はどのような内容で、どのような点に新規性、進歩性があるのか、中学生にもわかる言葉で簡潔に説明してください。」

1. 下記の結果が返されました。上記のナレッジベースから直接取得したものと、比較してわかりやすくなっています

    > この特許は、極低温冷凍機に関するものです。極低温冷凍機は、圧縮機から供給される高圧の冷媒ガスを使って、非常に低い温度を作り出す装置です。 この特許の新しい点は、冷媒ガスの流れによって発生する圧力の変化を利用して、ディスプレーサ(冷媒ガスの流れを制御する部品)の動きを助けるための弾性手段を追加したことです。これにより、ディスプレーサの動きがスムーズになり、モーターの負荷が減少するため、より効率的に冷却できるようになりました。[1][2]

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1e5ca1ef-bb72-c4dd-86e7-37dc38861bab.png)

#### 既に特許が出願されているか
「新規発明案に対して、既に類似の特許が出願されているかを調べるのが困難という課題に対して、事前に確認する」ことを想定して質問してみます。

1. 下記のメッセージを入力し、「実行」を押下します
「モーターの回転運動を往復運動に変換するネジ螺合駆動形式の極低温冷凍機を発案しました。これによって従来の形式よりも機構部分の部品点数が少なくコストが低くできます。これと内容が重複する既存特許はデータソースの中にありますか？」

1. 下記の結果が返されました
    - 直接的に既存特許があるかは示されていませんが、特許文献5にあることがわかります
    > 特許文献 5 によると、本発明の極低温冷凍機は、シリンダと往復動するディスプレーサを有し、ディスプレーサの往復動を回転軸の回転運動から変換する際に、雄ネジ部と雌ネジ部からなる螺合手段を使用している。この螺合手段の一部をディスプレーサ自体に設けることで、部品点数の増加や外形寸法の大型化を招くことなく、より効果的にディスプレーサを往復動させることができる。また、通常のモータを使用できるため、コストアップを招かない。[1]

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2503ed5c-3cbd-7a38-490c-8e12ed05d4ab.png)


# 考察
今回、簡単ですがBedrockのKnowledge basesでRAGを試してみました。構築から実行までとても簡単に試せました。今後は、RAGを使用したアプリケーションを動作せてみたいと思います。

また、ベクター検索の知識が浅いので学習もしてみようと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base.html

https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-rag-patent/