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

基本的なベクトル検索

ベクトル埋め込みのソートされた順序を記録したインデックスファイルに基づいて、近似最近傍法(ANN)検索は、受信した検索リクエストで運ばれたクエリベクトルに基づいてベクトル埋め込みのサブセットを検索し、クエリベクトルをサブグループ内のものと比較して、最も類似した結果を返します。ANN検索では、Zilliz Cloudが効率的な検索体験を提供します。このページでは、基本的なANN検索の方法を学ぶことができます。

概要について

ANNとk最近傍探索(kNN)は、ベクトル類似性検索の通常の方法です。kNN検索では、最も類似したものを見つける前に、検索要求で運ばれるクエリベクトルとベクトル空間内のすべてのベクトルを比較する必要があり、時間とリソースがかかります。

kNN検索とは異なり、ANN検索アルゴリズムはベクトル埋め込みのソートされた順序を記録するインデックスファイルを要求します。検索リクエストが送信されると、インデックスファイルを参照として使用して、クエリベクトルに最も似たベクトル埋め込みを含むサブグループをすばやく検索できます。その後、指定されたメトリックタイプを使用して、クエリベクトルとサブグループの類似度を測定し、クエリベクトルとの類似度に基づいてグループメンバーをソートし、トップKグループメンバーを特定できます。

ANN検索はあらかじめ構築されたインデックスに依存し、検索スループット、メモリ使用量、検索の正確性は選択したインデックスの種類によって異なる場合があります。検索のパフォーマンスと正確性のバランスを取る必要があります。

学習曲線を減らすために、Zilliz CloudはAUTOINDEXを提供しています。AUTOINDEXを使用すると、Zilliz Cloudはコレクション内のデータ分布を分析しながらインデックスを構築し、分析に基づいて最適化されたインデックスパラメータを設定して、検索パフォーマンスと正確性のバランスを取ることができます。

AUTOINDEXと適用可能なメトリックタイプの詳細については、「AUTOINDEXの説明」and「メトリックの種類」を参照してください。このセクションでは、以下のトピックについて詳しく説明します。

ANN検索において、単一ベクトル検索とは、1つのクエリベクトルのみを含む検索を指します。事前に構築されたインデックスと検索リクエストに含まれるメトリックタイプに基づいて、Zilliz Cloudは、クエリベクトルに最も似た上位K個のベクトルを検索します。

このセクションでは、単一ベクトル検索を実行する方法を学びます。コードスニペットは、クイックセットアップ方法でコレクションを作成したことを前提としています。検索リクエストには単一のクエリベクトルが含まれ、Zilliz Cloudを使用して、クエリベクトルとコレクション内のベクトルの類似度を計算し、最も類似した3つを返します。

from pymilvus import MilvusClient

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

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = client.search(
collection_name="my_collection",
anns_field="vector",
data=[query_vector],
limit=3,
search_params={"metric_type": "IP"}
)

for hits in res:
for hit in hits:
print(hit)

# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {}
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {}
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {}
# }
# ]
# ]

Milvusは、クエリベクトルとの類似度スコアによって検索結果を降順にランク付けします。類似度スコアは、クエリベクトルまでの距離とも呼ばれ、その値の範囲は使用されるメトリックタイプによって異なります。

次の表に、適用可能なメトリックタイプと対応する距離範囲を示します。

メートルタイプ

の特徴

距離の範囲

L 2

値が小さいほど類似度が高いことを示します。

[0, ∞)

IP

値が大きいほど類似度が高いことを示します。

[-1, 1]

コサイン

値が大きいほど類似度が高いことを示します。

[-1, 1]

ジャカード

値が小さいほど類似度が高いことを示します。

[0, 1]

ハミング

値が小さいほど類似度が高いことを示します。

[0, dim(ベクトル)]

Zilliz Cloudは、クエリベクトルに対してANN検索を並列に実行し、2つの結果を返します。

# 7. Search with multiple vectors
# 7.1. Prepare query vectors
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],
[0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]
]

# 7.2. Start search
res = client.search(
collection_name="my_collection",
data=query_vectors,
limit=3,
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)

# Output
#
# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {}
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {}
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {}
# }
# ],
# [
# {
# "id": 730,
# "distance": 0.04431751370429993,
# "entity": {}
# },
# {
# "id": 333,
# "distance": 0.04231833666563034,
# "entity": {}
# },
# {
# "id": 232,
# "distance": 0.04221535101532936,
# "entity": {}
# }
# ]
# ]

パーティション内のANN検索

コレクション内に複数のパーティションを作成した場合、検索範囲を特定のパーティション数に絞り込むことができます。その場合、検索リクエストにターゲットパーティション名を含めて、指定されたパーティション内で検索範囲を制限することができます。検索に関与するパーティション数を減らすことで、検索のパフォーマンスが向上します。

次のコードスニペットは、コレクション内のPartitionAという名前のパーティション想定しています。

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = client.search(
collection_name="my_collection",
partition_names=["partitionA"],
data=[query_vector],
limit=3,
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)

# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {}
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {}
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {}
# }
# ]
# ]

出力フィールドを使用する

検索結果には、Zilliz Cloudが含まれます。デフォルトでは、上位K個のベクトル埋め込みを含むエンティティの主要なフィールド値と類似距離/スコアが含まれます。ベクトルフィールドとスカラーフィールドの両方を含むターゲットフィールドの名前を出力フィールドとして検索リクエストに含めることで、検索結果にこれらのエンティティの他のフィールドの値を含めることができます。

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={"metric_type": "IP"}
output_fields=["color"]
)

print(res)

# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {
# "color": "orange_6781"
# }
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {
# "color": "red_4794"
# }
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {
# "color": "grey_8510"
# }
# }
# ]
# ]

リミットとオフセットを使用する

検索リクエストに含まれるパラメータ制限によって、検索結果に含めるエンティティの数が決まることに気付くかもしれません。このパラメータは、1回の検索で返すエンティティの最大数を指定し、通常はtop-Kと呼ばれます。

ページ分割クエリを実行したい場合は、ループを使用して複数の検索リクエストを送信し、各クエリリクエストでLimitおよびOffsetパラメータを使用できます。具体的には、Limitパラメータを現在のクエリ結果に含めたいエンティティの数に設定し、Offsetを既に返されたエンティティの総数に設定できます。

以下の表は、一度に100個のエンティティを返すときに、ページ分割されたクエリのLimitOffsetパラメータを設定する方法を示しています。

クエリー

クエリごとに返すエンティティ

エンティティはすでに返却済みです。

1回クエリー

100

0

2回クエリ

100

100

3回クエリ

100

200

n番のクエリ

100

100のx(n-1)

1回のANN検索では、limitoffsetの合計は16,384小なりになることに注意してください。

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={
"metric_type": "IP",
"offset": 10 # The records to skip
}
)

使用レベル

ANN検索を最適化するために、Zilliz Cloudにはlevelという名前のパラメータが用意されています。

このパラメータの範囲は1から10で、デフォルトは1です。値を増やすと、検索のパフォーマンスが低下しながら検索の再現率が向上します。一般的な場合、デフォルト値では最大90%の再現率が得られます。必要に応じて値を増やすことができます。

📘ノート

このlevelパラメーターはまだPublic Previewのままです。5に設定できない場合は、クラスターがこの機能を完全にサポートしていない可能性があります。回避策として、1から5の範囲内の値に設定するか、Zilliz Cloudサポートにお問い合わせください。

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={
"params": {
"level": 10 # The precision control
}
}
)

リコール率を取得する

levelパラメータを微調整するときに、enable_recall_estimationTrueに設定して、異なるlevel値で検索の精度を評価できるようにします。

📘ノート

enable_recall_estimationパラメータはまだパブリックプレビューのため、互換性の問題により使用できない可能性があります。サポートが必要な場合は、Zilliz Cloudサポートまでお問い合わせください。

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={
"params": {
"level": 10 # The precision control,
"enable_recall_calculation": True # Ask to return recall rate
}
}
)

AUTOINDEXはANN検索の学習曲線を大幅に平坦化します。ただし、上位Kが増加するにつれて、検索結果が常に正しいとは限りません。Zilliz Cloudは、検索範囲を縮小し、検索結果の関連性を向上させ、検索結果を多様化することで、以下の検索強化を実現します。

  • フィルター検索

    Zilliz CloudがANN検索を行う前にメタデータフィルタリングを行うように、検索要求にフィルタリング条件を含めることができます。これにより、検索範囲がコレクション全体から指定されたフィルタリング条件に一致するエンティティのみに縮小されます。

    メタデータのフィルタリングとフィルタリング条件の詳細については、フィルター検索フィルタリングを参照してください。

  • レンジ検索

    特定の範囲内で返されるエンティティの距離またはスコアを制限することで、検索結果の関連性を向上させることができます。Zilliz Cloudでは、範囲検索は、クエリベクトルに最も似たベクトル埋め込みを中心に2つの同心円を描画することを含みます。検索リクエストは両方の円の半径を指定し、Zilliz Cloudは、外側の円に含まれるが内側の円には含まれないすべてのベクトル埋め込みを返します。

    範囲検索の詳細については、レンジ検索を参照してください。

  • グループ検索

    返されたエンティティが特定のフィールドで同じ値を保持している場合、検索結果はベクトル空間内のすべてのベクトル埋め込みの分布を表すわけではありません。検索結果を多様化するには、グループ化検索を使用することを検討してください。

    グループ検索の詳細については、グループ検索を参照してください、

  • ハイブリッド検索

    コレクションには、異なる埋め込みモデルを使用して生成されたベクトル埋め込みを保存するために最大4つのベクトルフィールドを含めることができます。これにより、ハイブリッド検索を使用してこれらのベクトルフィールドから検索結果を再ランク付けし、リコール率を向上させることができます。

    ハイブリッド検索の詳細については、ハイブリッド検索を参照してください。

  • 検索イテレータ

    1回のANN検索で最大16,384個のエンティティが返されます。1回の検索でより多くのエンティティを返す必要がある場合は、検索イテレータを使用することを検討してください。

    検索イテレータの詳細については、検索イテレータを参照してください。

  • フルテキスト検索

    フルテキスト検索は、テキストデータセット内の特定の用語やフレーズを含むドキュメントを取得し、関連性に基づいて結果をランク付けする機能です。この機能は、正確な用語を見落とす可能性がある意味検索の制限を克服し、最も正確で文脈に関連する結果を受け取ることを保証します。さらに、生のテキスト入力を受け入れることにより、ベクトル検索を簡素化し、手動でベクトル埋め込みを生成する必要なく、テキストデータを疎な埋め込みに自動的に変換します。

    全文検索の詳細については、フルテキスト検索を参照してください。

  • キーワード一致

    Milvusのキーワードマッチにより、特定の用語に基づく正確なドキュメント検索が可能になります。この機能は、特定の条件を満たすためにフィルタリングされた検索に主に使用され、スカラーフィルタリングを組み込んでクエリ結果を絞り込むことができ、スカラー基準を満たすベクトル内の類似検索を可能にします。

    キーワード一致の詳細については、テキスト一致を参照してください。

  • パーティションキーを使う

    メタデータフィルタリングに複数のスカラーフィールドを関与させ、かなり複雑なフィルタリング条件を使用すると、検索効率に影響を与える可能性があります。パーティションキーとしてスカラーフィールドを設定し、検索要求にパーティションキーを含むフィルタリング条件を使用すると、指定されたパーティションキー値に対応するパーティション内の検索範囲を制限するのに役立ちます。

    パーティションキーの詳細については、パーティションキーを使うするを参照してください。

  • mmapを使う

    mmap-settingsの詳細は、mmapを使ううを参照してください。