5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

re:Invent近辺のAWSアップデートを試してみる!Advent Calendar 2024

Day 7

BedrockナレッジベースでAurora Serverlessを使用する際の設定注意点

Posted at

2024年12月6月、Amazon Bedrock Knowledge Baseで用いるAmazon Auroraをクイック作成できるようになりました!

ナレッジベースの作成画面から数クリックで自動デプロイできるようになり、ナレッジベースを構築するハードルが非常に下がったと言えます。
image.png

また、作成されるのはAurora Serverless v2です。

11月20日にAurora Serverless v2(以下、Auroraと記述)が0個のAuroraキャパシティユニット(ACL)へのスケーリングがサポートされるようになりました。
これによって、DBを使用していない期間のコストを抑制することができるようになりました。

ただ、1点だけ注意点があります。
それは、ナレッジベースの作成画面からAuroraを作成すると、ゼロスケーリングに対応していないエンジンバージョンのAuroraが作成されることです。

実際に作成されたインスタンスの最小ACUを確認すると、0.5になっていました。
image.png

また、このクイック作成を用いると、デフォルトVPC上に作成されてしまうため、セキュリティの観点からもあまり良くありません。

自動作成された際のセキュリティグループは以下のルールが用いられていました。最小権限とはなんだったのか、結構ガバガバですよね…

インバウンドルール
image.png

アウトバウンドルール
image.png

したがって、ゼロスケーリングに対応したRAGを構築するためには、別途自分でAuroraを作成する必要があります。

ただ、それを実際行うにあたってどのように設定するのが適切なのかわからなかったため、実際に試して纏めてみました!

実際にやってみた!

構成図としては以下の感じです。
image.png

手順としては、

  • VPCを作成する
  • セキュリティグループを作成する
  • DBサブネットグループを作成する
  • Aurora Serverless v2を作成する
  • Secrets ManagerにAurora接続の認証情報を登録する
  • Auroraクラスターの設定を行う
  • S3を作成し、検証で使用するドキュメントを格納する
  • ナレッジベースを作成する

という流れになります。

VPCを作成する

今回はVPC内にAurora Serverless v2だけを配置する想定なので、サブネットはプライベートなものだけ作成すればOKです。
ただし、Aurora Serverlessの使用上、マルチAZにする必要があるため、プライベートサブネットは2つ以上作成しましょう。

image.png
image.png

セキュリティグループを作成する

以下のインバウンドルールを設定します。

  • プロトコル:TCP
  • ポート範囲:5432
  • ソース:このセキュリティグループ
    image.png

DBサブネットグループを作成する

Aurora ServerlessをVPCへ配置する際に、DBサブネットグループが必要になります。
先ほど作成したVPC上で作成していきましょう。
image.png

サブネットも先ほど作成した2つのプライベートサブネットを指定します。
image.png

Aurora Serverless v2を作成する

ゼロスケーリングに対応したAuroraをナレッジベースで使用したい場合は、以下の条件に従って作成する必要があるとのことです。

  • Aurora PostgreSQL DBクラスターのバージョン:
    • 16.3以降のすべてのバージョン
    • 15.7以降のバージョン
    • 14.12以降のバージョン
    • 13.15以降のバージョン
  • pgvector の拡張機能のバージョン
    • 0.5.0以降
  • RDS Data APIの有効化
  • AWS Secrets Managerで管理されるユーザー情報によるDB接続

また、詳しい手順に関しては、公式ドキュメントに纏められていました。


まず、RDSコンソールを開いてデータベースを作成していきます。
作成方法は「標準作成」、エンジンのオプションは「Aurora (PostgreSQL Compatible)」です。
image.png

エンジンバージョンは「16.4」を選択。
image.png

テンプレートは「開発/テスト」を設定し、DBクラスター識別子には任意の名前を指定します。
image.png

認証情報管理は「AWS Secrets Managerで管理」を選択します。
これを設定しないとナレッジベースで使えないそうです。
image.png

そしてインスタンスの設定で、「Serverless v2」を選択します。
ゼロスケーリングに対応したバージョンを使用していれば、容量の範囲で「0」が指定できます。
image.png

※対応していないバージョンを選択した場合、0.5が最小となります。
image.png

Auroraレプリカの作成は、今回は不要です。
image.png

続いて接続関連の設定です。先ほど作成したVPCやサブネットグループを指定していきます。
image.png

そして、パブリックアクセスはオフに設定します。AZも指定なしです。
セキュリティグループは先ほど作成したものを使用します。
image.png

RDS Data APIには必ずチェックを入れましょう。
image.png

RDS Data APiとは、永続的なデータベース接続を必要とせず、HTTPエンドポイントやAWS SDKを通じてDBにアクセスできる機能です。

主な概要としては、以下の4つです。

  • DBへのウェブサービスインターフェイスを提供
    ※ウェブサービスインターフェイス:HTTPプロトコルを使用してアプリケーション同士が通信するための標準化されたAPI
  • 永続的なデータベース接続が不要で、代わりにセキュアなHTTPエンドポイントを使用
  • AWS SDKとの統合が可能
  • AWS Secrets Managerに保存された認証情報を使用

また、用いるメリットとして、特にサーバーレスアーキテクチャやマイクロサービスでの利用に最適で、DB接続の管理やVPC設定の複雑さを軽減することができます。

特に不要であれば、Performance Insightsや拡張モニタリングは無効化しておきましょう。今回は検証なので無効にしておきます。
image.png

最後に任意のDB名を設定したら、作成していきます。
image.png

作成完了しました!
image.png

Auroraクラスターの設定を行う

コンソールのクエリエディタを用いて、マスターユーザーでPostgresDBへ接続します。
この時、Secrets Manager ARNには、先ほどDB作成時に設定したものを使用します。
image.png

以下のコマンドを実行して pgvector 拡張機能をインストールします。

-- pgvegtor 拡張機能のインストール
CREATE EXTENSION IF NOT EXISTS vector;

-- pgvector のバージョン確認
SELECT extversion FROM pg_extension WHERE extname='vector';

pgvector のバージョンは0.5.0以降であればOKです。
image.png

続いて以下のコマンドを実行します。
スキーマ名・ロール名は適宜変更してください。

また、'your password'の部分は任意の文字列を入力してください。
ただ、この後Secrets Managerの設定で使用するのでどこかにメモしておきましょう。

-- スキーマの作成
CREATE SCHEMA bedrock_knowledgebase;

-- ロールの作成
CREATE ROLE bedrock_user WITH PASSWORD 'your_password' LOGIN;
H14ijej9jfhaa021

-- スキーマに対する権限を付与
GRANT ALL ON SCHEMA bedrock_knowledgebase to bedrock_user;

コマンド実行時、画面下の「出力」のStatusが「success」になることを確認してください。


続いて、Secrets Managerでbedrock_user用のDB認証情報を作成します。
パスワードは先ほど設定したものを使用します。
image.png

image.png

シークレットが作成できたら、ARNをコピーします。
image.png


再びRDSのクエリエディタに戻り、今度はbedrock_userの認証情報を用いてDBに接続します。
エディタ内にある「データベースを変更する」から操作し、先ほどのシークレットのARNを貼り付けます。
image.png

image.png

接続できたら、以下のコマンドを実行してテーブルとインデックスを作成します。
テーブル名は適宜変更してください。

また、embedding vector(1024)の箇所については、ナレッジベースを作成する際に指定する埋め込みモデルのベクトル次元数を入力してください。
この値が一致していないとエラーになります。

参考は以下です。

  • Titan Text Embeddings V2: 256 or 512 or 1024
  • Titan Embeddings G1 - Text: 1536
  • Embed English: 1024
  • Embed Multilingual: 1024
-- テーブルの作成
CREATE TABLE bedrock_knowledgebase.dodeuce (id uuid PRIMARY KEY, embedding vector(1024), chunks text, metadata json);

-- インデックスの作成
CREATE INDEX on bedrock_knowledgebase.dodeuce USING hnsw (embedding vector_cosine_ops);

コマンド実行時、画面下の「出力」のStatusが「success」になることを確認してください。

上記コマンドによって、テキストデータのベクトル表現を格納し、効率的な類似度検索を可能にします。

ここまでできたら、データベースの設定は完了です!

S3を作成し検証で使用するドキュメントを格納する

適当にS3バケットを1つ作成し、その中にドキュメントを格納します。
image.png

以前、RAGを作成した際にWikipediaをPDF化して格納したところ、精度があまりにも低かったので、今回はWikipediaを要約したものをMarkdown形式で用意しました。

バケットの暗号化は任意ですが、今回はSSE-KMSで暗号化しました。
ここで使用するKMSキーを、この後ナレッジベースでも用いて復号化します。

ナレッジベースを作成する

いよいよナレッジベースを作成していきましょう。
最初はベクトルストアを選択します。
image.png

任意の名前をつけて作成を進めます。
image.png

データソースにはS3を指定。
image.png

その後、データソースの設定をしていきます。

S3 URIには、先ほど作成したS3のオブジェクトキーを指定します。
また、S3の暗号化にKMS CMKを使用した場合は、同じキーをここでも指定します。
image.png

Parsing strategy(変換戦略)、チャンキング戦略などはデフォルト設定でいきます。

埋め込みモデルは、CohereのMultilingual v3を指定します。
image.png

そしてベクトルデータベースの設定を行います。
「作成したベクトルストアを選択」し、「Amazon Aurora」を選択します。
image.png

そして、これまでに作成してきたAuroraやシークレットのARNなどを設定していきます。

  • Amazon Aurora DB クラスター ARN:arn:aws:rds:<region>:<account_id>:cluster:<your_cluster>
  • データベース名:任意のDB名(ここではknowledge_base_aurora)
  • テーブル名:任意のテーブル名(ここではbedrock_knowledgebase.dodeuce)
  • シークレットARN:arn:aws:secretsmanager:<region>:<account_id>:secert:<your_secert>
  • シークレット用のカスタマーマネージドKMSキー:シークレットをKMS CMKで暗号化した場合はここでKMSキーのARNを指定
    image.png

続いて、インデックスフィールドマッピングの設定をしていきます。
先ほど設定したdodeuceテーブルの定義とマッピングします。

  • ベクトルフィールド名:embedding
  • テキストフィールド名:chunks
  • Bedrockマネージドメタデータフィールド:metadata
  • プライマリキー:id

image.png

すべて入力を終えたら、ナレッジベースを作成しましょう!

※作業中にAuroraが自動停止した状態になっていると、下記エラーが発生します。
こうなると一度画面更新しないと作成成功しないようなので、ナレッジベース作成前にAuroraが起動しているかを確認しておくのをおすすめします。
image.png

上手く設定できていれば、ナレッジベースが完成します!
image.png

試してみる

実際の動作確認をしてみました!
image.png

うーん、合ってるけど、「すべて」ではないんですよね…
天皇賞・秋とジャパンカップが省略されている…

諦めずもう1つ聞いてみます。
image.png

だめだこりゃ!w

ということで精度がいまいち。
チャンクの設定が悪いのか、ドキュメントがまだ悪いのか…次回以降はちょっとこの辺り精度向上のために頑張ってみようと思います。

ただ、Auroraでベクトルストア作成したので、一々消さなくてもお金かからないのが嬉しいところですね!
(OpenSearch Serverlessは従量課金の上にめっちゃ高いので、検証終わるたびに消さないといけなかったんですよね…)

個人的に疑問に思っていたところ

最後に、今回の検証をやろうと思ったきっかけとその答えについて纏めておきます。

Q.Bedrockからプライベートサブネット内のAuroraにどうやって接続するのか?

検証前までは、VPCエンドポイントを立てて、エンドポイント経由でAuroraへアクセスする必要があるのかなーなどと考えていました。

しかし結論としては、不要でした。

Q.セキュリティグループは何を指定するべき?最小権限は?

ということで、インバウンドルールをなしにして、データソースの同期と実行をしてみます。
image.png

データソースの同期→成功
実行→成功
image.png

ということで、セキュリティグループは設定無しでOKそうですね。

ちなみにですが、クエリエディタに接続する際にも設定無しで良かったみたいです。
普通に接続できましたし、下記コマンドによるクエリも成功しました。

select * from bedrock_knowledgebase.dodeuce limit 10;

image.png

なぜこうなるのか?

RDS Data APiを用いているから、と私は結論付けました。

Data APIを用いることで、Auroraを他のAWSリソースと統合することができます。
VPC内のAuroraへアクセスするために、Lambda関数を設定することなく、DBクラスターにアクセスできます。

HTTPエンドポイントを用いてAuroraへのアクセスが可能になるため、そもそもVPCを経由しておらず、その結果VPCエンドポイントは不要なのだと思います。

(間違ってたらコメント等で教えて下さい!)

まとめ

ちょっと設定は大変ですが、一度構築できるとその後はかなり恩恵が大きいです!
今度はこれとGraphRAGの精度を比較してみようと思います!

参考にさせていただいたページ

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?