コンテンツにスキップ

メタデータフィルタリング

クエリに入力ベクトルを提供するだけでなく、すべてのベクトルに関連付けられたベクトルメタデータでフィルタリングすることもできます。クエリ結果には、filter基準に一致するベクトルのみが含まれます。つまり、filterが最初に適用され、topK結果はフィルタリングされたセットから取得されます。

メタデータフィルタリングを使用してクエリの範囲を制限することで、特定の顧客ID、テナント、製品カテゴリ、またはベクトルに関連付けたその他のメタデータでフィルタリングできます。

サポートされている操作

query()メソッドのオプションのfilterプロパティは、メタデータフィルタを指定します:

演算子説明
$eq等しい
$ne等しくない
  • filterは空でないオブジェクトでなければならず、そのコンパクトなJSON表現は2048バイト未満でなければなりません。
  • filterオブジェクトのキーは空であってはならず、" | .(ドットはネスト用に予約されています)を含んではならず、$で始まってはならず、512文字を超えてはなりません。
  • filterオブジェクトの非ネスト値は、stringnumberboolean、またはnull値である必要があります。

名前空間とメタデータフィルタリングの違い

namespacesとメタデータフィルタリングは、クエリのためのベクトル検索空間を狭めます。両方のフィルタタイプを評価する際に考慮すべき点:

  • 名前空間フィルタは、メタデータフィルタの前に適用されます。
  • ベクトルは、文書化された制限に従って、単一の名前空間の一部であることができます。ベクトルメタデータは、ベクトルごとのメタデータ制限までの複数のキーと値のペアを含むことができます。メタデータ値は異なるタイプ(stringbooleanなど)をサポートしており、より柔軟性を提供します。

有効なfilterの例

暗黙の$eq演算子

{ "streaming_platform": "netflix" }

明示的な演算子

{ "someKey": { "$ne": true } }

複数のキーによる暗黙の論理AND

{ "pandas.nice": 42, "someKey": { "$ne": true } }

キーは.(ドット)でネストを定義

{ "pandas.nice": 42 }
// { "pandas": { "nice": 42 } }を探します

メタデータの追加

次のインデックス定義を使用します:

Terminal window
npx wrangler vectorize create tutorial-index --dimensions=32 --metric=cosine

メタデータインデックスを作成します:

Terminal window
npx wrangler vectorize create-metadata-index tutorial-index --property-name=url --type=string
Terminal window
npx 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以降に作成されたインデックスのみがメタデータフィルタリングをサポートします。以前に作成されたインデックスは、メタデータフィルタリングをサポートするように移行することはできません。