• Tentang Milvus
  • Memulai
  • Konsep
  • Panduan Pengguna
    • Koleksi
    • Bidang Skema & Data
    • Menyisipkan & Menghapus
    • Indeks
    • Pencarian
    • Inferensi Fungsi & Model
    • Optimalisasi Penyimpanan
    • Jepretan
  • Impor Data
  • Alat AI
  • Panduan Administrasi
  • Peralatan
  • Integrasi
  • Tutorial
  • Pertanyaan Umum
  • API Reference

Fungsi MinHashCompatible with Milvus 3.0.x

Fungsi MinHash mengubah teks mentah menjadi vektor biner yang mendekati kemiripan Jaccard di antara dokumen. Fungsi ini menerapkan shingling teks dan beberapa fungsi hash untuk menghasilkan vektor tanda tangan dengan panjang tetap, sehingga memungkinkan deteksi near-duplikasi yang cepat dan deduplikasi dokumen dalam skala besar.

Sebagai fungsi bawaan, MinHash berjalan di dalam Milvus dan tidak memerlukan inferensi model eksternal atau prapemrosesan. Anda memasukkan teks mentah, dan Milvus menghasilkan vektor tanda tangan MinHash secara otomatis.

Batasan

  • Bidang keluaran harus berupa BINARY_VECTOR dengan dimensi yang memenuhi dim % 32 == 0, karena setiap tanda tangan MinHash adalah nilai hash 32-bit.

  • dim dari bidang vektor biner harus sama dengan 32 * num_hashes. Ketidaksesuaian akan menyebabkan kesalahan.

  • Ketika menggunakan indeks MINHASH_LSH dengan keluaran fungsi MinHash, mh_element_bit_width harus disetel ke 32.

Bagaimana MinHash bekerja

Perluas untuk melihat cara kerjanya

MinHash adalah teknik hashing yang peka terhadap lokalitas yang memperkirakan kemiripan Jaccard antar set. Di Milvus, fungsi MinHash mengikuti alur berikut ini: Anda memberikan teks mentah sebagai masukan, dan Milvus menghasilkan vektor biner sebagai keluaran - menangani semua langkah perantara secara internal.

Alur kerja secara keseluruhan terdiri dari sebuah pipeline pemrosesan teks bersama yang digunakan oleh proses pemasukan dokumen dan pemrosesan kueri, diikuti oleh operasi fase spesifik untuk penyimpanan dan pengambilan.

Iaqkbfeh8oqggsx6nsocfosondo Iaqkbfeh8oqggsx6nsocfosondo

Pipeline pemrosesan teks bersama

Baik pemasukan dokumen maupun pemrosesan kueri melewatkan teks mentah melalui transformasi empat tahap yang sama:

  1. Analisis teks: Teks diproses oleh penganalisis (ketika token_level adalah "word") atau digunakan secara langsung (ketika token_level adalah "char"). Tokenisasi tingkat kata menerapkan penganalisis yang dikonfigurasikan pada bidang input untuk menyegmentasikan teks menjadi istilah - misalnya, "milvus is vector db" menjadi ["milvus", "is", "vector", "db"].

  2. Herpes zoster: Token dipecah menjadi n-gram yang tumpang tindih (herpes zoster) dengan ukuran shingle_size. Sebagai contoh, dengan 3-gram pada tingkat kata, token ["information", "retrieval", "is", "a", "field"] menjadi shingles seperti ["information retrieval is", "retrieval is a", "is a field"].

  3. Pembuatan tanda tangan MinHash: Beberapa fungsi hash (H1, H2, ..., Hn, di mana n = num_hashes) diterapkan pada kumpulan shingle. Untuk setiap fungsi hash, nilai hash minimum di seluruh sirap dipilih. Kumpulan nilai minimum ini membentuk tanda tangan MinHash - representasi dengan panjang tetap yang mendekati kemiripan Jaccard dari dokumen asli.

  4. Pengkodean vektor biner: Setiap nilai tanda tangan adalah hash 32-bit, dan tanda tangan lengkap dikemas ke dalam sebuah BINARY_VECTOR berdimensi 32 * num_hashes.

Penyisipan dokumen

Selama penyisipan, vektor biner yang dihasilkan oleh pipeline bersama disimpan dalam indeks MINHASH_LSH. Indeks ini menyimpan tabel LSH (Locality-Sensitive Hashing) yang mengelompokkan tanda tangan yang serupa ke dalam bucket yang sama, sehingga memungkinkan pengambilan kandidat dengan cepat pada waktu kueri.

Pemrosesan kueri

Selama pencarian, teks kueri melewati pipeline bersama yang sama untuk menghasilkan vektor biner. Vektor ini digunakan untuk melakukan pencarian LSH di indeks MINHASH_LSH, yang dengan cepat mengidentifikasi pasangan kandidat yang kemungkinan besar mirip. Kandidat kemudian diurutkan berdasarkan estimasi kemiripan Jaccard dan hasil K teratas dikembalikan.

Karena kedua jalur memiliki logika transformasi yang sama, dua dokumen dengan konten yang sangat tumpang tindih menghasilkan tanda tangan MinHash yang serupa. Hal ini membuat fungsi ini efektif untuk menemukan duplikat yang hampir sama bahkan ketika dokumen berbeda dalam urutan kata, format, atau frasa kecil.

Sebelum Anda mulai

Sebelum menggunakan fungsi MinHash, rencanakan skema koleksi Anda untuk menyertakan yang berikut ini:

  • Bidang teks untuk konten mentah

    Koleksi Anda harus menyertakan bidang VARCHAR untuk menyimpan teks mentah. Bidang ini berfungsi sebagai masukan untuk fungsi MinHash.

  • Penganalisis untuk bidang teks (saat menggunakan tokenisasi tingkat kata)

    Jika token_level disetel ke "word" (default), bidang teks harus memiliki penganalisis yang diaktifkan. Penganalisis mendefinisikan bagaimana teks diberi token sebelum di-shing. Secara default, Milvus menggunakan penganalisis standard. Untuk mengonfigurasi penganalisis yang berbeda, lihat Memilih Penganalisis yang Tepat untuk Kasus Penggunaan Anda.

  • Bidang vektor biner untuk keluaran MinHash

    Koleksi Anda harus menyertakan bidang BINARY_VECTOR untuk menyimpan vektor biner yang dihasilkan oleh fungsi MinHash. Dimensinya harus sama dengan 32 * num_hashes.

Langkah 1: Membuat koleksi dengan fungsi MinHash

Untuk menggunakan fungsi MinHash, tentukan fungsi tersebut saat membuat koleksi. Fungsi ini menjadi bagian dari skema koleksi dan diterapkan secara otomatis selama penyisipan dan pencarian data.

Menentukan bidang skema

Skema koleksi Anda harus menyertakan setidaknya tiga bidang:

  • Bidang utama: Mengidentifikasi secara unik setiap entitas dalam koleksi.

  • Bidang teks (VARCHAR): Menyimpan dokumen teks mentah. Tetapkan enable_analyzer=True agar Milvus dapat memproses teks untuk pembuatan tanda tangan MinHash. Secara default, Milvus menggunakan penganalisis standard untuk analisis teks. Untuk mengonfigurasi penganalisis yang berbeda, lihat Memilih Penganalisis yang Tepat untuk Kasus Penggunaan Anda.

  • Bidang vektor biner (BINARY_VECTOR): Menyimpan vektor biner yang dihasilkan secara otomatis oleh fungsi MinHash. Dimensinya harus sama dengan 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

Mendefinisikan fungsi MinHash

Fungsi MinHash mengubah teks yang dianalisis menjadi vektor biner yang mendekati kemiripan Jaccard antar dokumen.

Tentukan fungsi dan tambahkan ke skema Anda:

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

Opsi konfigurasi

Kamus params dari fungsi MinHash menerima parameter-parameter berikut ini. Semua nama parameter tidak peka huruf besar/kecil.

Parameter

Tipe

Default

Deskripsi

num_hashes

int

Berasal dari dim / 32

Jumlah fungsi hash untuk pembuatan tanda tangan. Dimensi vektor biner keluaran sama dengan 32 * num_hashes. Nilai yang lebih tinggi mengurangi varians dalam estimasi kemiripan tetapi meningkatkan komputasi. Direkomendasikan: 256 (dim = 8192).

shingle_size

int

3

Ukuran N-gram untuk shingling. Tingkat kata: 1-3 adalah tipikal. Tingkat karakter: 2-6 adalah tipikal.

hash_function

str

"xxhash"

Fungsi hash untuk digunakan. Pilihan:

  • "xxhash" (cepat)

  • "sha1" (lebih lambat, resistensi tabrakan lebih tinggi).

token_level

str

"word"

Tingkat tokenisasi. Pilihan:

  • "word": menggunakan penganalisis bidang untuk tokenisasi, lalu menerapkan n-gram shingling.

  • "char" / "character": menerapkan n-gram shingling secara langsung pada karakter mentah (tanpa analisa).

    Tingkat kata memberikan semantik yang lebih kuat dan efisiensi yang lebih tinggi, tetapi tergantung pada tokenisasi khusus bahasa. Tingkat karakter bersifat bahasa-agnostik tetapi menghasilkan shingles berdimensi lebih tinggi dengan semantik yang lebih lemah.

seed

int

1234

Benih acak untuk inisialisasi fungsi MinHash.

Mengkonfigurasi indeks

Jenis indeks yang direkomendasikan untuk vektor biner MinHash adalah MINHASH_LSH, dengan tipe metrik 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

Buat koleksi

Buat koleksi menggunakan skema dan parameter indeks yang telah ditentukan di atas:

client.create_collection(
    collection_name="dedup_collection",
    schema=schema,
    index_params=index_params,
)
// java
// nodejs
// go
# restful

Langkah 2: Memasukkan dokumen

Setelah menyiapkan koleksi Anda, masukkan data teks. Anda hanya perlu menyediakan teks mentah - fungsi MinHash secara otomatis menghasilkan vektor biner untuk setiap dokumen.

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

Langkah 3: Cari dengan MinHash

Setelah Anda memasukkan data, cari dokumen yang hampir sama dengan memberikan kueri teks mentah. Milvus secara otomatis mengubah teks kueri Anda menjadi vektor biner MinHash dan mengambil dokumen yang paling mirip menggunakan estimasi kemiripan 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

Selanjutnya