• Milvusについて
  • スタート
  • コンセプト
  • ユーザーガイド
    • コレクション
    • スキーマとデータフィールド
    • 挿入と削除
    • インデックス
    • 検索
    • 関数とモデル推論
    • ストレージの最適化
    • スナップ写真
  • データインポート
  • AIツール
  • 管理ガイド
  • ツール
  • 統合
  • チュートリアル
  • よくあるご質問
  • API Reference

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_width32 に設定する必要があります。

MinHashの仕組み

MinHashがどのように機能するかを見るには、次のように展開します。

MinHashは、集合間のJaccard類似度を推定する局所性を考慮したハッシュ技法である。Milvusでは、MinHash関数は次のようなパイプラインに従っています:入力として生テキストを提供し、Milvusは出力としてバイナリベクトルを生成します。

全体的なワークフローは、ドキュメントの取り込みとクエリ処理の両方で使用される共有テキスト処理パイプラインと、それに続く保存と検索のためのフェーズ固有の操作で構成される。

Iaqkbfeh8oqggsx6nsocfosondo Iaqkbfeh8oqggsx6nsocfosondo

共有テキスト処理パイプライン

文書取り込みとクエリ処理の両方が、生テキストを同じ4段階の変換に通す:

  1. テキスト分析:テキストは、アナライザーによって処理されるか(token_level"word" の場合)、直接使用される(token_level"char" の場合)。単語レベルのトークン化は、入力フィールドに設定されたアナライザーを適用して、テキストを用語に分割します。たとえば、"milvus is vector db"["milvus", "is", "vector", "db"] になります。

  2. シンギング:トークンは、shingle_size サイズの重複する n-gram(シング ル)に分割されます。たとえば、単語レベルで3-gramを使用すると、トークン["information", "retrieval", "is", "a", "field"]["information retrieval is", "retrieval is a", "is a field"] のようなシングルになる。

  3. MinHash署名生成:複数のハッシュ関数(H1、H2、...、Hn、n =num_hashes )がシング ル集合に適用される。各ハッシュ関数について、すべての帯状疱疹にわたる最小のハッシュ値が選択される。これらの最小値の集合がMinHash署名を形成する - これはオリジナル文書のJaccard類似度を近似する固定長の表現である。

  4. バイナリベクターエンコーディング:各署名値は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 辞書は、以下のパラメータを受け付ける。パラメータ名の大文字と小文字は区別されません

パラメータ

タイプ

デフォルト

説明

num_hashes

int

から派生dim / 32

署名生成のためのハッシュ関数の数。出力バイナリベクトルの次元は32 * num_hashes に等しい。値を大きくすると類似度推定の分散が小さくなるが、計算量が増える。推奨:256 (dim = 8192)。

shingle_size

int

3

シングリングのためのN-gramサイズ。単語レベル:1-3が一般的。文字レベル:2-6が一般的。

hash_function

str

"xxhash"

使用するハッシュ関数。オプション:

  • "xxhash" (高速)

  • "sha1" (遅い、衝突耐性が高い)。

token_level

str

"word"

トークン化レベル。オプション:

  • "word"トークン化にフィールドのアナライザーを使い、n-gram shinglingを適用する。

  • "char" /"character": 生の文字に直接n-gram shinglingを適用する(アナライザーなし)。

    単語レベルは、より強力なセマンティクスと高い効率を提供するが、言語固有のトークン化に依存する。文字レベルは言語に依存しないが、高次元のシングルを生成し、セマンティクスは弱い。

seed

int

1234

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 パラメーターのチューニングについて学びます。