S3 Vectors+Knowledge BaseでFilterable metadataのサイズについて怒られた【S3 Vectors】
はじめに
どうも、bunbookです。普段はAWSのAI系サービスをメインに扱っています。Xも良ければフォローしてください。↓
前回の記事↓
結論
急いでいる人用。
Knowledge Base+S3 VectorでデータのSync時に発生するFilterable metadata must have at most 2048 bytes
のエラーは、S3 Vector BucketをKnowledge Base作成フローのQuick create a new vector store - Recommended
から作れば基本的に解消される。
また、既存のVectorバケットを利用する場合は、Index作成時にAMAZON_BEDROCK_TEXT
をNon-filterable metadataに設定する。
やったこと
最近S3 Vectorsが登場したので自分もKnowledge Baseのベクターストアに試してみたのですが、Knowledge Baseのparsingやchunkingの設定はデフォルトのまま、自前で作成したS3 Vector Bucketを使用したら、ごく一般的なPDFの取り込みが頻繁に(私のデータでは19/20)失敗しました。
エラーは以下。
Encountered error: Invalid record for key '#vector-key': Filterable metadata must have at most 2048 bytes (Service: S3Vectors, Status Code: 400, Request ID: #request-id) (SDK Attempt Count: 1). Call to Amazon S3 Vectors did not succeed.
Filterable metadata
を2KB以下にしろ、と言われています。おそらくS3 Vectorsでベクターデータにひっついているメタデータであり、Knowledge Baseが自動で生成したものが許可されているサイズをオーバーしているよう。
特段変わった設定はしていないしデータも普通のPDFなので、Previewとはいえリリースされたサービスでここまで頻繁に失敗するのは変な気がします。
今回はこの問題の根本原因を探りつつ、Knowledge BaseでS3 Vectorsをベクターストアにした場合のメタデータ構造とS3 Vectorsの制約について調査しました。
Filterable metadata
公式ドキュメントによれば、S3 Vectorsはメタデータによる検索結果のフィルタリングに対応しており、メタデータは項目ごとに
- Filterable metadata:
Filterable metadata allows you to filter query results based on specific metadata values.
- Non-filterable metadata:
Non-filterable metadata can't be used in query filters but can store larger amounts of contextual data than filterable metadata.
に分かれています。すべての項目はデフォルトでfilterableであり、non-filterableとするにはS3 Vector Bucketのインデックス作成時に明示的に項目名を設定する必要があります。
また、公式ドキュメントのLimitations and restrictionsのページを読むと、メタデータに関して以下の制約があります。
- Total metadata per vector: Up to 40 KB (filterable + non-filterable)
- Total metadata keys per vector: Up to 10
- Filterable metadata per vector: Up to 2 KB
- Non-filterable metadata keys per vector index: Up to 10
今回はFilterable metadata per vector: Up to 2 KB
に引っかかっていると思われます。
メタデータを見てみる
取り込みに失敗したドキュメントは見られませんが、いくつかは成功しているのでメタデータを取得してみます。
マネコンからは見られないのでAWS CLIから取得します。
> aws s3vectors list-vectors --vector-bucket-name s3-vector-bucket-mt --index-name s3-vector-index-mt --return-metadata
{
"vectors": [
{
"key": "91293f67-0c6b-4fa6-b886-26d2a6b7e99b",
"metadata": {
"x-amz-bedrock-kb-data-source-id": "YK35GCMH1R",
"AMAZON_BEDROCK_METADATA": "{\"text\":null,\"author\":\"USAID/Global Health\",\"createDate\":\"2005-03-21T21:09:00Z\",\"modifiedDate\":\"2005-03-21T21:10:33Z\",\"source\":{\"sourceLocation\":\"s3://sample-s3-data-mt/2ED27NR7CISW7J4PHXXBZ6OFPVDFHMFB.pdf\",\"sourceType\":null},\"descriptionText\":\"List of global health country contacts for the Africa Region\",\"pageNumber\":null,\"pageSizes\":null,\"graphDocument\":{\"entities\":[]},\"parentText\":null,\"relatedContents\":null,\"sourceDocumentId\":\"3iZM3cb0ujHBZuHVqse+Rn9KS9S3LwGv7OcxDfY0vAKocKl9EJ8TCSWzrHt53BQi\",\"additionalMetadata\":null}",
"x-amz-bedrock-kb-source-uri": "s3://sample-s3-data-mt/2ED27NR7CISW7J4PHXXBZ6OFPVDFHMFB.pdf",
"AMAZON_BEDROCK_TEXT": "AFR Bureau Desk Officer Priority South Africa Celeste Carr (202-712-4802) Julie Wallace (202-712-0428) Shanti Conly, Julie Wallace Julie Wallace Hope Sukin GH Senior Staff Lorie Dobbins, AFR/SA PEPFAR TB Sudan Willa Pressman (202- 712-0187) Trent Ruebush (202- 712-5734) Lisa Maniscalco Willa Pressman Hope Sukin, Mary Harvey Richard Greene Ami Helson AFR/EA Tanzania Willa Pressman (202-712-0187) Mark Austin (202-712-1001) Tanvi Pandit (202-712-4943) Katherine Kripke, Peter Salama Willa Pressman Subhi Mehdi Scott Radloff Krista Desgranges AFR/EA PEPFAR Malaria PRH Uganda Krista Stewart (202-712-0808) Laura Harley (202-712-5024) Neen Alrutz, Krista Stewart Patricia Mengech Ishrat Husain Roxana Rogers Krista Desgranges AFR/EA PEPFAR TB Malaria PRH MCH WARP Alan Bornbusch (202-712- 4691) Nancy McCharen (202-712-1894) Janean Martin Nancy",
"x-amz-bedrock-kb-document-page-number": 4.0
}
},
...
バケットに入っているベクターデータのメタデータ一覧が返ってきます。
見ると、以下の項目があります。
- "x-amz-bedrock-kb-data-source-id": Knowledge Baseで設定するデータソースに払い出されるID
- "AMAZON_BEDROCK_METADATA": 作成・更新日時やデータソースの情報などメタデータ的な情報が入っている
- "x-amz-bedrock-kb-source-uri": チャンクの元ファイルとなるPDFのURI
- "AMAZON_BEDROCK_TEXT": チャンクのテキスト
- "x-amz-bedrock-kb-document-page-number": チャンクが元ファイルで所属するページ
項目ごとにfilterable、non-filterableの情報を取得するオプションは無かったのですが、特にnon-filterableの設定はしていないので全項目filterableな前提で考えます(※判定する方法はありますし実際filterableなのですが、それは後でやります)。
これらを連結した文字列が2KBを越えているとエラーが発生します。試しに2つのメタデータの文字数を計ると1818文字、1976文字でした。
UTF-8ならアルファベット1文字=1Bなので、2KB=2048Bの上限に結構近いです。これは明らかにエラーの原因っぽいです。
PDFをS3 Vector Bucketに取り込むには、分割されたすべてのチャンクの埋め込みのメタデータがこの2KBのチェックをパスする必要があるため、大半のファイルが取り込みに失敗したことも納得できます。
メタデータで一番大きいのはAMAZON_BEDROCK_TEXT
に入っている、埋め込みの原文となるチャンクテキストです。ここをどうにかする必要があります。
自分は最初、Knowledge Baseのチャンク戦略を変更して、100トークンの固定長チャンキングを試してみました。英文だと1トークンは3~5文字程度なので大分メタデータのサイズを抑えることができます。実際、この対処でPDFは無事全て取り込むことができました。
しかし、そもそもS3 Vectors+Bedrock Knowledge Baseの利用に短い固定長チャンクを前提として要求されるというのは違和感を覚えます。世のやってみた記事も自分のような対応はしていません。処理は上手くいったとはいえ筋の悪い方法をとっている可能性が高いと思い、改めて調査しました。
Non-filterable metadataを適切に設定せよ
公式ドキュメントのS3 Vectors best practicesというページに
- Configuring non-filterable metadata fields for vector indexes
という項目がありました。
When creating a vector index, configure metadata fields that don't require filtering as non-filterable metadata keys. For example, store text chunks for vector embeddings as non-filterable metadata fields when you need them only for reference. For more information, see Non-filterable metadata.
チャンクテキストとかnon-filterableでいいんじゃない? と書いています。
つまり、Knowledge Baseで使用するS3 Vector BucketのIndex作成時にAMAZON_BEDROCK_TEXT
をnon-filterableに設定するのが良さそうです。確かに2KB制限はfilterable metadataのみ対象なので、この設定でファイル取り込み時のエラーは消えそうです。
ただ、この設定も世のKnowledge Base+S3 Vectorsやってみた記事には基本的に記載なし。
改めてそれらの記事と自分の方法と見比べてみると、自分はあらかじめ作ったS3 Vector Bucketを利用しているのに対し、記事ではKnowledge Base作成フローのVector Storeの項目でQuick create a new vector store - Recommended
を選択していることが分かりました。
そして、この方法では自分のような2KB制限のエラーが起きることなく正常にファイルを取り込めています。
となると、「Knowledge BaseでS3 Vector Bucketを自動作成する場合は、べスプラに従いインデックス作成時にAMAZON_BEDROCK_TEXT
を自動でnon-filterable metadataに設定するのではないか」という仮説を立てられます。
実際に確かめてみました。
AMAZON_BEDROCK_TEXT
はnon-filterable?
自動作成されたS3 Vector BucketのAmazon S3 Vectors Embed CLIというツールを使い、自前作成と自動作成のS3 Vector BucketにAMAZON_BEDROCK_TEXT
のフィルタリングを含んだクエリを投げてレスポンスを観察してみます。
> s3vectors-embed query --vector-bucket-name your-vector-bucket-name --index-name your-index-name --model-id amazon.titan-embed-text-v2:0 --query-input "hoge(何でもいい)" --filter '{"AMAZON_BEDROCK_TEXT": {"$exists": true}}'
# 自前作成バケット
{
"results": [
{
"key": "504e685e-80b2-4d5b-9517-eb09e2417281",
"metadata": {
"AMAZON_BEDROCK_TEXT": "Wallace (202-712-0428) Jason Wright (202-712-5146) Janean Martin Julie Wallace Hope Sukin GH Senior Staff Lorie Dobbins AFR/SA - Rwanda Rose McCullough (202-712-4763) Nancy Lowenthal, Megan Gerson Nancy McCharen Hope Sukin Margaret Neuse Olutokunbo L. Cole AFR/EA PEPFAR Nancy McCharen (202-712-1894) Julia Byington (202-712-0540) Senegal Frances Davidson (202-712-0982) Julie Wallace Janean Martin Julie Wallace John Paul Clark GH Senior Staff Harry Proctor AFR/WA Malaria PRH MCH (202-712-0428) Sierra Leone Sandra Jordan (202-712-1161) Susan Youll Janean Martin Celeste Gregory Mary Harvey GH Senior Staff Lydia Hall AFR/WA (202-712-1444)-- -- Country Country Coordinator GH HIV/AIDS Point Person GH/RCS Rep AFR/SD Rep GH Senior Advisor AFR Bureau Desk Officer Priority South Africa Celeste Carr (202-712-4802) Julie Wallace (202-712-0428) Shanti Conly, Julie Wallace Julie Wallace Hope Sukin GH Senior Staff Lorie",
"AMAZON_BEDROCK_METADATA": "{\"text\":null,\"author\":\"USAID/Global Health\",\"createDate\":\"2005-03-21T21:09:00Z\",\"modifiedDate\":\"2005-03-21T21:10:33Z\",\"source\":{\"sourceLocation\":\"s3://sample-s3-data-mt/2ED27NR7CISW7J4PHXXBZ6OFPVDFHMFB.pdf\",\"sourceType\":null},\"descriptionText\":\"List of global health country contacts for the Africa Region\",\"pageNumber\":null,\"pageSizes\":null,\"graphDocument\":{\"entities\":[]},\"parentText\":null,\"relatedContents\":null,\"sourceDocumentId\":\"3iZM3cb0ujHBZuHVqse+Rn9KS9S3LwGv7OcxDfY0vAKocKl9EJ8TCSWzrHt53BQi\",\"additionalMetadata\":null}",
"x-amz-bedrock-kb-source-uri": "s3://sample-s3-data-mt/2ED27NR7CISW7J4PHXXBZ6OFPVDFHMFB.pdf",
"x-amz-bedrock-kb-document-page-number": 3.0,
"x-amz-bedrock-kb-data-source-id": "YK35GCMH1R"
}
},
...
# 自動作成バケット
Error: S3 Vectors query_vectors failed: An error occurred (ValidationException) when calling the QueryVectors operation: Invalid use of non-filterable metadata in filter
Error: S3 Vectors query_vectors failed: An error occurred (ValidationException) when calling the QueryVectors operation: Invalid use of non-filterable metadata in filter
私がnon-filterable metadataの設定を行わず自前で作ったS3 Vector Bucketへのクエリは検索結果が返ってきている一方で、Knowledge Baseにより自動作成された方はnon-filterable metadataを使うなと怒られています。
AMAZON_BEDROCK_TEXT
がちゃんと自動でnon-filterableに設定されているようです。
まとめ
今回の問題の原因は、私が自前で用意したS3 Vector BucketでAMAZON_BEDROCK_TEXT
がfilterableであり、取り込み時にfilterable metadataの2KB制限に引っかかったことにあります。
私のように自分で作成するなら、インデックス作成時にAMAZON_BEDROCK_TEXT
をnon-filterableに設定するなどしてfilterable metadataのサイズを減らす必要があります。また、Knowledge Baseに作成してもらうなら自動でnon-filterableの設定をしてくれるので、自分で何かする必要はありません。
Discussion