Pencarian Vektor Dasar dengan StructArray

Gunakan halaman ini untuk menjalankan pencarian vektor pada subbidang vektor di dalam bidang StructArray. StructArray mendukung dua mode pencarian vektor dasar: pencarian EmbeddingList, yang menilai daftar embedding yang disimpan di setiap entitas, dan pencarian tingkat elemen, yang mencari setiap elemen Struct secara terpisah.

Halaman ini menggunakan koleksi " tech_articles " dari "Create a StructArray Field". Koleksi tersebut memiliki bidang StructArray bernama " chunks". Setiap chunk berisi teks, metadata skalar, subbidang vektor bernama " emb_list_vector " dengan indeks untuk pencarian EmbeddingList, dan subbidang vektor bernama " emb " dengan indeks untuk pencarian tingkat elemen.

Sebelum Anda memulai

Pastikan skema koleksi, data, dan indeks sudah disiapkan.

PersyaratanDi mana mempersiapkannya
Buat bidang StructArray, seperti chunks.Buat bidang StructArray
Sisipkan entitas yang bidang ` chunks `-nya berisi objek Struct.Masukkan Data ke dalam Bidang StructArray
Buat indeks ` MAX_SIM* ` pada ` chunks[emb_list_vector] ` untuk pencarian `EmbeddingList`.Indeks Bidang StructArray
Buat indeks metrik vektor biasa pada ` chunks[emb] ` untuk pencarian tingkat elemen.Indeks Bidang StructArray

Peringatan

Sebuah bidang vektor atau subbidang vektor hanya dapat memiliki satu indeks. Jika Anda memerlukan pencarian EmbeddingList dan pencarian tingkat elemen, buatlah dua subbidang vektor terpisah. Pada halaman ini, chunks[emb_list_vector] diindeks untuk pencarian EmbeddingList, dan chunks[emb] diindeks untuk pencarian tingkat elemen.

Pilih mode pencarian

AspekPencarian EmbeddingListPencarian tingkat elemen
Subbidang targetchunks[emb_list_vector]chunks[emb]
Data kueriDaftar embedding yang berisi satu atau lebih vektor.Vektor biasa.
Keluarga metrikMAX_SIM*, seperti MAX_SIM_COSINE.Metrik vektor reguler, seperti COSINE, IP, atau L2.
Apa yang diwakili oleh satu hasil pencocokanSebuah entitas yang cocok yang subbidang vektor StructArray-nya mirip dengan daftar embedding kueri.Elemen Struct yang cocok di dalam bidang StructArray.
Tingkat granularitas hasilTingkat entitas.Tingkat elemen Struct.
OffsetTidak berlaku.Mengidentifikasi posisi berbasis nol dari elemen Struct yang cocok saat dikembalikan.
Penggunaan umumColBERT, ColPali, dan pola pengambilan data interaksi akhir lainnya.Pencarian tingkat chunk, tingkat bagian teks, tingkat klip, tingkat patch, atau tingkat fakta.

Gunakan pencarian EmbeddingList ketika kueri itu sendiri berisi beberapa vektor dan subbidang vektor StructArray target diindeks dengan metrik " MAX_SIM* ". Hasilnya adalah kecocokan pada tingkat entitas.

from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus",
)

query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])

results = client.search(
    collection_name="tech_articles",
    data=[query],
    anns_field="chunks[emb_list_vector]",
    limit=3,
    output_fields=[
        "doc_id",
        "title",
        "category",
        "chunks[text]",
        "chunks[section]",
    ],
)

for hits in results:
    for hit in hits:
        print(hit["id"], hit["distance"], hit["entity"])

Dalam mode pencarian ini, " limit " mengontrol berapa banyak entitas yang dikembalikan untuk setiap kueri. Output dapat mencakup subbidang StructArray, tetapi hasil pencocokan itu sendiri mewakili entitas induk yang cocok, bukan satu elemen Struct tertentu.

Untuk panduan lengkap bergaya ColBERT atau ColPali, lihat Pencarian dengan Daftar Embedding. Halaman ini hanya membahas perilaku pencarian StructArray dasar.

Gunakan pencarian tingkat elemen jika setiap elemen Struct harus berpartisipasi dalam pencarian vektor secara independen. Kueri berupa vektor biasa, dan subbidang vektor target harus diindeks dengan metrik vektor biasa.

query_vector = [0.19, 0.24, 0.30, 0.37]

results = client.search(
    collection_name="tech_articles",
    data=[query_vector],
    anns_field="chunks[emb]",
    limit=5,
    output_fields=[
        "doc_id",
        "title",
        "chunks[text]",
        "chunks[section]",
        "chunks[page]",
        "chunks[quality_score]",
    ],
)

for hits in results:
    for hit in hits:
        print(
            "doc_id:", hit["id"],
            "distance:", hit["distance"],
            "offset:", hit.get("offset"),
            "entity:", hit["entity"],
        )

Dalam pencarian tingkat elemen, setiap hasil pencocokan mewakili elemen Struct yang cocok. Nilai " offset " adalah posisi berbasis nol dari elemen tersebut di bidang StructArray. Entitas yang sama dapat muncul lebih dari sekali jika lebih dari satu elemen Struct cocok dengan kueri. Nilai " limit " berlaku untuk hasil pencocokan elemen, bukan entitas induk yang unik.

Menafsirkan hasil

Item hasilPencarian EmbeddingListPencarian tingkat elemen
idKunci utama entitas yang cocok.Kunci utama entitas yang berisi elemen Struct yang cocok.
distance atau skorSkor atau jarak antara daftar embedding kueri dan daftar embedding yang tersimpan.Skor atau jarak antara vektor kueri dan vektor elemen Struct yang cocok.
offsetTidak berlaku.Posisi berbasis nol dari elemen Struct yang cocok saat dikembalikan.
Kunci utama yang berulangTidak diharapkan untuk satu kueri karena hasilnya berada di tingkat entitas.Mungkin terjadi, karena beberapa elemen Struct dalam entitas yang sama dapat cocok.
Bidang keluaran StructArray yang dimintaDikembalikan dari entitas yang cocok.Dikembalikan dengan bentuk hasil pencocokan tingkat elemen yang didukung oleh API dan SDK tujuan.

Kesalahan umum

  • Menggunak chunks.emb alih-alih sintaks jalur subbidang yang diperlukan, yaitu chunks[emb].

  • Menggunakan kueri EmbeddingList terhadap subbidang vektor yang diindeks dengan metrik vektor biasa.

  • Menggunakan kueri vektor biasa terhadap subbidang vektor yang diindeks dengan metrik MAX_SIM*.

  • Mengharapkan pencarian tingkat elemen limit mengembalikan sejumlah entitas induk yang unik. Pencarian ini mengembalikan hasil elemen.

  • Mengharapkan pencarian EmbeddingList mengembalikan satu offset elemen tertentu. Hasilnya adalah kecocokan tingkat entitas.

  • Menggunakan kembali satu subbidang vektor untuk kedua mode pencarian. Gunakan subbidang vektor terpisah karena setiap subbidang vektor hanya menerima satu indeks.

Langkah selanjutnya

  1. Untuk membatasi pencarian tingkat elemen berdasarkan kondisi skalar, baca Pencarian Terfilter dengan StructArray.

  2. Untuk melakukan pencarian berdasarkan batas skor atau jarak, baca Pencarian Rentang dengan StructArray.

  3. Untuk mengembalikan paling banyak satu hasil per entitas induk setelah pencarian tingkat elemen, baca Pencarian Pengelompokan dengan StructArray.

  4. Untuk menggabungkan pencarian StructArray dengan pencarian vektor lainnya, baca Pencarian Hibrida dengan StructArray.

  5. Untuk meninjau tipe data, metrik, filter, dan batasan khusus versi yang didukung, baca Batasan StructArray.

Diterjemahkan olehDeepL

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?