ベクトル検索は、効率的な類似性検索を実現するための主要な技術です。このトピックでは、詳細な例を用いて、ベクトル検索を迅速に実装する方法について説明します。
前提条件
PyMilvus ライブラリがローカルクライアントにインストールされ、最新バージョンに更新されていること。
PyMilvus ライブラリをインストールまたは更新するには、次のコマンドを実行します。
pip install --upgrade pymilvusMilvus インスタンスが作成されていること。詳細については、「Milvus インスタンスの作成」をご参照ください。
注意事項
Alibaba Cloud AISearch for Milvus (Milvus) は、内部ネットワークおよびインターネット経由での接続をサポートしています。Milvus インスタンスに接続する前に、クライアントが必要なネットワークアクセス権限を持っていることを確認してください。詳細については、「ネットワークアクセスとセキュリティ設定」をご参照ください。
手順
ステップ 1: Milvus インスタンスへの接続
次のコードを使用して Milvus インスタンスに接続できます。
from pymilvus import MilvusClient
# Milvus クライアントを作成します。
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Milvus インスタンスのパブリックエンドポイント。
token="<yourUsername>:<yourPassword>", # Milvus インスタンスへのログインに使用するユーザー名とパスワード。
db_name="default" # 接続するデータベースの名前。この例では、デフォルトのデータベースを使用します。
)
ステップ 2: コレクションの作成
次のコードを使用してコレクションを作成できます。その他のカスタムパラメータオプションについては、「コレクションの管理」をご参照ください。
client.create_collection(
collection_name="demo", # コレクションの名前。
dimension=5 # ベクトル次元。
)このコードは、コレクション名とベクトル次元を設定します。また、次の設定が自動的に適用されます:
プライマリキーフィールド
idとベクトルフィールドvectorにデフォルトの名前を使用します。metric_typeプロパティは、デフォルトで COSINE メトリックタイプを使用します。プライマリキーフィールド
idを整数として設定します。その値は自動的にインクリメントされません。スキーマで定義されていないフィールドのデータをキーバリューペアとして格納するために、追加の
$metaフィールドを追加します。
ステップ 3: データの挿入
コレクションを作成すると、システムは自動的にコレクションとそのインデックスをメモリにロードします。次のコードを使用して、テストデータをコレクションに挿入できます。
少量のデータの挿入
このコードは、事前に定義された 10 個のエンティティを挿入します。各エンティティには、固定のベクトルとカラータグがあります。
data=[{'id': 0, 'vector': [-0.493313706583155, -0.172001225836391, 0.16825615330139554, -0.0198911518739604, -0.9756816265213708], 'color': 'green_5760'}, {'id': 1, 'vector': [0.6695699219225086, 0.49952523907354496, -0.49870548178008534, 0.8824655547230731, -0.7182693622931615], 'color': 'blue_2330'}, {'id': 2, 'vector': [-0.6057771959702387, 0.9141473782193543, 0.32053983678483466, -0.32126010092015655, 0.725222856037071], 'color': 'grey_9673'}, {'id': 3, 'vector': [0.14082089434165868, 0.9924029949938447, 0.7943279666144052, -0.7898608705081103, -0.9941425813199956], 'color': 'white_2829'}, {'id': 4, 'vector': [-0.46180540826224026, 0.33216876051895783, 0.5786699695956004, 0.8891120357625131, 0.04872530176990697], 'color': 'pink_9061'}, {'id': 5, 'vector': [-0.6097452740606673, 0.35648319550551144, -0.5699789153006387, 0.15085357921088316, -0.8817226997144627], 'color': 'pink_8525'}, {'id': 6, 'vector': [0.7843522543512762, -0.7663837586858071, -0.8681839054724569, 0.6880645348647785, -0.5151293183261791], 'color': 'green_5016'}, {'id': 7, 'vector': [-0.9967116931989293, 0.5741923070732655, -0.019126124261334976, -0.34163875885482753, -0.8189843931354175], 'color': 'brown_7434'}, {'id': 8, 'vector': [0.7347243385915765, -0.7358853080124825, -0.23737428377511716, 0.06980552357261627, -0.30613964550461437], 'color': 'blue_5059'}, {'id': 9, 'vector': [-0.21187155428455862, -0.3288541717216129, -0.32564136453418824, -0.14054963599686743, 0.5491320339870627], 'color': 'yellow_9887'}]
res = client.insert(
collection_name="demo",
data=data
)
多くのデータの挿入
このコードは、リスト内包表記を使用して多数のエンティティを動的に生成します。これらのエンティティのベクトルとカラータグは、指定された範囲内でランダムに生成されます。この例では、ID 0 から 999 までの 1,000 件のエンティティが生成されますが、data[1:] を使用して、ID 1 から始まる 999 件のエンティティのみが挿入されます。
import random
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}"
} for i in range(1000) ]
res = client.insert(
collection_name="demo",
data=data[1:]
)
print(res)ステップ 4: ベクトル検索
データの挿入は非同期処理です。データを挿入した後、システムはすぐに検索インデックスを更新しません。最新のデータをクエリするには、検索前にインデックスが更新されるまで数秒待つ必要があります。
単一ベクトル検索
類似性検索を実行するには、単一のクエリベクトルを含むリストを指定します。
query_vectors = [
[-0.8832567462711804, -0.2999882617491647, 0.9921295273224382, -0.272575369985379, -0.688914679645338]
]
res = client.search(
collection_name="demo", # クエリ対象のコレクション
data=query_vectors, # クエリベクトル。
limit=3, # 返すエンティティの数。
)
print(res)
バッチベクトル検索
複数のクエリベクトルを持つバッチ検索の場合、ベクトルのリストを入力パラメータとして使用できます。次のコードに例を示します。
query_vectors = [
[0.06586461994037252, 0.7693023529849932, 0.8199991781350795, -0.6988017611187176, 0.408383847889378],
[0.8988257992203861, 0.021911711196309414, 0.19086900086430836, 0.63590610476426, -0.6713237387993141]
]
res = client.search(
collection_name="demo",
data=query_vectors,
limit=3,
)
print(res)ステップ 5: 絞り込み検索
スキーマで定義されたフィールドを使用してフィルター条件を設定できます。これにより、検索範囲が絞り込まれ、検索効率が向上します。
数値フィールドによる絞り込み
次の例では、id フィールドの値の範囲に基づいて絞り込む方法を示します。
query_vectors = [
[-0.30932351869632435, -0.7132856078639205, 0.6006201320181415, 0.40140510356426784, -0.21223937444001328]
]
res = client.search(
collection_name="demo",
data=query_vectors,
filter="3 < id < 5", # 数値フィールドの範囲に対するフィルター条件。
limit=3
)
print(res)
メタデータフィールド ($meta) による絞り込み
次の例では、color プロパティの値が "green" で始まるレコードを検索する方法を示します。また、出力に color フィールドを含めるよう指定します。
query_vectors = [
[0.9636568288732006, -0.5900490884830603, 0.2504591754023724, 0.7120903924474389, 0.7620604497390009]
]
res = client.search(
collection_name="demo",
data=query_vectors,
filter='$meta["color"] like "green%"', # メタデータフィールドのプロパティ値に一致させるためのフィルター条件。
limit=3,
output_fields=["color"] # 返される結果に含めるフィールド。
)
print(res)