メインコンテンツまでスキップ
バージョン: User Guides (Cloud)

グループ化検索

グループ化検索では、Zilliz Cloudが指定したフィールドの値によって検索結果をグループ化し、データをより高いレベルで集約できます。たとえば、基本的なANN検索を使用して現在の本に類似した本を見つけることができますが、グループ化検索を使用して、その本で議論されているトピックに関連する可能性のある本のカテゴリを見つけることができます。このトピックでは、グループ化検索の使用方法と重要な考慮事項について説明します。

概要

検索結果内のエンティティがスカラーフィールドで同じ値を共有する場合、これは特定の属性でそれらが類似していることを示しており、検索結果に悪影響を与える可能性があります。

コレクションが複数のドキュメント(docIdで表されます)を格納していると仮定します。ドキュメントをベクトルに変換する際に意味情報の多くを維持するために、各ドキュメントはより小さく管理しやすい段落(またはチャンク)に分割され、個別のエンティティとして格納されます。ドキュメントが小さなセクションに分割されていても、ユーザーは多くの場合、どのドキュメントが自分のニーズに関連するかを特定することに興味があります。

LhJEwzWiphLWxobMaiCcbVDPnNb

このようなコレクションで近似最近傍(ANN)検索を実行すると、結果には同じドキュメントの複数の段落が含まれる可能性があり、他のドキュメントが見落とされる可能性があり、意図した使用ケースと一致しない場合があります。

Ktj8wigrHhvz4nbDES5coKZJnZe

検索結果の多様性を向上させるために、検索リクエストにgroup_by_fieldパラメータを追加してグループ化検索を有効にできます。図に示すように、group_by_fielddocIdに設定できます。このリクエストを受け取ると、Zilliz Cloudは以下のことを行います:

  • 提供されたクエリベクトルに基づいてANN検索を実行し、クエリに最も類似したすべてのエンティティを見つけます。

  • 指定されたgroup_by_field(例:docId)によって検索結果をグループ化します。

  • 各グループからlimitパラメータで定義された上位の結果を返します。各グループから最も類似したエンティティを返します。

📘ノート

デフォルトでは、グループ化検索はグループごとに1つのエンティティのみを返します。グループごとに返される結果の数を増やしたい場合は、group_sizeおよびstrict_group_sizeパラメータで制御できます。

このセクションでは、グループ化検索の使用方法を示すサンプルコードを提供します。以下の例では、コレクションにidvectorchunkdocIdのフィールドが含まれていると仮定します。

[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "chunk": "pink_8682", "docId": 1},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "chunk": "red_7025", "docId": 5},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "chunk": "orange_6781", "docId": 2},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "chunk": "pink_9298", "docId": 3},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "chunk": "red_4794", "docId": 3},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "chunk": "yellow_4222", "docId": 4},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "chunk": "red_9392", "docId": 1},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "chunk": "grey_8510", "docId": 2},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "chunk": "white_9381", "docId": 5},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "chunk": "purple_4976", "docId": 3},
]

検索リクエストで、group_by_fieldoutput_fieldsの両方をdocIdに設定します。Zilliz Cloudは指定されたフィールドで結果をグループ化し、各グループから最も類似したエンティティを返します。各返されるエンティティにはdocIdの値も含まれます。

from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

query_vectors = [
[0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]

# グループ検索結果
res = client.search(
collection_name="my_collection",
data=query_vectors,
limit=3,
group_by_field="docId",
output_fields=["docId"]
)

# `docId`列の値を取得
doc_ids = [result['entity']['docId'] for result in res[0]]

上記のリクエストでは、limit=3はシステムが3つのグループから検索結果を返すことを示しており、各グループにはクエリベクトルに最も類似した単一のエンティティが含まれています。

グループサイズの構成

デフォルトでは、グループ化検索はグループごとに1つのエンティティのみを返します。グループごとに複数の結果を返したい場合は、group_sizeおよびstrict_group_sizeパラメータを調整します。

# グループ検索結果

res = client.search(
collection_name="my_collection",
data=query_vectors, # クエリベクトル
limit=5, # 返すグループ数
group_by_field="docId", # グループ化フィールド
group_size=2, # 各グループから最大2つのエンティティを返す
strict_group_size=True, # 各グループから正確に2つのエンティティを返す
output_fields=["docId"]
)

上記の例では:

  • group_size:グループごとに返すエンティティの希望数を指定します。たとえば、group_size=2を設定すると、各グループ(または各docId)が理想的には2つの最も類似した段落(またはチャンク)を返すことを意味します。group_sizeが設定されていない場合、システムはデフォルトでグループごとに1つの結果を返します。

  • strict_group_size:このブール型パラメータは、システムがgroup_sizeで設定された数を厳密に強制するかどうかを制御します。strict_group_size=Trueの場合、システムは各グループにgroup_sizeで指定された正確な数のエンティティ(例:2つの段落)を含めるように試みます。ただし、そのグループに十分なデータがない場合は除きます。デフォルト(strict_group_size=False)では、システムは各グループにgroup_sizeのエンティティが含まれることを確保するよりも、limitパラメータで指定されたグループ数を満たすことを優先します。このアプローチは、データ分布が不均等な場合に一般的により効率的です。

追加パラメータの詳細については、検索を参照してください。

考慮事項

  • グループ数limitパラメータは、グループごとのエンティティ数ではなく、検索結果が返されるグループ数を制御します。適切なlimitを設定すると、検索の多様性とクエリのパフォーマンスを制御できます。データが密に分布している場合やパフォーマンスが懸念される場合は、limitを減らすことで計算コストを削減できます。

  • グループごとのエンティティ数group_sizeパラメータは、グループごとに返されるエンティティ数を制御します。使用ケースに応じてgroup_sizeを調整すると、検索結果の豊かさを高めることができます。ただし、データが不均等に分布している場合、一部のグループはgroup_sizeで指定されたより少ないエンティティを返す可能性があり、特にデータが限られているシナリオでは顕著です。

  • 厳格なグループサイズstrict_group_size=Trueの場合、システムはそのグループに十分なデータがない場合を除き、各グループに指定された数のエンティティ(group_size)を返すように試みます。この設定により、グループごとのエンティティ数が一定になりますが、データ分布が不均等な場合やリソースが限られている場合はパフォーマンスが低下する可能性があります。厳密なエンティティ数が不要な場合は、strict_group_size=Falseを設定するとクエリ速度を向上させることができます。