Koleksi
Konsep koleksi dalam basis data vektor Qdrant dapat analog dengan struktur tabel dalam MYSQL, yang digunakan untuk menyimpan secara seragam data vektor dengan jenis yang sama. Setiap data yang disimpan dalam sebuah koleksi disebut sebagai titik dalam Qdrant. Di sini, sebuah titik mirip dengan konsep ruang geometri matematika, mewakili representasi sebuah vektor dalam ruang geometri (anggap saja sebagai sebuah data).
Dalam satu koleksi yang sama, setiap vektor titik harus memiliki dimensi yang sama dan dibandingkan menggunakan sebuah metrik tunggal. Vektor bernama dapat digunakan untuk menyertakan multiple vektor dalam satu titik, dengan setiap vektor memiliki dimensi dan persyaratan metriknya sendiri.
Metrik jarak digunakan untuk mengukur kemiripan antara vektor-vektor. Pemilihan metrik tergantung pada bagaimana vektor-vektor tersebut diperoleh, terutama pada metode yang digunakan untuk melatih enkoder jaringan saraf.
Qdrant mendukung beberapa jenis metrik yang populer:
- Produk dot: Dot
- Kemiripan kosinus: Cosine
- Jarak euklides: Euclid
Untuk meningkatkan efisiensi pencarian, kemiripan kosinus dicapai dengan mengambil hasil produk dot dari vektor-vektor yang dinormalisasi. Saat diunggah, vektor-vektor secara otomatis dinormalisasi. Selain metrik dan ukuran vektor, setiap koleksi juga menggunakan seperangkat parameter sendiri untuk mengontrol optimisasi koleksi, pembangunan indeks, dan pembersihan. Pengaturan-pengaturan ini dapat diubah kapan saja melalui permintaan-permintaan terkait.
Menyiapkan Multi-Tenancy
Berapa banyak koleksi yang harus dibuat? Dalam kebanyakan kasus, Anda hanya perlu menggunakan satu koleksi dengan partisi berbasis payload. Pendekatan ini dikenal sebagai multi-tenancy. Untuk kebanyakan pengguna, hal ini efisien namun memerlukan konfigurasi tambahan. Pelajari cara menyiapkan multi-tenancy.
Kapan sebaiknya multiple koleksi dibuat? Ketika Anda memiliki jumlah pengguna yang terbatas dan memerlukan isolasi. Pendekatan ini lebih fleksibel namun mungkin lebih mahal, karena membuat banyak koleksi dapat mengakibatkan overhead sumber daya. Selain itu, Anda perlu memastikan bahwa koleksi tersebut tidak saling mengganggu satu sama lain dalam segala hal, termasuk dari segi performa.
Membuat sebuah koleksi
PUT /collections/{nama_koleksi}
{
"vektor": {
"ukuran": 300,
"jarak": "Cosine"
}
}
Selain opsi-opsi yang diperlukan, nilai-nilai kustom juga dapat ditentukan untuk opsi-opsi koleksi berikut:
-
konfigurasi_hnsw
- Untuk detail indeks, lihat bagian indeks. -
konfigurasi_wal
- Konfigurasi terkait pencatatan write-ahead. Untuk informasi lebih detail tentang WAL, silakan lihatnya. -
konfigurasi_optimizer
- Untuk detail optimizer, lihat bagian optimizer. -
jumlah_shard
- Mendefinisikan berapa banyak shard yang harus dimiliki oleh koleksi. Untuk informasi lebih lanjut, silakan lihat bagian penyebaran terdistribusi. -
on_disk_payload
- Mendefinisikan lokasi penyimpanan data payload. Jika diatur ketrue
, maka hanya akan menyimpan payload di disk. Ini dapat sangat berguna untuk membatasi penggunaan RAM saat menangani payload yang besar. -
konfigurasi_quantization
- Untuk informasi detail tentang kuantisasi, lihat kuantisasi.
Parameter-parameter default untuk opsi-opsi koleksi opsional didefinisikan dalam berkas konfigurasi.
Untuk informasi lebih lanjut tentang parameter-parameter koleksi dan vektor, silakan lihat definisi skema dan berkas konfigurasi.
Tersedia mulai dari v1.2.0
Vektor-vektor disimpan dalam RAM untuk mencapai akses yang sangat cepat. Parameter on_disk
dapat diatur dalam konfigurasi vektor. Jika diatur ke true, maka semua vektor akan disimpan di disk. Hal ini akan mengaktifkan penggunaan pemetaan memori, cocok untuk mengimpor sejumlah data yang besar.
Membuat koleksi dari koleksi lain
Tersedia mulai dari v1.0.0
Sebuah koleksi dapat diinisialisasi dari sebuah koleksi yang sudah ada.
Hal ini dapat sangat berguna untuk mencoba dengan cepat berbagai konfigurasi dari dataset yang sama.
Ketika mengatur konfigurasi vektor dalam koleksi baru, pastikan vektor-vektor memiliki ukuran dan fungsi jarak yang sama seperti dalam koleksi aslinya.
PUT /collections/{nama_koleksi}
{
"vektor": {
"ukuran": 300,
"jarak": "Cosine"
},
"inisialisasi_dari": {
"koleksi": {nama_koleksi_asal}
}
}
Koleksi multi-vektor
Tersedia mulai dari v0.10.0
Setiap catatan dapat memiliki beberapa vektor. Fitur ini memungkinkan beberapa vektor disimpan dalam sebuah koleksi. Untuk membedakan vektor dalam sebuah catatan, tentukan nama unik saat membuat koleksi. Setiap vektor bernama dalam skema ini memiliki jarak dan ukuran masing-masing:
PUT /collections/{nama_koleksi}
{
"vectors": {
"image": {
"size": 4,
"distance": "Dot"
},
"text": {
"size": 8,
"distance": "Cosine"
}
}
}
Untuk kasus-kasus khusus, koleksi tanpa penyimpanan vektor juga dapat dibuat.
Tersedia mulai dari v1.1.1
Untuk setiap vektor bernama, Anda dapat secara opsional menentukan hnsw_config
atau quantization_config
untuk menyimpang dari konfigurasi koleksi. Hal ini dapat digunakan untuk mengoptimalkan kinerja pencarian pada tingkat vektor.
Tersedia mulai dari v1.2.0
Vektor disimpan di memori untuk akses cepat. Untuk setiap vektor, on_disk
dapat diatur sebagai true
untuk selalu menyimpan semua vektor di disk. Ini akan mengaktifkan pemetaan memori, cocok untuk memasukkan jumlah data yang besar.
Menghapus sebuah koleksi
DELETE /collections/{nama_koleksi}
Memperbarui parameter koleksi
Pembaruan parameter dinamis dapat membantu, seperti memuat awal vektor yang lebih efisien. Sebagai contoh, Anda dapat menonaktifkan pengindeksan selama pengunggahan dan mengaktifkannya segera setelah pengunggahan selesai. Dengan cara ini, Anda tidak akan membuang sumber daya komputasi tambahan untuk membangun kembali indeks.
Perintah berikut mengaktifkan pengindeksan untuk segmen yang berisi vektor lebih besar dari 10000 kB:
PATCH /collections/{nama_koleksi}
{
"optimizers_config": {
"indexing_threshold": 10000
}
}
Parameter-parameter berikut dapat diperbarui:
-
optimizers_config
- Lihat deskripsi detail dari pengoptimal. -
hnsw_config
- Lihat deskripsi detail dari indeks. -
quantization_config
- Lihat deskripsi detail dari kuantisasi. -
vectors
- Konfigurasi untuk vektor spesifik, termasukhnsw_config
,quantization_config
, dan pengaturanon_disk
masing-masing. -
params
- Parameter koleksi lainnya, termasukwrite_consistency_factor
danon_disk_payload
.
Spesifikasi API lengkap dapat ditemukan di definisi skema.
Tersedia sejak v1.4.0
Qdrant 1.4 menambahkan dukungan untuk memperbarui lebih banyak parameter koleksi secara runtime. Indeks HNSW, kuantisasi, dan konfigurasi disk sekarang dapat diubah tanpa harus membuat ulang koleksi. Segmen (dengan data indeks dan kuantisasi) akan secara otomatis membangun kembali di latar belakang untuk sesuaikan dengan parameter yang diperbarui.
Pada contoh berikut, seluruh koleksi dan parameter indeks HNSW dan kuantisasi untuk my_vector
diperbarui:
PATCH /collections/{nama_koleksi}
{
"vectors": {
"my_vector": {
"hnsw_config": {
"m": 32,
"ef_construct": 123
},
"quantization_config": {
"product": {
"compression": "x32",
"always_ram": true
}
},
"on_disk": true
}
},
"hnsw_config": {
"ef_construct": 123
},
"quantization_config": {
"scalar": {
"type": "int8",
"quantile": 0.8,
"always_ram": false
}
}
}
Catatan: Untuk memperbarui parameter vektor dalam sebuah koleksi tanpa vektor bernama, nama kosong (""
) dapat digunakan.
Panggilan ke endpoint ini mungkin akan menyebabkan penahanan saat menunggu optimisasi yang ada selesai. Kami tidak merekomendasikan menggunakan fitur ini dalam basis data produksi karena membangun ulang indeks dapat menyebabkan overhead yang signifikan.
Informasi Koleksi
Qdrant memungkinkan penentuan parameter konfigurasi untuk koleksi yang ada untuk lebih memahami distribusi titik dan situasi pengindeksan.
GET /collections/{collection_name}
{
"result": {
"status": "green",
"optimizer_status": "ok",
"vectors_count": 1068786,
"indexed_vectors_count": 1024232,
"points_count": 1068786,
"segments_count": 31,
"config": {
"params": {
"vectors": {
"size": 384,
"distance": "Cosine"
},
"shard_number": 1,
"replication_factor": 1,
"write_consistency_factor": 1,
"on_disk_payload": false
},
"hnsw_config": {
"m": 16,
"ef_construct": 100,
"full_scan_threshold": 10000,
"max_indexing_threads": 0
},
"optimizer_config": {
"deleted_threshold": 0.2,
"vacuum_min_vector_number": 1000,
"default_segment_number": 0,
"max_segment_size": null,
"memmap_threshold": null,
"indexing_threshold": 20000,
"flush_interval_sec": 5,
"max_optimization_threads": 1
},
"wal_config": {
"wal_capacity_mb": 32,
"wal_segments_ahead": 0
}
},
"payload_schema": {}
},
"status": "ok",
"time": 0.00010143
}
Jika vektor dimasukkan ke dalam koleksi, bidang status
dapat berubah menjadi "kuning" selama optimisasi dan akan berubah menjadi "hijau" setelah semua titik diproses dengan sukses.
Berikut adalah beberapa keadaan warna yang mungkin terjadi:
- ?
green
: Koleksi sudah siap - ?
yellow
: Koleksi sedang menjalani optimisasi - ?
red
: Mesin mengalami kesalahan yang tidak bisa dipulihkan
Beberapa properti lain yang menarik meliputi:
-
points_count
- Jumlah total objek (vektor dan muatan mereka) yang disimpan di dalam koleksi -
vectors_count
- Jumlah total vektor dalam koleksi. Jika setiap objek memiliki beberapa vektor, ini mungkin tidak sama denganpoints_count
. -
indexed_vectors_count
- Jumlah total vektor yang disimpan dalam indeks HNSW. Qdrant tidak menyimpan semua vektor dalam indeks, hanya yang dapat membuat segmen indeks berdasarkan konfigurasi yang diberikan.
Pengindeksan Vektor dalam HNSW
Dalam beberapa kasus, Anda mungkin menemukan bahwa nilai indexed_vectors_count
lebih kecil dari vectors_count
. Ini adalah perilaku yang disengaja tergantung pada konfigurasi optimizer. Sebuah segmen indeks baru akan dibangun jika ukuran vektor yang tidak diindeks melebihi indexing_threshold
(dalam KB). Jika koleksi Anda sangat kecil atau dimensi vektornya rendah, segmen HNSW mungkin tidak akan dibuat, dan indexed_vectors_count
mungkin sama dengan 0
.
Anda dapat mengurangi nilai indexing_threshold
dalam parameter koleksi untuk membuat segmen indeks baru dalam koleksi yang sudah ada.
Alias Koleksi
Di lingkungan produksi, mungkin ada kebutuhan untuk beralih dengan mulus antara berbagai versi vektor, seperti meningkatkan ke versi jaringan saraf yang baru.
Dalam kasus-kasus seperti ini, mungkin tidak memungkinkan untuk menghentikan layanan dan membangun kembali koleksi menggunakan vektor baru. Alias adalah nama tambahan untuk koleksi yang sudah ada. Permintaan dapat sepenuhnya dieksekusi menggunakan alias daripada nama koleksi.
Oleh karena itu, sebuah koleksi kedua dapat dibangun di latar belakang, dan kemudian alias dapat beralih dari koleksi lama ke koleksi baru. Karena perubahan alias bersifat atomik, permintaan konkuren tidak terpengaruh selama proses peralihan.
Buat Alias
POST /collections/aliases
{
"actions": [
{
"create_alias": {
"alias_name": "production_collection",
"collection_name": "example_collection"
}
}
]
}
Hapus Alias
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"alias_name": "production_collection"
}
}
]
}
Alihkan Koleksi
Beberapa operasi alias dapat dieksekusi secara atomik. Sebagai contoh, Anda dapat menggunakan perintah berikut untuk mengalihkan koleksi yang mendasarinya:
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"alias_name": "production_collection"
}
},
{
"create_alias": {
"alias_name": "production_collection",
"collection_name": "new_collection"
}
}
]
}
Daftar Kumpulan Alias
GET /collections/{nama_kumpulan}/alias
Daftar Semua Alias
GET /alias
Daftar Semua Kumpulan
GET /kumpulan