Amazon Bedrockに新登場した「Knowledge base」を試してみた(Pinecone利用編)
2023年の「AWS Community Builders Advent Calendar」の記事では、Amazon BedrockにRAG(検索拡張生成)を行うためのナレッジベース機能が登場したことが紹介されています。記事では、ナレッジベースを利用するための準備や設定方法、テストの方法などが詳しく説明されています。Pineconeを使用した準備や設定方法、データソースの同期など、具体的な手順も紹介されています。また、テストを通じて回答結果を確認し、データソースの参照もできることが強調されています。RAGの実装は、LangChainなどと比較してノーコードで行えることが特徴的であり、Agent側は独自実装にすることも可能です。
目次
この記事は、「AWS Community Builders Advent Calendar 2023」4日目の記事です。
Amazon BedrockにRAG(検索拡張生成)を行うためのナレッジベース機能が登場しました。RAGはかなり興味のある分野ですので、早速触ってみました。
Knowledge baseを使うための下準備: Pinecone編
Knowledge baseを利用するには、Vector DBが必要です。AWSの場合はOpensearch Serviceを使うことになりますが、今回は別件で試し中だったPineconeを利用しました。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/d47fd64ba8f74f702f328c1cc9f23238-20231130125422.png?&d=1140)
AWSの外にあるリソースを利用するため、接続情報をAWSに保存する必要があります。Knowledge baseで利用するには、AWS Secrets Managerを利用しましょう。
[キー/値のペア]で利用するキー名は、公式のブログで紹介されている設定をそのまま使っています。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/0adb3cfb149d25df0f650233fbb14bfc-20231130132435.png?&d=1140)
シークレットの名前は、[Bedrock用のPineconeリソース情報]であることがわかればなんでも良いと思います。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/3ccf9d4e4328c434a75ef25cfd06ad44-20231130132518.png?&d=1140)
作成しました。[シークレットのARN]を後で使いますので、別タブで開いておくか、ARNをコピーしておきましょう。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/2bc5dbbf6ed6f2bb47dc21a798aee4bd-20231130132602.png?&d=1140)
Bedrock Knowledge baseを作ってみた
準備ができたので、早速作ってみましょう。[Create knowledge base]ボタンから作成を開始します。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/dbbb86310706916edc21e6f48a0a8962-20231130131925.png?&d=1140)
いつものウィザードが立ち上がってきます。まずはリソースの名前と説明、そして利用するIAMロールの設定を行います。IAMロールは新しく作る方法をとりました。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/ccf75892ba0271f0e9c4e129462d7627-20231130131958.png?&d=1140)
データソースにするS3バケットを指定します。[S3 URI]はs3://BUCKET_NAME
で登録しましょう。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/e83edf001dcf98c7a3f53982422c3702-20231130132005.png?&d=1140)
続いてEmbedding時に利用するモデルと、Embeddingされたベクトルデータを保存するDBを指定します。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/5b11b43db2393c844bfc658d2e07db46-20231130132051.png?&d=1140)
Pineconeを使う場合は、[Choose a vector store you have created]を選ぶ
今回はPineconeで作成済みのDBを利用します。そのため、[Choose a vector store you have created]を選びました。するとOpensearch Serverless / Pinecone / Redis Enterprise Cloudの3選択肢が出てきますので、[Pinecone]を選びましょう。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/12/80e1bebafe863f5b6005883a322432b4-20231201162947.png?&d=1140)
接続設定では以下の2項目が必要です。
- Connection String: PineconeのDB URL
- Credentials secret ARN: 事前準備で作成したSecrets ManagerのARN
「PineconeのDB URL」は、Pineconeのダッシュボードから取得できます。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/ebd85b14b00dcc7d251813945151e14f-20231130133216.png?&d=1140)
入力が終わると、このような感じになります。Secret ARNにダミーの値を入れているため、スクリーンショットではエラーになっていますが、正しいARNを入れていればOKです。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/ea31ce9acd2258671ec728376e49b9ec-20231130132741.png?&d=1140)
マッピング設定を行う
この辺りから知識不足による手探りが始まります。[Metadata field mapping]はひとまずPinecone側のブログを参考に、同じ値を入れるようにしました。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/a0c21537961a75096928af5d4189dc5f-20231130133353.png?&d=1140)
レビューとKnowledge base作成
最後に設定内容をレビューした後、作成を開始します。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/c2dd8ef15956de7c745fdaf2a83bca40-20231130133532.png?&d=1140)
数分足らずで立ち上がってきました。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/e86c616276b605596decd198a6e41f65-20231130133547.png?&d=1140)
データを更新した場合は、syncが必要な様子
knowledge baseが参照するデータはS3に配置する必要があります。ただし配置したデータはEmbedding処理される必要があるためか、[Sync]が必要でした。
ページをスクロールすると、[Data source]セクションがあります。そこでデータを更新したものを選択し、[Sync]しましょう。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/ef5a7daabb94f5d70aed65a34340f4e9-20231130133854.png?&d=1140)
テストデータとして、StripeのOpenAPI SpecificationをS3バケットにアップロードしてみました。Syncしてみたところ、PineconeのIndexからもデータを見ることができました。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/b98dba2ecadced39e9e9eff338c590fd-20231130134350.png?&d=1140)
「S3に元データ」そして「Knowledge baseの検索処理自体は、Vector DB」という使い分けになる様子ですね。
作成したKnowledgeベースをテストする
[Data source]のSyncが終わっている状態ならば、Knowledge baseのテストがマネージメントコンソールからできます。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/99682a6fdab568801b9ff0f6bb5c933c-20231130134458.png?&d=1140)
テストにつかうモデルを選びましょう。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/88b143bfa8c81ba439b3c821c403fa91-20231130134512.png?&d=1140)
モデルを選択すると、テストが行えるようになります。Stripeのドキュメントを投入しているので、How can we create a new subscription by using Stripe API?
と質問してみました。すると「/subscriptions
エンドポイントにPOSTを投げろ」や「price IDやCustomer IDなどが必要」など、Stripe APIの仕様に基づいた返事が返ってきます。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/3f56eec3d13c9b679a74bc9644e34477-20231130134733.png?&d=1140)
「Claudeならば日本語でもやりとりできるのでは?」と思い、日本語でも質問してみました。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/7535a5a851444d42ade3171222cd441f-20231130134853.png?&d=1140)
英文に比べると、少しそっけない気もしますが、回答自体は問題なさそうです。
参照したデータを確認できる
Knowledge baseが面白いなと思った点の1つが、「このデータを参照して回答文を作ったよ」を提示してくれることです。
テストでの返答文についている[Show result details]をクリックすると、参照したデータソースが表示されます。
![](https://wp-kyoto.cdn.rabify.me/wp-content/uploads/2023/11/f57c66d418b817a1dd4274e716392480-20231130134943.png?&d=1140)
「投入したデータを意図した通りに解釈しているか」や「なぜ意図しない返答をしているのか?何をみてそう判断したのか?」を調べるのに使えそうです。
触ってみての感想
LangChainでRAGを作る試行錯誤をやっていたからか、マネージメントコンソールの操作だけでほぼほぼ出来上がってきたのはなかなか衝撃です。「RAGのembedding / Index部分がノーコードでできるようになった」と捉えるのが、LangChainなどと比較する際の表現に近しいかもしれません。
また、Embeddingデータ自体はPineconeやOpensearchに投入されるため、「S3に置いたファイルを定期的にEmbeddingする仕組み」だけにKnowledge baseを使って、Agent側はLangChainなどを使った独自実装にするみたいなことも、理論上はできそうかなと思いました。