Indeks

Salah satu fitur kunci dari Qdrant adalah gabungan yang efektif antara indeks vektor dan indeks tradisional. Hal ini sangat penting karena hanya memiliki indeks vektor saja tidak cukup untuk memungkinkan pencarian vektor yang efisien di bawah kondisi penyaringan. Secara sederhana, indeks vektor mempercepat pencarian vektor, sementara indeks payload mempercepat penyaringan.

Indeks dalam sebuah paragraf eksis secara mandiri, tetapi parameter dari indeks itu sendiri dikonfigurasi untuk seluruh set.

Tidak semua paragraf secara otomatis memiliki indeks. Hal ini bergantung pada persyaratan pengaturan optimasi dan biasanya tergantung pada jumlah titik yang disimpan.

Indeks Payload

Indeks payload dalam Qdrant mirip dengan indeks dalam basis data berorientasi dokumen tradisional. Indeks ini dibangun untuk bidang dan tipe spesifik, digunakan untuk dengan cepat mengambil titik berdasarkan kondisi penyaringan yang sesuai.

Indeks ini juga digunakan untuk memperkirakan dengan tepat kardinalitas kondisi penyaringan, yang membantu perencana kueri memilih strategi pencarian.

Membuat indeks memerlukan sumber daya komputasi tambahan dan memori, sehingga sangat penting untuk memilih dengan hati-hati bidang yang akan diindeks. Qdrant tidak membuat pilihan ini untuk Anda, tetapi mendelegasikannya kepada pengguna.

Untuk menandai suatu bidang sebagai yang dapat diindeks, dapat digunakan metode berikut:

PUT /collections/{collection_name}/index

{
    "field_name": "nama bidang yang akan diindeks",
    "field_schema": "keyword"
}

Tipe bidang yang tersedia adalah:

  • keyword - untuk payload kata kunci, memengaruhi kondisi penyaringan yang cocok.
  • integer - untuk payload bilangan bulat, memengaruhi penyaringan yang cocok dan rentang kondisi penyaringan.
  • float - untuk payload float, memengaruhi kondisi penyaringan rentang.
  • bool - untuk payload boolean, memengaruhi kondisi penyaringan yang cocok (tersedia mulai dari versi 1.4.0 ke atas).
  • geo - untuk payload geografis, memengaruhi kotak pembatas geografis dan kondisi penyaringan radius geografis.
  • text - tipe indeks khusus yang cocok untuk payload kata kunci/string, memengaruhi kondisi penyaringan pencarian teks penuh.

Indeks payload dapat mengonsumsi memori tambahan, sehingga disarankan untuk hanya mengindeks bidang yang digunakan dalam kondisi penyaringan. Jika Anda perlu menyaring berdasarkan banyak bidang, dan kendala memori tidak memungkinkan semua bidang diindeks, disarankan untuk memilih bidang yang paling membatasi hasil pencarian. Secara umum, semakin banyak nilai unik yang dimiliki suatu nilai payload, semakin efektif penggunaan indeks akan menjadi.

Indeks Teks Penuh

Tersedia mulai dari versi 0.10.0

Qdrant mendukung pencarian teks penuh untuk payload string. Indeks teks penuh memungkinkan Anda menyaring titik berdasarkan keberadaan kata atau frasa dalam bidang payload.

Mengkonfigurasi indeks teks penuh sedikit kompleks karena Anda dapat menentukan parameter penguraian token. Penguraian token adalah proses memecah string menjadi token dan kemudian mengindeks token tersebut ke dalam indeks terbalik.

Untuk membuat indeks teks penuh, Anda dapat menggunakan metode berikut:

PUT /collections/{collection_name}/index

{
    "field_name": "nama bidang yang akan diindeks",
    "field_schema": {
        "type": "text",
        "tokenizer": "word",
        "min_token_len": 2,
        "max_token_len": 20,
        "lowercase": true
    }
}

Metode tokenisasi yang tersedia adalah:

  • word - Memisahkan string berdasarkan spasi, tanda baca, dan karakter khusus.
  • whitespace - Memisahkan string berdasarkan spasi.
  • prefix - Memisahkan string berdasarkan spasi, tanda baca, dan karakter khusus, kemudian membuat indeks awalan untuk setiap kata. Misalnya, hello akan diindeks sebagai h, he, hel, hell, hello.
  • multilingual - Jenis penguraian token khusus berdasarkan paket charabia. Ini memungkinkan penguraian dan lematiasi yang benar dari beberapa bahasa, termasuk bahasa dengan alfabet non-Latin dan pemisah non-spasi. Merujuk ke dokumentasi charabia untuk daftar lengkap bahasa yang didukung dan opsi normalisasi. Dalam konfigurasi bangunan default, qdrant tidak termasuk dukungan untuk semua bahasa karena akan meningkatkan ukuran file biner. Tiongkok, Jepang, dan Korea tidak diaktifkan secara default, tetapi dapat diaktifkan dengan membangun qdrant dari kode sumber menggunakan flag --features multiling-chinese, multiling-japanese, multiling-korean.

Silakan lihat contoh kecocokan teks penuh untuk contoh penggunaan indeks teks penuh untuk kueri.

Penomoran Vektor

Penomoran vektor adalah struktur data berdasarkan vektor, yang dibangun melalui model matematika tertentu. Dengan penomoran vektor, kita dapat dengan efisien melakukan kueri terhadap beberapa vektor yang mirip dengan vektor target.

Saat ini, Qdrant hanya menggunakan HNSW sebagai indeks vektor.

HNSW (Hierarchical Navigable Small World Graph) adalah algoritma indeks berbasis graf. Sesuai dengan aturan tertentu, algoritma ini membangun struktur navigasi multi-lapisan untuk graf. Di dalam struktur ini, lapisan atas lebih jarang, dengan jarak yang lebih besar antara simpul-simpul. Lapisan-lapisan lebih bawah lebih padat, dengan jarak yang lebih kecil antara simpul-simpul. Pencarian dimulai dari lapisan teratas, menemukan simpul terdekat dengan target dalam lapisan tersebut, dan kemudian memasuki lapisan berikutnya untuk pencarian lainnya. Setelah beberapa iterasi, ini dapat dengan cepat mendekati posisi target.

Untuk peningkatan kinerja, HNSW membatasi derajat maksimum simpul pada setiap lapisan graf menjadi m. Selain itu, Anda dapat menentukan rentang pencarian menggunakan ef_construct (selama pembangunan indeks) atau ef (saat mencari target).

Parameter-parameter ini dapat dikonfigurasi dalam berkas konfigurasi:

penyimpanan:
  indeks_hnsw:
    m: 16
    ef_construct: 100
    ambang_pencarian_penuh: 10000

Selama proses penciptaan koleksi, parameter ef dapat dikonfigurasi dan secara default sama dengan ef_construct.

HNSW dipilih karena beberapa alasan. Pertama, HNSW sangat kompatibel dengan memungkinkan Qdrant untuk memodifikasi filter selama proses pencarian. Kedua, menurut pengujian benchmark publik, ini adalah salah satu algoritma paling akurat dan paling cepat.

Tersedia mulai dari v1.1.1

Parameter HNSW juga dapat disesuaikan untuk koleksi dan vektor berjudul untuk mengoptimalkan kinerja pencarian dengan mengatur konfigurasi_hnsw.

Indeks yang Dapat Difilter

Indeks payload terpisah dan indeks vektor saja tidak dapat sepenuhnya menangani penggunaan filter untuk pencarian.

Dalam kasus di mana filter-filter tersebut lemah, indeks HNSW dapat digunakan langsung. Dalam kasus di mana filter-filter tersebut ketat, indeks payload dapat digunakan dan direscore sepenuhnya. Namun, dalam kasus-kasus intermediate, pendekatan ini tidak efektif.

Di satu sisi, kita tidak bisa melakukan pemindaian penuh terhadap terlalu banyak vektor. Di sisi lain, ketika menggunakan filter-filter yang terlalu ketat, graf HNSW mulai rusak.

Sisi-sisi tambahan ini memungkinkan Anda untuk dengan efisien menggunakan indeks HNSW untuk mencari vektor-vektor tetangga dan menerapkan filter saat mencari dalam graf.

Pendekatan ini meminimalkan overhead dari pemeriksaan kondisi, karena Anda hanya perlu menghitung kondisi-kondisi untuk bagian kecil dari titik-titik yang ikut dalam pencarian.