[アップデート] 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/msearch
indices:data/write/bulk*
indices:data/read/mget*
続いてインデックスに対する権限を付与します。アクショングループを新規で作成し、ロール名に紐づけます。再度、Security から Permission へ移り、Create from blank をクリックします。
アクショングループ名にも任意の名前(KnowledgeBasesActionGroup
)を付与し、権限は以下を追加します
indices:admin/get
indices:data/read/msearch
indices:data/read/search
indices:data/write/index
indices:data/write/update
indices:data/write/delete
indices:data/write/delete/byquery
indices:data/write/bulk*
indices:admin/mapping/put
indices: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_)でした!