Pencarian Hibrida dengan StructArray
Gunakan halaman ini untuk menggabungkan pencarian vektor StructArray dengan pencarian vektor lainnya dalam satu permintaan pencarian hibrida. Pencarian hibrida StructArray dapat menghasilkan hasil tingkat entitas atau hasil tingkat elemen, tergantung pada objek AnnSearchRequest yang Anda gabungkan.
Halaman ini menggunakan koleksi tech_articles dari Buat Bidang StructArray. Koleksi tersebut memiliki bidang vektor tingkat atas bernama title_vector dan bidang StructArray bernama chunks. Subbidang chunks[emb_list_vector] diindeks untuk pencarian EmbeddingList, sedangkan chunks[emb] diindeks untuk pencarian tingkat elemen.
Bagaimana pencarian hibrida diterapkan pada StructArray
AnnSearchRequest kombinasi | Cakupan kandidat akhir | Perilaku hasil | element_scope |
|---|---|---|---|
| Bidang vektor tingkat koleksi + subbidang EmbeddingList StructArray | Tingkat entitas | Kandidat akhir diindeks berdasarkan kunci utama. | Jangan gunakan. |
| Bidang vektor tingkat koleksi + subbidang tingkat elemen StructArray | Tingkat entitas | Hasil pencocokan tingkat elemen digabungkan menjadi kandidat tingkat entitas sebelum pemeringkatan ulang hibrida. | Konfigurasi penggabungan opsional pada tingkat elemen StructArray AnnSearchRequest. |
| Beberapa subbidang tingkat elemen di bawah bidang StructArray yang sama | Tingkat elemen | Kandidat akhir diindeks berdasarkan kunci utama ditambah offset elemen Struct. | Jangan gunakan. |
| Subbidang tingkat elemen di bawah bidang StructArray yang berbeda | Tingkat entitas | Offset elemen tidak berbagi identitas, sehingga setiap AnnSearchRequest tingkat elemen StructArray dikompres sebelum diurutkan ulang. | Konfigurasi penyembunyian opsional pada setiap sub AnnSearchRequest tingkat elemen StructArray. |
Peringatan
Gunakan ` element_scope ` hanya untuk mengonfigurasi penggabungan pada objek ` AnnSearchRequest ` tingkat elemen StructArray dalam pencarian hibrida tingkat elemen yang tidak menggunakan struktur yang sama. Jangan gunakan ini untuk permintaan EmbeddingList, permintaan vektor tingkat koleksi, atau pencarian hibrida tingkat elemen StructArray yang menggunakan struktur yang sama.
Sebelum memulai
Siapkan koleksi, data, dan indeks sebelum menjalankan pencarian hibrida.
| Persyaratan | Rincian |
|---|---|
| Bidang StructArray | Koleksi tersebut berisi bidang StructArray seperti chunks. |
| Subbidang vektor | Gunakan subbidang vektor terpisah untuk pencarian EmbeddingList dan pencarian tingkat elemen. |
| Indeks | chunks[emb_list_vector] menggunakan metrik MAX_SIM*. chunks[emb] menggunakan metrik vektor biasa seperti COSINE, IP, atau L2. |
| Reranker | Pilih reranker hibrida seperti RRFRanker atau reranker lain yang didukung oleh aplikasi Anda. |
Untuk pengaturan indeks, lihat Bidang StructArray Indeks.
Jalankan pencarian hibrida dengan permintaan EmbeddingList
Pencarian EmbeddingList pada subbidang vektor StructArray bersifat tingkat entitas dalam pencarian hibrida. Perilakunya mirip dengan permintaan pencarian vektor tingkat entitas dan tidak mengembalikan satu offset elemen Struct yang cocok.
from pymilvus import AnnSearchRequest, MilvusClient, RRFRanker
from pymilvus.client.embedding_list import EmbeddingList
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query_vector = [0.19, 0.24, 0.30, 0.37]
query_list = EmbeddingList()
query_list.add([0.12, 0.21, 0.32, 0.44])
query_list.add([0.18, 0.23, 0.29, 0.36])
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_list_req = AnnSearchRequest(
data=[query_list],
anns_field="chunks[emb_list_vector]",
limit=10,
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_list_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)
Dalam contoh ini, kedua objek ` AnnSearchRequest ` menghasilkan kandidat tingkat entitas. Hasil akhir diindeks berdasarkan kunci utama entitas induk. Jangan tambahkan ` element_scope ` ke permintaan `EmbeddingList`.
Jalankan pencarian hibrida tingkat elemen pada StructArray yang sama
Ketika semua objek ` AnnSearchRequest ` menargetkan subbidang vektor tingkat elemen di bawah bidang `StructArray` yang sama, pencarian hibrida dapat mempertahankan kandidat tingkat elemen melalui penataan ulang peringkat. Ini adalah satu-satunya mode hibrida `StructArray` di mana hasil akhir tetap berada pada tingkat elemen.
Contoh berikut mengasumsikan bidang StructArray ` chunks ` memiliki dua subbidang vektor tingkat elemen, ` chunks[emb] ` dan ` chunks[code_emb]`, dan keduanya menggunakan metrik vektor reguler.
index_chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
limit=10,
expr='element_filter(chunks, $[section] == "index")',
)
code_chunk_req = AnnSearchRequest(
data=[code_query_vector],
anns_field="chunks[code_emb]",
limit=10,
expr='element_filter(chunks, $[has_code] == true)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[index_chunk_req, code_chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"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"],
)
Kedua objek ` AnnSearchRequest ` tersebut mencari subbidang vektor di bawah ` chunks`. Offset berbasis nol yang sama merujuk ke elemen Struct yang sama, sehingga pengurut ulang hibrida dapat langsung mengurutkan kandidat elemen. Jangan atur ` element_scope ` dalam mode ini karena tidak dilakukan penggabungan tingkat entitas.
Menggabungkan hasil pencocokan tingkat elemen untuk pencarian hibrida tingkat entitas
Jika pencarian hibrida menggabungkan permintaan " AnnSearchRequest " tingkat elemen StructArray dengan permintaan vektor tingkat koleksi, permintaan EmbeddingList, atau permintaan tingkat elemen di bawah bidang StructArray yang berbeda, cakupan kandidat akhir berada pada tingkat entitas. Dalam hal ini, setiap permintaan " AnnSearchRequest " tingkat elemen StructArray digabungkan menjadi kandidat tingkat entitas sebelum pengurutan ulang hibrida.
Gunakan ` element_scope ` di dalam ` params ` dari ` AnnSearchRequest ` tingkat elemen StructArray jika Anda perlu mengontrol cara beberapa elemen yang cocok dari entitas yang sama digabungkan.
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
param={
"params": {
"element_scope": {
"collapse": {
"strategy": "topk_sum",
"topk": 3,
},
},
},
},
limit=30,
expr='element_filter(chunks, $[quality_score] > 0.8)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
Dalam contoh ini, ` title_req ` berada pada tingkat entitas, sehingga hasil hibrida akhir juga berada pada tingkat entitas. Permintaan ` chunk_req ` terlebih dahulu mengembalikan hasil elemen dari ` chunks[emb]`, kemudian menggabungkan elemen yang dikembalikan dari entitas yang sama dengan menjumlahkan tiga skor elemen terbaik. Jika ` element_scope ` diabaikan saat penggabungan tingkat entitas diperlukan, strategi penggabungan secara default akan menggunakan ` max`.
Pilih strategi penggabungan
| Strategi | Perilaku | topk | Persyaratan metrik |
|---|---|---|---|
max | Pertahankan skor elemen terbaik yang dikembalikan untuk entitas tersebut. | Tidak diperbolehkan. | Metrik vektor reguler apa pun yang didukung. |
sum | Jumlahkan semua skor elemen yang dikembalikan untuk entitas tersebut. | Tidak diperbolehkan. | Hanya metrik korelasi positif, seperti IP atau COSINE. |
avg | Rata-rata semua skor elemen yang dikembalikan untuk entitas tersebut. | Tidak diperbolehkan. | Metrik vektor reguler apa pun yang didukung. |
topk_sum | Jumlahkan skor elemen terbaik yang dikembalikan oleh K untuk entitas tersebut. | Diperlukan dan harus bernilai positif. | Hanya metrik dengan korelasi positif, seperti IP atau COSINE. |
topk_avg | Hitung rata-rata skor elemen terbaik yang dikembalikan oleh " K " untuk entitas tersebut. | Diperlukan dan harus bernilai positif. | Metrik vektor reguler apa pun yang didukung. |
Collapse hanya menggunakan hit elemen yang dikembalikan oleh AnnSearchRequest tingkat elemen StructArray tersebut. Fitur ini tidak memindai setiap elemen Struct dalam entitas setelah pencarian ANN. Tetapkan limit permintaan cukup tinggi agar elemen yang Anda inginkan tersedia untuk collapse.
Tambahkan filter, pencarian rentang, dan pengelompokan
Anda dapat melampirkan element_filter ke AnnSearchRequest tingkat elemen StructArray ketika kondisi skalar harus diterapkan pada elemen Struct yang sama yang berpartisipasi dalam pencarian vektor. Anda juga dapat menggunakan filter tingkat atas pada hybrid_search() untuk kondisi entitas induk.
Bidang vektor tingkat elemen StructArray mendukung pencarian rentang dalam pencarian hibrida. Tambahkan radius dan, secara opsional, range_filter ke AnnSearchRequest tingkat elemen. Permintaan StructArray tingkat EmbeddingList tidak mendukung pencarian rentang.
Pengelompokan hibrida tingkat elemen hanya didukung jika semua objek ` AnnSearchRequest ` menargetkan bidang vektor tingkat elemen di bawah bidang `StructArray` yang sama, dan ` group_by_field ` harus menjadi kunci utama. Pengelompokan hibrida tidak didukung jika permintaan mencampurkan bidang vektor tingkat koleksi, bidang `StructArray` yang berbeda, atau permintaan tingkat `EmbeddingList`. Jangan menggabungkan pencarian rentang dengan pengelompokan.
Menafsirkan hasil hibrida
| Cakupan kandidat akhir | Kunci hasil | Perilaku offset | Kapan hal ini terjadi |
|---|---|---|---|
| Tingkat entitas | Kunci utama. | Tidak ada offset elemen dalam hasil akhir. | Permintaan hibrida mencakup bidang vektor tingkat koleksi, permintaan EmbeddingList, atau permintaan tingkat elemen di bawah bidang StructArray yang berbeda. |
| Tingkat elemen | Kunci utama ditambah bidang StructArray induk ditambah offset elemen. | Offset elemen yang dipilih dapat dikembalikan saat diekspos oleh API atau SDK. | Semua objek ` AnnSearchRequest ` berada di tingkat elemen dan berada di bawah bidang `StructArray` yang sama. |
Batasan
Gunakan
element_scopehanya untuk objekAnnSearchRequesttingkat elemen StructArray yang harus dikompres menjadi kandidat tingkat entitas dalam pencarian hibrida.Jangan gunakan
element_scopeuntuk permintaan EmbeddingList, permintaan vektor tingkat koleksi, atau pencarian hibrida tingkat elemen StructArray yang sama.sumdan strategi penggabungantopk_summemerlukan metrik korelasi positif, sepertiIPatauCOSINE. Jangan gunakan metrik tersebut denganL2.topk_sumdantopk_avgmemerlukan nilaitopkyang positif. Strategi penggabungan lainnya tidak boleh menyertakantopk.Permintaan StructArray tingkat EmbeddingList tidak mendukung pencarian rentang atau pengelompokan.
Pengelompokan hibrida hanya didukung untuk pencarian hibrida tingkat elemen StructArray yang sama dan hanya berdasarkan kunci utama.
Jangan menggabungkan pencarian rentang dengan pengelompokan.
Kesalahan umum
Menambahkan
element_scopeke permintaan hibrida tingkat elemen StructArray yang sama. Permintaan tersebut tetap berada di tingkat elemen dan tidak melakukan penggabungan di tingkat entitas.Menambahkan `
element_scope` ke `chunks[emb_list_vector]`. Pencarian `EmbeddingList` sudah berada di tingkat entitas.Mengasumsikan dua bidang StructArray berbagi offset elemen. Offset `
3` dalam `chunks` dan offset `3` dalam bidang StructArray lain merupakan elemen yang berbeda, sehingga permintaan hibrida menjadi tingkat entitas.Gunakan
topk_sumdenganL2. Gunakanmax,avg, atautopk_avguntuk metrik jarak negatif.Diharapkan hasil hibrida tingkat entitas mencakup offset elemen Struct yang dipilih setelah penggabungan.
Langkah selanjutnya
Untuk mempelajari dua mode pencarian vektor StructArray dasar, baca Pencarian Vektor Dasar dengan StructArray.
Untuk menambahkan filter skalar ke pencarian hibrida, baca " Pencarian yang Difilter dengan StructArray".
Untuk menggunakan batas skor atau jarak dalam pencarian hibrida, baca " Pencarian Rentang dengan StructArray".
Untuk mengelompokkan hasil pencarian hibrida tingkat elemen berdasarkan entitas induk, baca " Pengelompokan Pencarian dengan StructArray".
Untuk memeriksa batasan pencarian StructArray, baca " Batasan StructArray".