メタデータフィルタリング
クエリに入力ベクトルを提供するだけでなく、すべてのベクトルに関連付けられたベクトルメタデータでフィルタリングすることもできます。クエリ結果には、filter基準に一致するベクトルのみが含まれます。つまり、filterが最初に適用され、topK結果はフィルタリングされたセットから取得されます。
メタデータフィルタリングを使用してクエリの範囲を制限することで、特定の顧客ID、テナント、製品カテゴリ、またはベクトルに関連付けたその他のメタデータでフィルタリングできます。
query()メソッドのオプションのfilterプロパティは、メタデータフィルタを指定します:
| 演算子 | 説明 |
|---|---|
$eq | 等しい |
$ne | 等しくない |
filterは空でないオブジェクトでなければならず、そのコンパクトなJSON表現は2048バイト未満でなければなりません。filterオブジェクトのキーは空であってはならず、" | .(ドットはネスト用に予約されています)を含んではならず、$で始まってはならず、512文字を超えてはなりません。filterオブジェクトの非ネスト値は、string、number、boolean、またはnull値である必要があります。
namespacesとメタデータフィルタリングは、クエリのためのベクトル検索空間を狭めます。両方のフィルタタイプを評価する際に考慮すべき点:
- 名前空間フィルタは、メタデータフィルタの前に適用されます。
- ベクトルは、文書化された制限に従って、単一の名前空間の一部であることができます。ベクトルメタデータは、ベクトルごとのメタデータ制限までの複数のキーと値のペアを含むことができます。メタデータ値は異なるタイプ(
string、booleanなど)をサポートしており、より柔軟性を提供します。
{ "streaming_platform": "netflix" }{ "someKey": { "$ne": true } }{ "pandas.nice": 42, "someKey": { "$ne": true } }{ "pandas.nice": 42 }
// { "pandas": { "nice": 42 } }を探します次のインデックス定義を使用します:
npx wrangler vectorize create tutorial-index --dimensions=32 --metric=cosineメタデータインデックスを作成します:
npx wrangler vectorize create-metadata-index tutorial-index --property-name=url --type=stringnpx wrangler vectorize create-metadata-index tutorial-index --property-name=streaming_platform --type=stringメタデータは、ベクトルの挿入またはアップサート時に追加できます。
const newMetadataVectors: Array<VectorizeVector> = [ { id: "1", values: [32.4, 74.1, 3.2, ...], metadata: { url: "/products/sku/13913913", streaming_platform: "netflix" }, }, { id: "2", values: [15.1, 19.2, 15.8, ...], metadata: { url: "/products/sku/10148191", streaming_platform: "hbo" }, }, { id: "3", values: [0.16, 1.2, 3.8, ...], metadata: { url: "/products/sku/97913813", streaming_platform: "amazon" }, }, { id: "4", values: [75.1, 67.1, 29.9, ...], metadata: { url: "/products/sku/418313", streaming_platform: "netflix" }, }, { id: "5", values: [58.8, 6.7, 3.4, ...], metadata: { url: "/products/sku/55519183", streaming_platform: "hbo" }, },];
// メタデータを追加してベクトルをアップサートし、アップサートされたベクトルのカウントとそのベクトルIDを返しますlet upserted = await env.YOUR_INDEX.upsert(newMetadataVectors);query()メソッドを使用します:
let queryVector: Array<number> = [54.8, 5.5, 3.1, ...];let originalMatches = await env.YOUR_INDEX.query(queryVector, { topK: 3, returnValues: true, returnMetadata: 'all',});メタデータフィルタリングなしの結果:
{ "matches": [ { "id": "5", "score": 0.999909486, "values": [58.79999923706055, 6.699999809265137, 3.4000000953674316], "metadata": { "url": "/products/sku/55519183", "streaming_platform": "hbo" } }, { "id": "4", "score": 0.789848214, "values": [75.0999984741211, 67.0999984741211, 29.899999618530273], "metadata": { "url": "/products/sku/418313", "streaming_platform": "netflix" } }, { "id": "2", "score": 0.611976262, "values": [15.100000381469727, 19.200000762939453, 15.800000190734863], "metadata": { "url": "/products/sku/10148191", "streaming_platform": "hbo" } } ]}同じquery()メソッドでfilterプロパティを使用すると、メタデータフィルタリングがサポートされます。
let queryVector: Array<number> = [54.8, 5.5, 3.1, ...];let metadataMatches = await env.YOUR_INDEX.query(queryVector, { topK: 3, filter: { streaming_platform: "netflix" }, returnValues: true, returnMetadata: 'all',});メタデータフィルタリングありの結果:
{ "matches": [ { "id": "4", "score": 0.789848214, "values": [75.0999984741211, 67.0999984741211, 29.899999618530273], "metadata": { "url": "/products/sku/418313", "streaming_platform": "netflix" } }, { "id": "1", "score": 0.491185264, "values": [32.400001525878906, 74.0999984741211, 3.200000047683716], "metadata": { "url": "/products/sku/13913913", "streaming_platform": "netflix" } } ]}- 現在、メタデータフィルタリングをサポートするためには、ベクトルが挿入される前にVectorizeインデックスのメタデータインデックスを作成する必要があります。
- 2023-12-06以降に作成されたインデックスのみがメタデータフィルタリングをサポートします。以前に作成されたインデックスは、メタデータフィルタリングをサポートするように移行することはできません。