😽

【Amazon Aurora Serverless v2・Amazon Bedrock】手動でベクトルDBを作成してRAGを作成してみよう

に公開

はじめに

Amazon Bedrockのナレッジベースを使用すれば、OpenSearch ServerlessやAmazon Aurora Serverless v2をプロビジョニングでき、簡単にRAGシステムを作ることができます。

自動プロビジョニングは非常に便利な機能ですが、この機能は裏でCloudFormationを使用してデフォルトVPCにデータベースの作成やテーブルの作成などを行っています。
そのため、既存のVPCやサブネット、データベースのプライベートサブネットへの配置など、事前に作成済みのリソースを使用してデータベースを構築したい場合は、自動プロビジョニング機能を利用することができません。

そこで今回は、すべて手動でAmazon Aurora Serverless v2を作成し、ベクトルDBの設定をして、Amazon Bedrock ナレッジベースを活用したRAGシステムの実装方法について解説します。

Amazon Aurora Serverless v2を選択する理由

ベクトルDBの選択肢として、OpenSearch ServerlessやPineconeなど様々な選択肢がありますが、今回Aurora Serverless v2を選択する理由は以下の通りです。

コスト効率: 使用した分だけの従量課金で、アイドル時は最小容量まで自動スケールダウン
最小容量0にしてしまうとリクエスト時にコールドスタートしてしまうので注意。

PostgreSQLの豊富な機能: pgvectorエクステンションによる高性能なベクトル検索に加え、RDBMSとしての堅牢なデータ管理機能
既存システムとの親和性: 多くの企業で採用されているPostgreSQLベースのため、既存のデータベース運用ノウハウを活用可能
AWSマネージドサービス: バックアップ、パッチ適用、監視などの運用負荷を軽減
セキュリティ: VPC内でのプライベート配置、IAMによる細かなアクセス制御が可能

作成するリソース一覧

ネットワーク関連

  • VPC
  • サブネット
  • NATゲートウェイ
  • インターネットゲートウェイ
  • ルートテーブル

セキュリティ関連

  • シークレットマネージャー
    • マスターユーザー用(Aurora作成時自動生成)
    • アプリケーションで使用するユーザー用
  • セキュリティグループ(Aurora用)
  • IAMロール(Bedrockナレッジベース用)

データベース関連

  • Aurora PostgreSQL Serverless v2
    • ベクトルDB設計(pgvector)
    • サブネットグループ

AI/ML関連

  • S3
    • RAG用データソース
  • Amazon Bedrock ナレッジベース
    • 埋め込みモデル:Titan Text Embeddings v2

実装

VPC,サブネット,NATゲートウェイ,インターネットゲートウェイ,ルートテーブル

データベースはプライベートサブネットに配置するので、
パブリックサブネット2個とプライベートサブネット2個を作成していきます。

セキュリティグループ(Aurora用)

Aurora PostgreSQL Serverless v2用のセキュリティグループを作成します。

インバウンドルール

  • タイプPostgreSQL
  • プロトコルTCP
  • ポート範囲5432
  • ソースカスタム
  • 対象自分のセキュリティグループ ID
    ※同じセキュリティグループ内からのみアクセス許可

アウトバウンドルール

  • タイプすべてのトラフィック
  • プロトコルすべて
  • ポート範囲すべて
  • ソースカスタム
  • 対象0.0.0.0/0

シークレットマネージャー

マスターユーザー用はAurora作成時に自動生成されるので、アプリケーションで使用するユーザー用のシークレットを作成していきます。
もちろんマスターユーザー用を独自に作成することも可能です。

  • マスターユーザー:DBA作業用
  • アプリケーションユーザー:Bedrock ナレッジベース専用

後々にクエリエディタでログインする際に使用しますので、キーをusernamepasswordにするように作成してください。

Aurora PostgreSQL Serverless v2

まずは、サブネットグループを作成しましょう。
プライベートサブネットをグループに含めます。

では、いよいよデータベースの作成に入ります。

  • エンジンのタイプAurora (PostgreSQL Compatible)

  • バージョンAurora PostgreSQL (Compatible with PostgreSQL 16.6)

  • DB クラスター識別子oishi-bedrock-knowledge-base-cluster

  • マスターユーザー名BedrockAdmin

  • 認証情報管理AWS Secrets Manager で管理

  • 暗号化キーを選択aws/secretsmanager (デフォルト)

  • クラスターストレージ設定>設定オプションAurora スタンダード

  • インスタンスの設定>DB インスタンスクラスServerless v2

  • 容量の範囲>最小キャパシティ (ACU)0.5

  • 容量の範囲>最大キャパシティ (ACU)16

  • マルチ AZ 配置EC2 コンピューティングリソースに接続しない

  • コンピューティングリソースAurora レプリカを作成しない

  • ネットワークタイプIPv4

  • VPC事前に設定したVPC

  • DB サブネットグループ事前に設定したサブネットグループ

  • パブリックアクセス 情報なし

  • VPC セキュリティグループ事前に設定したセキュリティグループ

  • アベイラビリティーゾーンap-northeast-1a

  • 認証機関rds-ca-rsa2048-g1 (デフォルト)

  • RDS Data API有効化  ★重要!

  • データベースポート5432

  • リードレプリカの書き込み転送オフ

以下画像の通り

  • 最初のデータベース名Bedrock_Knowledge_Base_Cluster
  • DB クラスターのパラメータグループdefault.aurora-postgresql16
  • DB パラメータグループdefault.aurora-postgresql16
  • オプショングループdefault.aurora-postgresql16
  • 暗号を有効化オン:(default) aws/rds
  • 削除保護の有効化オフ

これでデータベースを作成しましょう!

アプリケーション用ユーザー作成

ここからデータベース内に入り、設定をしていきます。
わざわざ踏み台サーバー等を用意しなくても、Data APIを有効化していれば、クエリエディタが使用できます。これでマネジメントコンソールからSQL文を実行できます。

詳しくはこちらを参照ください。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/query-editor.html
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/query-editor-v2.html

まず、アプリケーション用ユーザーを作成するためにマスターユーザーでログインします。
ここでのシークレットマネージャーのARNはAurora作成時に自動で作成されたものですので、ご注意ください。

以下のSQL文を実行していきます。一列ごとでも、全文でもどちらでもOKです。実行をクリックしましょう。
StatusSuccessになったら成功です。

sql
-- pgvectorを有効化
CREATE EXTENSION IF NOT EXISTS vector;
-- アプリケーションユーザーを作成
CREATE ROLE bedrock_user WITH LOGIN PASSWORD 'アプリケーション用ユーザーパスワード';
-- スキーマ作成権限を付与
GRANT CREATE ON DATABASE "データベース名" TO bedrock_user;

-- ※(必要に応じて)パスワード変えるとき
ALTER ROLE bedrock_user WITH PASSWORD 'xxx';

次に、スキーマとテーブルを作成していきます。
まず、データベースを変更するをクリックして、アプリケーションユーザーのシークレットマネージャーに変更してログインしましょう。

ログインできたら以下のSQLを実行していきます。

sql
-- スキーマ作成
CREATE SCHEMA bedrock_integration;

-- テーブル作成
CREATE TABLE bedrock_integration.bedrock_knowledge_base (
    id uuid PRIMARY KEY,
    embedding vector(1024),
    chunks text,
    metadata jsonb,
    custommetadata jsonb
);

-- ベクター検索用インデックス
CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING hnsw (embedding vector_cosine_ops);

-- テキスト検索用インデックス
CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING gin (to_tsvector('simple'::regconfig, chunks));

-- カスタムメタデータ検索用インデックス
CREATE INDEX ON bedrock_integration.bedrock_knowledge_base
USING gin (custommetadata);

お疲れ様でした!
これでデータベースの設定は完了です!

RAG用 S3バケット

データソースを保管しておく為のS3バケットを作成します。
特に設定はないので、デフォルトで大丈夫です。

IAMロール(Bedrockナレッジベース用)

Bedrockナレッジベースがデータベースやシークレットマネージャーなどにアクセスできるようにロールを作成します。
amazon.titan-embed-text-v2:0はお使いの埋め込みモデルで設定してください。
ポリシーを2つ作ります。

ポリシー作成

  • BedrockExecution-Policy
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"bedrock:InvokeModel"
			],
			"Resource": [
				"arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v2:0"
			],
			"Effect": "Allow",
			"Sid": "BedrockInvokeModelStatement"
		},
		{
			"Action": [
				"rds:DescribeDBClusters"
			],
			"Resource": [
				"arn:aws:rds:ap-northeast-1:アカウントID:cluster:oishi-bedrock-knowledge-base-cluster"
			],
			"Effect": "Allow",
			"Sid": "RdsDescribeStatementID"
		},
		{
			"Action": [
				"rds-data:ExecuteStatement",
				"rds-data:BatchExecuteStatement"
			],
			"Resource": [
				"arn:aws:rds:ap-northeast-1:アカウントID:cluster:oishi-bedrock-knowledge-base-cluster"
			],
			"Effect": "Allow",
			"Sid": "DataAPIStatementID"
		},
		{
			"Action": [
				"secretsmanager:GetSecretValue"
			],
			"Resource": [
				" アプリケーションユーザーのシークレットマネージャーのARN"
			],
			"Effect": "Allow",
			"Sid": "SecretsManagerGetStatement"
		}
	]
}
  • Bedrock-S3-Policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": [
                        "アカウントID"
                    ]
                }
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::RAG用S3のバケット名"
            ],
            "Effect": "Allow",
            "Sid": "S3ListBucketStatement"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": [
                        "アカウントID"
                    ]
                }
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::RAG用S3のバケット名/*"
            ],
            "Effect": "Allow",
            "Sid": "S3GetObjectStatement"
        }
    ]
}

上記2つをアタッチしたポリシーを作成します。
ここでは、BedrockExecutionRoleとしておきます。

Amazon Bedrock ナレッジベース

いよいよナレッジベースの作成です。

下記の画面から新規作成していきましょう。

  • ナレッジベース名任意

  • サービスロール先ほど作成したロール(BedrockExecutionRole)

  • データソースS3

  • データソース名任意

  • S3 の URI先ほど作成したS3バケット

  • チャギング戦略任意

  • 埋め込みモデルTitan Text Embeddings v2(任意:ポリシー設定忘れずに)

  • ベクトルストアの作成方法既存のベクトルストアを選択
    ★ここで新規作成を選んでしまうと今までの苦労が水の泡です。。

  • ベクトルストアAurora

  • Amazon Aurora DB クラスター ARN作成したDB参照
    ★ここのARNはデータベースのARNです。インスタンスのARNを指定しないように注意してください。

  • データベース名Bedrock_Knowledge_Base_Cluster

  • テーブル名bedrock_integration.bedrock_knowledge_base

  • シークレットARNアプリケーションユーザーのシークレットARN

  • シークレットARNアプリケーションユーザーのシークレットARN

  • ベクトルフィールド名embedding

  • テキストフィールド名chunks

  • メタデータフィールド名metadata

  • プライマリキーid

これでナレッジベースの作成は完了です!!

データソース同期

作成が完了したら、ベクトルDB(Aurora)に埋め込みモデルを使用して、データソースをベクトル変換していきます。
ここは1クリックで完了します。

作成したナレッジベースのデータソースにチェックを入れた状態で同期をクリックします。

もし警告が出る場合は、データソースが対応していない可能性があります。
以下を参照してください。
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-ds.html

成功したら全体の完成です!!

テスト

では、作成したものをテストしていきましょう。

以下のナレッジベースをテストをクリックします。

使用したい基盤モデルを選択します。
プロンプトでデータソース内に関するものを入力してみましょう。
回答が得られればRAGの完成です!

  • モデルが選択できない場合は、以下から使いたいモデルのアクセスを有効化しましょう。

  • モデルの料金について
    https://aws.amazon.com/jp/bedrock/pricing/

  • Claudeモデルは1分間のリクエストに制限があることがあるので、確認しましょう。
    Service Quotasでrequests per minute for Anthropic Claude 3.5 Sonnetなどと検索すれば確認できます。クォータ値を上げたい場合は、サポートに連絡して上げてもらいましょう。

おわりに

本記事では、Amazon Aurora Serverless v2とAmazon Bedrockを使用して、手動でベクトルDBを構築しRAGシステムを実装する方法について解説しました。
自動プロビジョニング機能とは異なり、既存のVPCやセキュリティ要件に合わせてカスタマイズしたデータベース環境を構築することができました。

機能的にはOpenSearch Serverlessを使用したいところですが、料金のことを考えるとAurora Serverless v2も選択の一つに入ってくると思います。

手動での構築は工数がかかりますが、セキュリティ要件やネットワーク構成をより細かく制御できるメリットがあります。
今回の実装手順が、参考になれば幸いです。

GitHubで編集を提案

Discussion