MinHash-FunktionCompatible with Milvus 3.0.x
Die MinHash-Funktion konvertiert Rohtext in binäre Vektoren, die die Jaccard-Ähnlichkeit zwischen Dokumenten annähern. Sie wendet Text-Shingling und mehrere Hash-Funktionen an, um Signaturvektoren mit fester Länge zu erzeugen, die eine schnelle Erkennung von Beinahe-Duplikaten und die Deduplizierung von Dokumenten in großem Umfang ermöglichen.
Als integrierte Funktion läuft MinHash innerhalb von Milvus und erfordert keine externe Modellinferenz oder Vorverarbeitung. Sie fügen Rohtext ein, und Milvus generiert die MinHash-Signaturvektoren automatisch.
Begrenzungen
Das Ausgabefeld muss eine
BINARY_VECTORmit einer Dimension sein, diedim % 32 == 0erfüllt, da jede MinHash-Signatur ein 32-Bit-Hash-Wert ist.Die
dimdes binären Vektorfeldes muss gleich32 * num_hashessein. Eine Nichtübereinstimmung führt zu einem Fehler.Bei Verwendung des Index
MINHASH_LSHmit der Ausgabe der MinHash-Funktion mussmh_element_bit_widthauf32gesetzt werden.
Wie MinHash funktioniert
MinHash ist ein ortsabhängiges Hashing-Verfahren, das die Jaccard-Ähnlichkeit zwischen Mengen schätzt. In Milvus folgt die MinHash-Funktion dieser Pipeline: Sie liefern den Rohtext als Eingabe, und Milvus erzeugt einen binären Vektor als Ausgabe - wobei alle Zwischenschritte intern abgewickelt werden.
Der gesamte Arbeitsablauf besteht aus einer gemeinsamen Textverarbeitungspipeline, die sowohl von der Dokumenteneingabe als auch von der Abfrageverarbeitung genutzt wird, gefolgt von phasenspezifischen Operationen für die Speicherung und den Abruf.
Iaqkbfeh8oqggsx6nsocfosondo
Gemeinsame Textverarbeitungspipeline
Sowohl bei der Dokumentenerfassung als auch bei der Abfrageverarbeitung durchläuft der Rohtext die gleiche vierstufige Transformation:
Textanalyse: Der Text wird von einem Analysator verarbeitet (wenn
token_level"word"ist) oder direkt verwendet (wenntoken_level"char"ist). Die Tokenisierung auf Wortebene wendet den für das Eingabefeld konfigurierten Analyzer an, um den Text in Begriffe zu segmentieren - zum Beispiel wird aus"milvus is vector db"["milvus", "is", "vector", "db"].Shingling: Die Token werden in sich überlappende n-Gramme (Schindeln) der Größe
shingle_sizeaufgeteilt. Bei 3-Grammen auf Wortebene werden z. B. die Token["information", "retrieval", "is", "a", "field"]zu Shingles wie["information retrieval is", "retrieval is a", "is a field"].MinHash-Signaturerzeugung: Mehrere Hash-Funktionen (H1, H2, ..., Hn, mit n =
num_hashes) werden auf die Shingle-Menge angewendet. Für jede Hash-Funktion wird der minimale Hash-Wert für alle Schindeln ausgewählt. Die Sammlung dieser Mindestwerte bildet die MinHash-Signatur - eine Darstellung mit fester Länge, die der Jaccard-Ähnlichkeit des Originaldokuments nahe kommt.Binärvektor-Kodierung: Jeder Signaturwert ist ein 32-Bit-Hash, und die vollständige Signatur wird in ein
BINARY_VECTORder Dimension32 * num_hashesgepackt.
Einfügen von Dokumenten
Beim Einfügen wird der von der gemeinsamen Pipeline erzeugte binäre Vektor im Index MINHASH_LSH gespeichert. Der Index verwaltet eine LSH-Tabelle (Locality-Sensitive Hashing), in der ähnliche Signaturen in denselben Buckets gruppiert werden, was ein schnelles Auffinden von Kandidaten zum Zeitpunkt der Abfrage ermöglicht.
Abfrageverarbeitung
Während der Suche durchläuft der Abfragetext die gleiche gemeinsame Pipeline, um einen binären Vektor zu erzeugen. Dieser Vektor wird verwendet, um einen LSH-Lookup im MINHASH_LSH Index durchzuführen, der schnell Kandidatenpaare identifiziert, die wahrscheinlich ähnlich sind. Die Kandidaten werden dann nach der geschätzten Jaccard-Ähnlichkeit geordnet und die Top-K-Ergebnisse werden zurückgegeben.
Da beide Pfade die gleiche Transformationslogik verwenden, erzeugen zwei Dokumente mit stark überlappendem Inhalt ähnliche MinHash-Signaturen. Dies macht die Funktion effektiv für das Auffinden von Beinahe-Duplikaten, selbst wenn sich die Dokumente in der Wortreihenfolge, der Formatierung oder in kleineren Formulierungen unterscheiden.
Bevor Sie beginnen
Bevor Sie die MinHash-Funktion verwenden, planen Sie Ihr Sammlungsschema so, dass es Folgendes enthält:
Ein Textfeld für den Rohinhalt
Ihre Sammlung muss ein
VARCHARFeld zur Speicherung von Rohtext enthalten. Dieses Feld dient als Eingabe für die MinHash-Funktion.Einen Analyzer für das Textfeld (bei Verwendung der Tokenisierung auf Wortebene)
Wenn
token_levelauf"word"eingestellt ist (Standard), muss für das Textfeld ein Analysator aktiviert sein. Der Analyzer definiert, wie der Text vor dem Shingling in Token umgewandelt wird. Standardmäßig verwendet Milvus denstandardanalyzer. Um einen anderen Analyzer zu konfigurieren, lesen Sie den Abschnitt Wählen Sie den richtigen Analyzer für Ihren Anwendungsfall.Ein binäres Vektorfeld für die MinHash-Ausgabe
Ihre Sammlung muss ein
BINARY_VECTORFeld enthalten, um die von der MinHash-Funktion erzeugten binären Vektoren zu speichern. Die Dimension muss gleich32 * num_hashessein.
Schritt 1: Erstellen Sie eine Sammlung mit einer MinHash-Funktion
Um die MinHash-Funktion zu verwenden, definieren Sie sie bei der Erstellung der Sammlung. Die Funktion wird Teil des Sammlungsschemas und wird automatisch beim Einfügen und Suchen von Daten angewendet.
Definieren von Schemafeldern
Das Schema Ihrer Sammlung muss mindestens drei Felder enthalten:
Primärfeld: Identifiziert jede Entität in der Sammlung eindeutig.
Textfeld (
VARCHAR): Speichert rohe Textdokumente. Stellen Sieenable_analyzer=Trueein, damit Milvus den Text für die MinHash-Signaturerstellung verarbeiten kann. Standardmäßig verwendet Milvus denstandardAnalysator für die Textanalyse. Um einen anderen Analyzer zu konfigurieren, lesen Sie bitte den Abschnitt Wählen Sie den richtigen Analyzer für Ihren Anwendungsfall.Binäres Vektorfeld (
BINARY_VECTOR): Speichert binäre Vektoren, die automatisch von der MinHash-Funktion erzeugt werden. Die Dimension muss gleich32 * num_hashessein.
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
Definieren Sie die MinHash-Funktion
Die MinHash-Funktion wandelt analysierten Text in binäre Vektoren um, die die Jaccard-Ähnlichkeit zwischen Dokumenten annähern.
Definieren Sie die Funktion und fügen Sie sie zu Ihrem Schema hinzu:
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
Konfigurationsoptionen
Das params Wörterbuch der MinHash-Funktion akzeptiert die folgenden Parameter. Bei allen Parameternamen wird die Groß- und Kleinschreibung nicht berücksichtigt.
Parameter |
Typ |
Voreinstellung |
Beschreibung |
|---|---|---|---|
|
int |
Abgeleitet von |
Anzahl der Hash-Funktionen für die Signaturerstellung. Die Dimension des binären Ausgangsvektors ist gleich |
|
int |
|
N-Gramm-Größe für Shingling. Wort-Ebene: 1-3 ist typisch. Zeichenebene: 2-6 ist typisch. |
|
str |
|
Zu verwendende Hash-Funktion. Optionen:
|
|
str |
|
Tokenisierungsgrad. Optionen:
|
|
int |
|
Zufallsgenerator für die Initialisierung der MinHash-Funktion. |
Konfigurieren Sie den Index
Der empfohlene Indextyp für binäre MinHash-Vektoren ist MINHASH_LSH, mit dem metrischen Typ 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
Erstellen der Sammlung
Erstellen Sie die Sammlung unter Verwendung der oben definierten Schema- und Indexparameter:
client.create_collection(
collection_name="dedup_collection",
schema=schema,
index_params=index_params,
)
// java
// nodejs
// go
# restful
Schritt 2: Dokumente einfügen
Nachdem Sie Ihre Sammlung eingerichtet haben, fügen Sie Textdaten ein. Sie müssen nur den Rohtext bereitstellen - die MinHash-Funktion erzeugt automatisch den Binärvektor für jedes Dokument.
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
Schritt 3: Suche mit MinHash
Sobald Sie die Daten eingefügt haben, suchen Sie nach nahezu doppelten Dokumenten, indem Sie Rohtextabfragen bereitstellen. Milvus konvertiert Ihren Abfragetext automatisch in einen binären MinHash-Vektor und findet die ähnlichsten Dokumente anhand der geschätzten Jaccard-Ähnlichkeit.
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
Was kommt als nächstes
Volltextsuche: Verwenden Sie BM25 für die lexikalische Relevanzbewertung anstelle der Erkennung von Beinahe-Duplikaten.
Analyzer-Übersicht: Konfigurieren Sie benutzerdefinierte Analyzer für die Text-Tokenisierung.
MINHASH_LSH-Index: Erfahren Sie, wie Sie LSH-Parameter für Recall und Leistung optimieren können.