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
共用文字處理管道
文件擷取和查詢處理都會將原始文字經過相同的四階段轉換:
文本分析:文字由分析器處理 (當
token_level是"word"),或直接使用 (當token_level是"char")。詞彙層級的標記化應用在輸入欄位上設定的分析器,將文字分割成詞彙 - 例如,"milvus is vector db"變成["milvus", "is", "vector", "db"]。分割:標記被分割成大小為
shingle_size的重疊 n-grams (shingles)。例如,在字詞層面上使用 3-grams 時,標記["information", "retrieval", "is", "a", "field"]就會變成["information retrieval is", "retrieval is a", "is a field"]之類的 shingles。MinHash 簽名產生:多重散列函數 (H1, H2, ..., Hn, 其中 n =
num_hashes) 應用於楔形集。對於每個切細函數,會在所有銘牌中選取最小的切細值。這些最小值的集合形成 MinHash 簽署 - 一個固定長度的表示,近似原始文件的 Jaccard 相似度。二進位向量編碼:每個簽章值都是 32 位元的切細值,完整的簽章會打包成維度為
BINARY_VECTOR的32 * 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 字典接受下列參數。所有參數名稱不區分大小寫。
參數 |
類型 |
預設值 |
說明 |
|---|---|---|---|
|
int |
衍生自 |
產生簽章的雜湊函數。輸出的二進位向量維度等於 |
|
int |
|
分頁的 N-gram 大小。詞彙層級:1-3 是典型值。字元層級:2-6 是典型值。 |
|
字符串 |
|
要使用的 Hash 函數。選項:
|
|
str |
|
令牌化程度。選項:
|
|
亂數 |
|
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 參數以獲得召回率和效能。