MinHash関数Compatible with Milvus 3.0.x
MinHash関数は、生テキストを文書間のJaccard類似度を近似するバイナリベクトルに変換する。MinHash関数はテキストのシングリングと複数のハッシュ関数を適用し、固定長の署名ベクトルを生成する。
組み込み関数であるMinHashはMilvus内で動作し、外部のモデル推論や前処理を必要としない。生テキストを挿入すると、Milvusは自動的にMinHash署名ベクトルを生成します。
制限事項
各MinHash署名は32ビットハッシュ値であるため、出力フィールドは
dim % 32 == 0を満たす次元のBINARY_VECTORである必要があります。バイナリベクターフィールドの
dimは、32 * num_hashesと等しくなければならない。不一致の場合、エラーとなる。MinHash関数出力で
MINHASH_LSHインデックスを使用する場合、mh_element_bit_widthは32に設定する必要があります。
MinHashの仕組み
MinHashは、集合間のJaccard類似度を推定する局所性を考慮したハッシュ技法である。Milvusでは、MinHash関数は次のようなパイプラインに従っています:入力として生テキストを提供し、Milvusは出力としてバイナリベクトルを生成します。
全体的なワークフローは、ドキュメントの取り込みとクエリ処理の両方で使用される共有テキスト処理パイプラインと、それに続く保存と検索のためのフェーズ固有の操作で構成される。
Iaqkbfeh8oqggsx6nsocfosondo
共有テキスト処理パイプライン
文書取り込みとクエリ処理の両方が、生テキストを同じ4段階の変換に通す:
テキスト分析:テキストは、アナライザーによって処理されるか(
token_levelが"word"の場合)、直接使用される(token_levelが"char"の場合)。単語レベルのトークン化は、入力フィールドに設定されたアナライザーを適用して、テキストを用語に分割します。たとえば、"milvus is vector db"は["milvus", "is", "vector", "db"]になります。シンギング:トークンは、
shingle_sizeサイズの重複する n-gram(シング ル)に分割されます。たとえば、単語レベルで3-gramを使用すると、トークン["information", "retrieval", "is", "a", "field"]は["information retrieval is", "retrieval is a", "is a field"]のようなシングルになる。MinHash署名生成:複数のハッシュ関数(H1、H2、...、Hn、n =
num_hashes)がシング ル集合に適用される。各ハッシュ関数について、すべての帯状疱疹にわたる最小のハッシュ値が選択される。これらの最小値の集合がMinHash署名を形成する - これはオリジナル文書のJaccard類似度を近似する固定長の表現である。バイナリベクターエンコーディング:各署名値は32ビットのハッシュであり、完全な署名は
32 * num_hashesの次元BINARY_VECTORにパックされる。
文書の取り込み
挿入時には、共有パイプラインによって生成されたバイナリベクトルがMINHASH_LSH インデックスに格納される。このインデックスはLSH(Locality-Sensitive Hashing)テーブルを保持し、類似の署名を同じバケットにグループ化することで、クエリ時に高速な候補検索を可能にする。
クエリ処理
検索中、クエリーテキストは同じ共有パイプラインを通り、バイナリーベクトルを生成する。このベクトルは、MINHASH_LSH インデックスのLSHルックアップを実行するために使用され、類似している可能性の高い候補ペアを迅速に特定する。そして、候補は推定されたJaccard類似度によってランク付けされ、トップKの結果が返される。
両方のパスが同じ変換ロジックを共有しているため、コンテンツが非常に重複している2つのドキュメントは、類似したMinHashシグネチャを生成します。このため、この関数は、語順、書式、細かい言い回しが異なるドキュメントでも、重複に近いものを見つけるのに効果的です。
開始する前に
MinHash関数を使用する前に、以下を含むコレクションスキーマを計画してください:
未加工コンテンツ用のテキストフィールド
コレクションには、生のテキストを格納する
VARCHARフィールドを含める必要があります。このフィールドは、MinHash関数の入力となります。テキストフィールド用のアナライザ(単語レベルのトークン化を使用する場合)。
token_levelが"word"に設定されている場合(デフォルト)、テキスト・フィールドでアナライザを有効にする必要があります。解析器は、シングリングの前にテキストをどのようにトークン化するかを定義します。デフォルトでは、Milvusはstandardアナライザを使用します。別のアナライザを設定するには、「ユースケースに適したアナライザを選択する」を参照してください。MinHash出力用のバイナリベクターフィールド
コレクションには、MinHash関数で生成されたバイナリベクトルを格納する
BINARY_VECTORフィールドを含める必要があります。次元は、32 * num_hashesに等しくなければならない。
ステップ 1: MinHash関数を使用したコレクションの作成
MinHash関数を使用するには、コレクションの作成時に関数を定義します。この関数はコレクションスキーマの一部となり、データ挿入と検索時に自動的に適用されます。
スキーマフィールドの定義
コレクションスキーマには、少なくとも3つのフィールドを含める必要があります:
プライマリフィールド:コレクション内の各エンティティを一意に識別する。
テキストフィールド(
VARCHAR):生のテキスト文書を格納する。MilvusがMinHash署名生成のためにテキストを処理できるように、enable_analyzer=Trueを設定します。デフォルトでは、Milvusはテキスト分析にstandardアナライザを使用します。別の分析器を設定するには、「使用ケースに適した分析器を選択する」を参照してください。バイナリベクターフィールド(
BINARY_VECTOR):MinHash 関数で自動生成されたバイナリ ベクトルを格納します。次元は32 * num_hashesと等しくなければならない。
from pymilvus import MilvusClient, DataType, Function, FunctionType
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
schema = client.create_schema()
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="document_content", datatype=DataType.VARCHAR, max_length=9000, enable_analyzer=True)
schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=8192)
// java
// nodejs
// go
# restful
MinHash関数の定義
MinHash関数は、分析されたテキストを、ドキュメント間のJaccard類似度を近似するバイナリベクトルに変換します。
関数を定義し、スキーマに追加します:
minhash_function = Function(
name="minhash_function",
input_field_names=["document_content"], # Name of the VARCHAR field containing raw text
output_field_names=["binary_vector"], # Name of the BINARY_VECTOR field for generated signatures
function_type=FunctionType.MINHASH,
params={
"num_hashes": 256, # Number of hash functions; produces dim = 32 * 256 = 8192
"shingle_size": 3, # N-gram size for shingling
}
)
schema.add_function(minhash_function)
// java
// nodejs
// go
# restful
設定オプション
MinHash関数のparams 辞書は、以下のパラメータを受け付ける。パラメータ名の大文字と小文字は区別されません。
パラメータ |
タイプ |
デフォルト |
説明 |
|---|---|---|---|
|
int |
から派生 |
署名生成のためのハッシュ関数の数。出力バイナリベクトルの次元は |
|
int |
|
シングリングのためのN-gramサイズ。単語レベル:1-3が一般的。文字レベル:2-6が一般的。 |
|
str |
|
使用するハッシュ関数。オプション:
|
|
str |
|
トークン化レベル。オプション:
|
|
int |
|
MinHash関数初期化用のランダムシード。 |
インデックスの構成
MinHashバイナリベクトルの推奨インデックスタイプはMINHASH_LSH で、メトリックタイプはMHJACCARD です。
index_params = client.prepare_index_params()
index_params.add_index(
field_name="binary_vector",
index_type="MINHASH_LSH",
metric_type="MHJACCARD",
params={
"mh_lsh_band": 128,
"mh_element_bit_width": 32,
"with_raw_data": True,
},
)
// java
// nodejs
// go
# restful
コレクションの作成
上で定義したスキーマとインデックスパラメータを使用して、コレクションを作成する:
client.create_collection(
collection_name="dedup_collection",
schema=schema,
index_params=index_params,
)
// java
// nodejs
// go
# restful
ステップ2:ドキュメントの挿入
コレクションをセットアップしたら、テキストデータを挿入する。MinHash関数は、各文書のバイナリベクタを自動的に生成します。
client.insert(
"dedup_collection",
[
{"document_content": "information retrieval is a field of study that helps users find relevant information in large datasets"},
{"document_content": "information retrieval is a research field focused on helping users find relevant data in large collections"},
{"document_content": "information retrieval is a field of research helping users search for relevant information in large datasets"},
],
)
// java
// nodejs
// go
# restful
ステップ3:MinHashによる検索
データを挿入したら、生テキストのクエリーを提供して、重複の少ない文書を検索します。Milvusは自動的にクエリテキストをMinHashバイナリベクトルに変換し、推定Jaccard類似度を使用して最も類似した文書を検索します。
search_params = {
"metric_type": "MHJACCARD",
"params": {},
}
results = client.search(
collection_name="dedup_collection",
data=["information retrieval is a research field focused on helping users find relevant data in large collections"],
anns_field="binary_vector",
limit=3,
output_fields=["document_content"],
search_params=search_params,
)
for hits in results:
for hit in hits:
print(f"ID: {hit['id']}, Distance: {hit['distance']}")
print(f"Document: {hit['entity']['document_content']}")
// java
// nodejs
// go
# restful
次のページ
全文検索:重複検出の代わりに、語彙の関連性ランキングにBM25を使用します。
アナライザーの概要:テキスト・トークナイゼーションのためのカスタム・アナライザーの設定。
MINHASH_LSH インデックス:リコールとパフォーマンスのための LSH パラメーターのチューニングについて学びます。