• Über Milvus
  • Los geht's
  • Konzepte
  • Benutzerhandbuch
    • Sammlungen
    • Schema & Datenfelder
    • Einfügen & Löschen
    • Indizes
    • Suche
    • Funktion und Modellinferenz
    • Optimierung der Speicherung
    • Schnappschüsse
  • Datenimport
  • AI-Tools
  • Leitfaden für die Verwaltung
  • Werkzeuge
  • Integrationen
  • Anleitungen
  • FAQs
  • API Reference

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_VECTOR mit einer Dimension sein, die dim % 32 == 0 erfüllt, da jede MinHash-Signatur ein 32-Bit-Hash-Wert ist.

  • Die dim des binären Vektorfeldes muss gleich 32 * num_hashes sein. Eine Nichtübereinstimmung führt zu einem Fehler.

  • Bei Verwendung des Index MINHASH_LSH mit der Ausgabe der MinHash-Funktion muss mh_element_bit_width auf 32 gesetzt werden.

Wie MinHash funktioniert

Erweitern Sie, um zu sehen, wie es 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 Iaqkbfeh8oqggsx6nsocfosondo

Gemeinsame Textverarbeitungspipeline

Sowohl bei der Dokumentenerfassung als auch bei der Abfrageverarbeitung durchläuft der Rohtext die gleiche vierstufige Transformation:

  1. Textanalyse: Der Text wird von einem Analysator verarbeitet (wenn token_level "word" ist) oder direkt verwendet (wenn token_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"] .

  2. Shingling: Die Token werden in sich überlappende n-Gramme (Schindeln) der Größe shingle_size aufgeteilt. 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"].

  3. 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.

  4. Binärvektor-Kodierung: Jeder Signaturwert ist ein 32-Bit-Hash, und die vollständige Signatur wird in ein BINARY_VECTOR der Dimension 32 * num_hashes gepackt.

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 VARCHAR Feld 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_level auf "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 den standard analyzer. 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_VECTOR Feld enthalten, um die von der MinHash-Funktion erzeugten binären Vektoren zu speichern. Die Dimension muss gleich 32 * num_hashes sein.

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 Sie enable_analyzer=True ein, damit Milvus den Text für die MinHash-Signaturerstellung verarbeiten kann. Standardmäßig verwendet Milvus den standard Analysator 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 gleich 32 * num_hashes sein.

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

num_hashes

int

Abgeleitet von dim / 32

Anzahl der Hash-Funktionen für die Signaturerstellung. Die Dimension des binären Ausgangsvektors ist gleich 32 * num_hashes. Höhere Werte verringern die Varianz bei der Ähnlichkeitsschätzung, erhöhen aber den Rechenaufwand. Empfohlen: 256 (dim = 8192).

shingle_size

int

3

N-Gramm-Größe für Shingling. Wort-Ebene: 1-3 ist typisch. Zeichenebene: 2-6 ist typisch.

hash_function

str

"xxhash"

Zu verwendende Hash-Funktion. Optionen:

  • "xxhash" (schnell)

  • "sha1" (langsamer, höhere Kollisionssicherheit).

token_level

str

"word"

Tokenisierungsgrad. Optionen:

  • "word": verwendet den Analysator des Feldes zur Tokenisierung und wendet dann n-gram shingling an.

  • "char" / "character": wendet n-gram shingling direkt auf Rohzeichen an (kein Analysator).

    Die Wortebene bietet eine stärkere Semantik und höhere Effizienz, hängt aber von der sprachspezifischen Tokenisierung ab. Die Zeichenebene ist sprachunabhängig, erzeugt aber höherdimensionale Shingles mit schwächerer Semantik.

seed

int

1234

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.