• 關於 Milvus
  • 開始使用
  • 概念
  • 使用者指南
    • 收藏集
    • 模式與資料欄位
    • 插入與刪除
    • 索引
    • 搜尋
    • 功能與模型推論
    • 儲存優化
    • 快照
  • 資料匯入
  • AI 工具
  • 管理指南
  • 工具
  • 整合
  • 教學
  • 常見問題
  • API Reference

MinHash 函數Compatible with Milvus 3.0.x

MinHash 函數可將原始文字轉換成近似文件間Jaccard 相似度二進位向量。它應用文字分頁和多重散列函數,以產生固定長度的簽章向量,從而實現快速的近似重複檢測和大規模的文件重複刪除。

MinHash 作為一個內建函式,可在 Milvus 內執行,不需要外部模型推論或預先處理。您只要插入原始文字,Milvus 就會自動產生 MinHash 簽章向量。

限制

  • 輸出欄位必須是BINARY_VECTOR ,其維度必須滿足dim % 32 == 0 ,因為每個 MinHash 簽章都是 32 位元的切細值。

  • 二進位向量欄位的dim 必須等於32 * num_hashes 。不匹配會導致錯誤。

  • 當使用MINHASH_LSH 索引與 MinHash 函式輸出時,mh_element_bit_width 必須設定為32

MinHash 如何運作

展開看看它如何運作

MinHash是一種區域敏感的散列技術,可估算集合間的Jaccard 類似性。在 Milvus 中,MinHash 功能遵循此管道:您提供原始文字作為輸入,Milvus 產生二進位向量作為輸出 - 內部處理所有中間步驟。

整體工作流程包括一個共享的文字處理管道,同時用於文件擷取與查詢處理,接著是特定階段的儲存與擷取作業。

Iaqkbfeh8oqggsx6nsocfosondo Iaqkbfeh8oqggsx6nsocfosondo

共用文字處理管道

文件擷取和查詢處理都會將原始文字經過相同的四階段轉換:

  1. 文本分析:文字由分析器處理 (當token_level"word"),或直接使用 (當token_level"char")。詞彙層級的標記化應用在輸入欄位上設定的分析器,將文字分割成詞彙 - 例如,"milvus is vector db" 變成["milvus", "is", "vector", "db"]

  2. 分割:標記被分割成大小為shingle_size 的重疊 n-grams (shingles)。例如,在字詞層面上使用 3-grams 時,標記["information", "retrieval", "is", "a", "field"] 就會變成["information retrieval is", "retrieval is a", "is a field"] 之類的 shingles。

  3. MinHash 簽名產生:多重散列函數 (H1, H2, ..., Hn, 其中 n =num_hashes) 應用於楔形集。對於每個切細函數,會在所有銘牌中選取最小的切細值。這些最小值的集合形成 MinHash 簽署 - 一個固定長度的表示,近似原始文件的 Jaccard 相似度。

  4. 二進位向量編碼:每個簽章值都是 32 位元的切細值,完整的簽章會打包成維度為BINARY_VECTOR32 * num_hashes

文件擷取

在插入過程中,共享管道產生的二進位向量會儲存在MINHASH_LSH 索引中。索引會維護一個 LSH (Locality-Sensitive Hashing) 表,將相似的簽章歸類到相同的桶中,以便在查詢時快速檢索候選簽章。

查詢處理

在搜尋過程中,查詢文字會經由相同的共用管道產生二進位向量。這個向量會用來在MINHASH_LSH 索引中執行 LSH 查詢,快速找出可能相似的候選對。然後按照估計的 Jaccard 相似度對候選進行排序,並傳回前 K 個結果。

由於兩個路徑共用相同的轉換邏輯,兩個內容高度重疊的文件會產生相似的 MinHash 簽署。因此,即使文件在字序、格式或次要措辭上有差異,此功能仍能有效找出近乎重複的文件。

開始之前

在使用 MinHash 功能之前,請規劃您的收集模式,以包含下列內容:

  • 原始內容的文字欄位

    您的集合必須包含一個VARCHAR 欄位來儲存原始文字。這個欄位是 MinHash 函式的輸入。

  • 文字欄位的分析器(當使用字元層級標記化時)

    如果token_level 設定為"word" (預設),文字欄位必須啟用分析器。分析器定義文字在分片之前如何被標記化。預設情況下,Milvus 使用standard 分析器。若要設定不同的分析器,請參閱為您的使用個案選擇正確的分析器

  • MinHash 輸出的二進位向量欄位

    您的集合必須包含BINARY_VECTOR 欄位,以儲存 MinHash 函式產生的二進位向量。維度必須等於32 * num_hashes

步驟 1:建立具有 MinHash 函數的集合

要使用 MinHash 函數,請在建立集合時定義它。該函數會成為集合模式的一部分,並在資料插入和搜尋時自動套用。

定義模式欄位

您的集合模式必須包含至少三個欄位:

  • 主要欄位:唯一識別資料集中的每個實體。

  • 文字欄位(VARCHAR):儲存原始文字文件。設定enable_analyzer=True ,以便 Milvus 可以處理文字以產生 MinHash 簽章。預設情況下,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

字符串

"xxhash"

要使用的 Hash 函數。選項:

  • "xxhash" (快速)

  • "sha1" (較慢,抗碰撞能力較高)。

token_level

str

"word"

令牌化程度。選項:

  • "word": 使用欄位的分析器進行標記化,然後應用 n-gram shingling。

  • "char" /"character": 直接在原始字元上套用 n-gram shingling (不使用分析器)。

    字元層級提供更強的語意和更高的效率,但依賴於特定語言的標記化。字元層次則與語言無關,但會產生語義較弱的高維字串。

seed

亂數

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 參數以獲得召回率和效能。