[アップデート] Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました。
Amazon OpenSearch Managed Cluster
まず、 Amazon OpenSearch は、検索および分析エンジン OSS である OpenSearch を利用できるフルマネージドサービスです。
Amazon OpenSearch Managed Cluster は Amazon OpenSearch のデプロイ方法の 1 つで、OpenSearch Serverless とは違い、クラスターのインスタンスタイプやノード数などのインフラストラクチャの設定・管理を自分で行います。
その他の違いついては、以下のドキュメントにまとまっていますのでご覧ください。
コスト
Amazon OpenSearch Serverless は OCU の利用料に基づいて課金が行われます。使用状況に応じて最大/最小 OCU の中から自動的に垂直スケーリングされるのは非常にメリットであるものの、ミニマムでも月額 $174 が発生します。それに比べ、OpenSearch Managed Cluster の場合、ミニマムでは $41 になります。
すべてがすべて安ければ良い!と言ったわけではないですが、 Amazon OpenSearch Serverless に比べて、無視できないくらいの価格差があるため、たとえば開発環境は OpenSearch Managed Cluster で運用するなどのコストカットが見込めます。
プラグイン
Amazon OpenSearch には形態素解析などのプラグインが用意されています。
日本語に有効な形態素解析プラグインには kuromoji と Sudachi が用意されています。
Amazon OpenSearch Serverless では kuromoji が利用可能となっていますが、 Sudachi は利用できません。
このように、他のプラグインを利用してみたいなどのケースでは OpenSearch Managed Cluster が選択肢に入ってくる可能性があります。
やってみた
実際に Amazon OpenSearch Managed Cluster を利用して、ナレッジベースをホストしてみます。
OpenSearch Managed Cluster では、認証認可にいくつかの仕組みがあるのですが、今回は以下のパターンで作成します。
- きめ細やかなアクセスコントロール:有効
- アクセスポリシー:すべて許可(きめ細やかなアクセスコントロール側で制御)
- インデックスの管理:マスターユーザーから GUI で管理
- ナレッジベースからの接続:きめ細やかなアクセスコントロールでサービスロールからのアクセスを許可する
ドメインの作成
まずはドメインの作成です。
OpenSearch コンソールからドメインの作成をクリックします。いくつかカスタマイズしたい項目があるため、標準作成をクリックします。検証のため、開発/テストのテンプレートを利用します。

続いて、デプロイオプションです。今回はミニマムにこだわりたいため、スタンバイは無効、AZ 数は 1 つのクラスターを作成します。エンジンバージョンは、最新のものを選びます。
もし、バイナリエンベディングを行うのであれば v2.16 以上、k-NN インデックスを利用するのであれば、v2.13 以上が必要になります。
For Version, if you're using binary vector embeddings, Amazon Bedrock Knowledge Bases requires an Engine version of 2.16 or later. In addition, a version of 2.13 or higher is required to create a k-nn index. For more information, see K-NN Search in the Amazon OpenSearch Service developer guide.
Prerequisites for using a vector store you created for a knowledge base - Amazon Bedrock

続いてインスタンスタイプとノード数の設定です。ノードは 1、インスタンスタイプも最小の t3.small.search を利用します。

ストレージも最小の 10 GB を選択しました。

ネットワークです。
Amazon Bedrock Knowledge bases の場合、パブリックアクセスが必要になります。VPC でホスティングしないよう注意してください。
For Network, you must choose Public access. OpenSearch domains that are behind a VPC are not supported for your Knowledge Base.
きめ細やかなアクセスコントロールを利用します。 GUI で操作したいため、マスターユーザーを ID/Password で作成します。
Prerequisites for using a vector store you created for a knowledge base - Amazon Bedrock

最後にアクセスポリシーです。認可はきめ細やかなアクセスコントロール(Fine-grained access control)側で制御するため、こちらはすべて許可で作成します。

インデックスの作成
ドメインの作成が完了したのちに、OpenSearch Dashboards の URL (デュアルスタック) から OpenSearch へアクセスします。

作成したマスターユーザー名でログインします。

インデックスの作成を行うために Dev Tools を開きます。

次のクエリを流します。dimension の部分は、エンベディングモデルの次元数に沿った値を設定します。(今回は Titan Text Embeddings V2 を利用します。)
インデックス名(blog-index)やフィールド名(blog-vector, AMAZON_BEDROCK_METADATA, AMAZON_BEDROCK_TEXT_CHUNK)は適宜好きな名前に修正しましょう。
PUT /blog-index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"blog-vector": {
"type": "knn_vector",
"dimension": 1024,
"space_type": "l2",
"method": {
"name": "hnsw",
"engine": "faiss",
"parameters": {
"ef_construction": 128,
"m": 24
}
}
},
"AMAZON_BEDROCK_METADATA": {
"type": "text",
"index": "false"
},
"AMAZON_BEDROCK_TEXT_CHUNK": {
"type": "text",
"index": "true"
}
}
}
}
Prerequisites for using a vector store you created for a knowledge base - Amazon Bedrock
ステータスコードに 200 が返ってきていたら OK です。

試しに GET してみましたが、うまく作成できているようです。
GET /blog-index

S3 バケットの作成
画面を行き来しますが、RAG 用の元データを保管する用の S3 バケットを作成しましょう。
今回は桃太郎の内容を S3 バケットに保管しました。

IAM
ナレッジベース用の IAM ロールを作成します。信頼ポリシーは以下を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AmazonBedrockKnowledgeBaseTrustPolicy",
"Effect": "Allow",
"Principal": {
"Service": "bedrock.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "アカウントID"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:bedrock:リージョン:アカウントID:knowledge-base/*"
}
}
}
]
}

IAM ポリシー
以下のポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockInvokeModelStatement",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": [
"arn:aws:bedrock:ap-northeast-1::foundation-model/モデルID"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OpenSearchManagedClusterIndexAccess",
"Effect": "Allow",
"Action": [
"es:ESHttpGet",
"es:ESHttpPost",
"es:ESHttpPut",
"es:ESHttpDelete"
],
"Resource": [
"arn:aws:es:ap-northeast-1:アカウントID:domain/ドメイン名/インデックス名/*"
]
},
{
"Sid": "OpenSearchManagedClusterGetIndexAccess",
"Effect": "Allow",
"Action": [
"es:ESHttpGet",
"es:ESHttpHead"
],
"Resource": [
"arn:aws:es:ap-northeast-1:アカウントID:domain/ドメイン名/インデックス名"
]
},
{
"Sid": "OpenSearchManagedClusterDomainValidation",
"Effect": "Allow",
"Action": [
"es:DescribeDomain"
],
"Resource": [
"arn:aws:es:ap-northeast-1:アカウントID:domain/ドメイン名"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3ListBucketStatement",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::バケット名"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": [
"アカウントID"
]
}
}
},
{
"Sid": "S3GetObjectStatement",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::バケット名/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": [
"アカウントID"
]
}
}
}
]
}
きめ細やかなアクセスコントロール
後半戦です。OpenSearch 側で先ほど作成した IAM ロールからのアクセスを許可します。
再度 OpenSearch ダッシュボードに戻り、 Security をクリックします。

ロールを作成します。

ロール名には kb_opensearch_role と言った任意の名前を付与し、クラスターの権限には以下を追加します。
indices:data/read/msearchindices:data/write/bulk*indices:data/read/mget*

続いてインデックスに対する権限を付与します。アクショングループを新規で作成し、ロール名に紐づけます。再度、Security から Permission へ移り、Create from blank をクリックします。

アクショングループ名にも任意の名前(KnowledgeBasesActionGroup)を付与し、権限は以下を追加します
indices:admin/getindices:data/read/msearchindices:data/read/searchindices:data/write/indexindices:data/write/updateindices:data/write/deleteindices:data/write/delete/byqueryindices:data/write/bulk*indices:admin/mapping/putindices:data/read/mget*

ロールとアクショングループを紐付けます。Security から Roles を開き、先ほど作成したロールを選択したのちに Edit をクリックします。

インデックス名(blog-index)、アクショングループの組み合わせで、ロールへ権限を付与します。

最後に OpenSearch で作成したロールと、IAM ロールを紐付けます。Mapped users からロールをマッピングします。

Backend roles に IAM ロールの ARN を入力し、保存します。

ナレッジベースの作成
最後のステップです。ナレッジベースの作成を行います。まずは先ほど作成した IAM ロールを利用するよう変更します。

S3 も先ほど作成したバケットを選びます。

エンベディングモデルとベクトルデータベースを選びます。OpenSearch Managed Cluster が出現していますね。

ドメイン ARN やエンドポイント、インデックス名、フィールド名と入力項目が多いですが、対応する値を入力して作成をクリックします。


作成できたらデータソースの同期を行いましょう。

うまく同期できました。

質問をするとうまく返ってきていますね。また、OpenSearch 特有のハイブリッド検索も問題なく利用できそうです。

まとめ
以上、「Amazon Bedrock Knowledge bases のベクトルデータベースに新しく Amazon OpenSearch Managed Cluster がサポートされました。」でした。
プラグインなどのカスタマイズ性に加え、コスト感もグッと抑えられる部分は非常に魅力的ですね。
このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!






