Topik ini menjelaskan cara mengelompokkan hasil pencarian vektor.
Latar Belakang
Dalam beberapa skenario, hasil pencarian vektor perlu dikelompokkan. Berikut adalah beberapa contohnya:
Dalam sistem generasi yang diperkaya dengan pengambilan data (RAG), dokumen sering dibagi menjadi beberapa segmen. Setiap segmen diubah menjadi vektor dan disimpan di DashVector. Untuk mendapatkan hasil yang beragam dalam pencarian vektor, pengguna mengharapkan segmen-segmen paling mirip dari dokumen yang berbeda dikembalikan.
Dalam skenario pencarian gambar produk, beberapa gambar sering dibuat untuk sebuah produk, dan setiap gambar diubah menjadi vektor dan disimpan di DashVector. Untuk mendapatkan hasil yang beragam dalam pencarian vektor, pengguna berharap bahwa gambar-gambar paling mirip dari produk yang berbeda dikembalikan.
DashVector mendukung fitur pencarian vektor berkelompok, yang memungkinkan Anda memanggil operasi pencarian dokumen berkelompok dan menetapkan group_by_field ke ID dokumen dan ID produk masing-masing dalam skenario di atas. Untuk informasi lebih lanjut, lihat Pencarian Dokumen Berkelompok.
Contoh
Prasyarat
Kluster telah dibuat. Untuk informasi lebih lanjut, lihat Buat kluster.
Kunci API telah diperoleh. Untuk informasi lebih lanjut, lihat Kelola Kunci API.
SDK versi terbaru telah diinstal. Untuk informasi lebih lanjut, lihat Instal SDK DashVector.
Masukkan dokumen dengan bidang
Ganti YOUR_API_KEY dengan kunci API Anda dan YOUR_CLUSTER_ENDPOINT dengan titik akhir kluster Anda dalam kode contoh agar kode dapat berjalan dengan benar.
import dashvector
import numpy as np
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
ret = client.create(
name='group_by_demo',
dimension=4,
fields_schema={'document_id': str, 'chunk_id': int}
)
assert ret
collection = client.get(name='group_by_demo')
ret = collection.insert([
('1', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 1, 'content': 'xxxA'}),
('2', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 2, 'content': 'xxxB'}),
('3', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 1, 'content': 'xxxC'}),
('4', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 2, 'content': 'xxxD'}),
('5', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 3, 'content': 'xxxE'}),
('6', np.random.rand(4), {'document_id': 'paper-03', 'chunk_id': 1, 'content': 'xxxF'}),
])
assert ret
Lakukan pencarian vektor berkelompok
ret = collection.query_group_by(
vector=[0.1, 0.2, 0.3, 0.4],
group_by_field='document_id', # Kelompokkan hasil berdasarkan nilai pada bidang document_id.
group_count=2, # Kembalikan dua kelompok.
group_topk=2, # Kembalikan hingga dua dokumen dari setiap kelompok.
)
# Periksa apakah operasi berhasil.
if ret:
print('query_group_by berhasil')
print(len(ret))
print('------------------------')
for group in ret:
print('kunci kelompok:', group.group_id)
for doc in group.docs:
prefix = ' -'
print(prefix, doc)
Contoh keluaran adalah sebagai berikut:
query_group_by berhasil
4
------------------------
kunci kelompok: paper-01
- {"id": "2", "fields": {"document_id": "paper-01", "chunk_id": 2, "content": "xxxB"}, "score": 0.6807}
- {"id": "1", "fields": {"document_id": "paper-01", "chunk_id": 1, "content": "xxxA"}, "score": 0.4289}
kunci kelompok: paper-02
- {"id": "3", "fields": {"document_id": "paper-02", "chunk_id": 1, "content": "xxxC"}, "score": 0.6553}
- {"id": "5", "fields": {"document_id": "paper-02", "chunk_id": 3, "content": "xxxE"}, "score": 0.4401}Batasan
Untuk parameter
group_by_field, Anda hanya dapat menentukan bidang yang didefinisikan menggunakan parameterfields_schemasaat membuat koleksi. Bidang tanpa skema tidak mendukung pencarian berkelompok. Untuk informasi lebih lanjut, lihat Buat Koleksi dan Tanpa Skema.group_countdangroup_topkmerupakan parameter usaha terbaik. Nilai kembaliandapat lebih kecil dari nilai yang ditentukan. DashVector memberikan prioritas lebih tinggi padagroup_count.Nilai yang lebih besar dari
group_countdangroup_topkmeningkatkan beban pemindaian indeks, sehingga meningkatkan waktu yang diperlukan untuk pemanggilan API. Saat ini, nilai maksimum darigroup_countadalah 64 dan nilai maksimum darigroup_topkadalah 16.