【初心者向け手順書】Knowledge Base for Amazon Bedrock × Pinecone で格安RAG構築🚀

## 作業内容
・AWS マネジメントコンソール上で Knowledge Base を作成
・Vector Database である Pinecone の準備
・自分の好きなファイルを S3 にアップロードし、コンソール上でテスト

初心者向けとして細かめにまとめたつもりです🔰
※ アップデートの多いサービスですので、手順に若干の違いがありましたらすみません

## そもそも Knowledge Base for Amazon Bedrock とは？

Knowledge Base を使用すると、Amazon Bedrock 内から FM をデータソースに接続して検索拡張生成（RAG）を簡単に構築することができます。

※ RAG とは LLM が外部の DB から情報を取得し回答する仕組みで、これにより企業独自の情報に基づいた回答ができたり、ハルシネーション（生成AIが事実とは異なる内容の生成してしまう現象）を防いだりすることができます。

AWS 公式ブログ
https://aws.amazon.com/jp/what-is/retrieval-augmented-generation/

Bedrock で RAG を構築する方法として Amazon Kendra を使う方法もありますが、
Knowledge Base で実装すると
☑️ コード不要（AWS マネージド）で簡単に実現できるので、開発期間の短縮が可能
☑️ モデルを継続的にトレーニングする必要がないので、費用対効果が良い
といったメリットがあるので、Knowledge Base を活用することにしました。

RAG のフロー処理を一から開発しないでできる（設定はあってもコンソールポチポチ程度）ので、開発の負担がかなり軽減されますね🥳

さらに今回は、Vector Store として [Pinecone](https://www.pinecone.io/) というものを使います。
無料（クレカ登録も無し）で利用できるので、こちらと組み合わせることで気軽に始めることができます

## 前提
・AWS アカウントを持っていて、IAM ユーザーでサインインできる状態
・Amazon Bedrock にて以下のモデルが有効になっている状態
　※ 有効化できていない場合は[こちら](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-access.html)の手順に従って有効化してください
>・Claude
・Titan Embeddings G1 - Text

## 手順
### Pinecone の準備

以下のサイトからアカウントを作成し、ログインした状態にします。

https://www.pinecone.io/

クレカ登録なしの無料（Starter）プランで利用します。
1つのプロジェクトしか作成できない等の制約はありますが、今回は無料プランで充分です👍🏻

Indexを新規作成します。
![Screenshot 2024-03-29 at 20.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/2db48c90-36db-d007-ab32-76247ca54c39.png)

・index名は適当に `Chatbot/bedrock-test` とします
・Dimensions は `1536` を指定（後ほど Bedrock で使用することになる `Amazon Titan Embeddings G1 - Text v1.2` の Dimensions が `1536` であるため）
・Metric は `cosine` を選択
・「Starter」プランが選択されていることを確認

その他はデフォルトのまま Index を作成します。
以下の2つは、Bedrock 側で使用するので確認しておきます。

> ・Index の「HOST」（https://bedrock-test〜）
・API KEYS の「Value」

![Screenshot 2024-03-29 at 20.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/5744ae32-49fe-96c7-4b68-e28b77dd5b92.png)


### API KEY を AWS Secrets Manager に保存

AWS マネジメントコンソールにサインインします。
※ 必ず「バージニア北部」リージョンになっていることを確認

AWS Secrets Manager に移動し、「新しいシークレットを保存する」から
・「その他のシークレットのタイプ」を選択
・キーは `apiKey`、値は先ほどの pinocone の API KEYS の「Value」
・シークレットの名前は好きなものにします。

![Screenshot 2024-03-29 at 22.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/44c30657-884d-51b6-78ca-b7f1bbdf1cb0.png)

↑ キーは `apiKey`です。`apikey`など大文字小文字を間違えるとうまくいかないです。


### S3 バケットを作成

※ バージニア北部リージョンにて作業
S3 に移動し、デフォルトの設定で Bedrock 用の S3 バケットを作成します（手順略）。


### Knowledge base の作成

※ バージニア北部リージョンにて作業
Amazon Bedrock に移動し、コンソールからナレッジベースを作成していきます。

![Screenshot 2024-03-29 at 20.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/88894d0f-e32c-d32a-a37a-f28604e413d4.png)

#### ステップ 1 : ナレッジベースの詳細を入力

・ナレッジベース名：好きな名前を入力
・IAM ロール：新規作成

![Screenshot 2024-03-29 at 20.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/940297cd-6108-f4a9-9f71-44d44b77afb0.png)
「次へ」をクリック

#### ステップ 2 : データソースを設定

・データソース名：デフォルト
・S3 URI：先ほど作成したバケットを指定

![Screenshot 2024-03-29 at 21.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/36ac2238-97b8-2baf-f5d7-e26c1e6867dc.png)
「次へ」をクリック

#### ステップ 3 : 埋め込みモデルを選択し、ベクトルストアを設定する

・Embeddings Model： `Amazon Titan Embeddings G1 - Text v1.2` を選択
・ベクトルデータベース： `Pinecone` を選択

![Screenshot 2024-03-29 at 21.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/278118dd-6289-0d3a-4d04-cdffd4da5465.png)

・エンドポイント URL：pinecone の `Index > HOST > URL` を入力
・認証情報シークレット ARN：先ほど作成した AWS Secrets Manager のシークレットの ARN を入力（arn:aws:secretsmanager:us-east-1:XXXX〜）
・テキストフィールド： `text`
・Bedrock マネージドメタデータフィールド：`metadata` を入力

「次へ」をクリック

#### ステップ 4 : 確認して作成

これでナレッジベースが作成されます。


### 好きなファイルを S3 にアップロード＆ナレッジベースと同期

ナレッジベースで指定した S3 バケットに Vector 化したいデータをアップロードします。好きなデータでいいですが、今回は BlackBelt の S3 の資料を使ってみます。

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-S3-CostOptimization_0602_v1.pdf

※ ナレッジベースのデータソースとしてサポートされているファイル形式には制限があるので、[こちら](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-ds.html)を参考にしてください。

S3 にデータをアップロードしたら、ナレッジベース内のデータソースの「同期」ボタンをクリックします。

![Screenshot 2024-03-29 at 22.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/49ae7f55-0795-80c1-21d2-4ea8d223fde8.png)

アップロードしたデータ量によっては時間がかかるかもしれません。
ステータスが `Ready` になったら準備完了です。

### Pinecone を確認

Pinecone に反映されているか確認します。

![Screenshot 2024-03-29 at 22.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/dcbe00f4-251c-7a04-df23-0815536df400.png)

先ほどアップロードしたデータが Vector されていることが確認できました！

### ナレッジベースをテスト
作成したナレッジベースをコンソール上でテストしてみます。
モデルは Anthropic の Claude v2 を選択し、適用します。

![Screenshot 2024-03-29 at 23.20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/57534665-9e11-69cf-9af3-b3b249332bad.png)

正確な回答が返ってきました！🎉
今回は少しのデータしか同期していませんが、もっと増やせば会話内容がより豊富になりでそうですね。

![Screenshot 2024-03-30 at 23.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1809963/8d99c36e-2823-884a-c2df-604a57394818.png)


## まとめ
生成AI の開発というとお金と時間がかかるイメージでしたが、コンソール上でこんなに簡単に RAG が構築できるなんて驚きました！
Bedeock の中でも最近特にアップデートの多いナレッジベース、これからも注目です👀
既に新機能が出ているので、どんどん試していきたいと思います！

続編として、今回作成したナレッジベースと LINE Messaging API を連携させて、LINE 上でこのチャットができるようにしていきます（準備中🌱）

最後までお読みいただきありがとうございました！
※必要に応じて、リソースの削除も忘れずに！※