Indeks vektor adalah mekanisme pengindeksan efisien di MaxCompute yang mempercepat pencarian kemiripan pada data vektor berskala besar. Dokumen ini menjelaskan cara menggunakan indeks vektor serta menyediakan contoh-contohnya.
Catatan
Sebelum membuat VECTOR INDEX, jalankan perintah
SETPROJECT odps.schema.evolution.enable=true;untuk mengaktifkan Schema Evolution.Saat ini, indeks vektor hanya dapat dibuat pada Delta Table.
Pemicu pembuatan indeks
Pembuatan sinkron: Terutama digunakan untuk pemrosesan batch offline. Setelah indeks didefinisikan dengan
CREATE VECTOR INDEX, operasiINSERTsecara sinkron memicu pembuatan indeks.Pembangunan ulang penuh: Jika pengambilan indeks tidak efisien, bangun ulang indeks pada seluruh dataset. Hal ini dapat dipicu secara manual dengan perintah
REBUILD INDEXatau secara otomatis oleh proses latar belakang yang mendeteksi efisiensi pengambilan yang rendah.
Sistem memblokir penghapusan kolom jika kolom tersebut dirujuk oleh indeks vektor. Untuk menghapus kolom tersebut, hapus terlebih dahulu indeks yang sesuai.
Untuk membangun ulang indeks vektor pada tabel partisi, tentukan rentang partisi dengan
PARTITION (...). Jika tidak, kesalahan analisis semantik akan muncul.Anda dapat menghapus indeks dari partisi tertentu pada tabel partisi.
Anda hanya dapat membuat satu indeks pada satu kolom.
Pada tabel yang sama, Anda dapat membuat indeks terpisah dengan nama berbeda untuk beberapa kolom vektor.
Buat indeks vektor
Buat indeks vektor
Buat indeks pada kolom vektor untuk mempercepat kueri pengambilan. Perintahnya adalah sebagai berikut:
CREATE VECTOR INDEX <index_name>
ON <table_name> (<description_embedding>)
IDXPROPERTIES (
'algorithm' = 'xxx',
'distance_type' = 'xxx',
'build_params' = 'xxx'
...
);Parameter
Parameter | Deskripsi |
index_name | Nama indeks. |
table_name | Nama tabel tempat membangun indeks vektor. Saat ini, hanya Delta Table yang didukung. |
description_embedding | Nama kolom vektor yang akan diindeks. |
algorithm | Menentukan algoritma pembuatan untuk indeks vektor. Saat ini, satu-satunya algoritma yang didukung adalah |
distance_type | Menentukan metode untuk menghitung kemiripan antar vektor. Jenis-jenis berikut didukung:
|
build_params | Menentukan parameter konfigurasi untuk pembuatan indeks dalam format JSON. Contoh:
Indeks vektor juga mendukung kuantisasi vektor internal. Parameter berikut terkait dengan kuantisasi:
Untuk informasi lebih lanjut tentang konfigurasi kuantisasi, lihat Mengonfigurasi Kuantisasi Indeks Vektor. |
Konfigurasikan kuantisasi indeks vektor
Indeks vektor mendukung kuantisasi vektor internal untuk mengurangi ukuran penyimpanan indeks, jejak memori waktu proses, dan overhead akses memori selama pengambilan. Kuantisasi hanya mengubah pengkodean vektor dalam indeks dan tidak memengaruhi data VECTOR(FLOAT, dimension) asli dalam tabel maupun cara pemanggilan VECTOR_SEARCH. Indeks vektor MaxCompute mendukung dua metode pengambilan berikut:
Pengambilan satu tahap: Langsung menggunakan base_quantization_type untuk traversal graf dan perhitungan jarak. Metode ini menghasilkan struktur indeks yang lebih sederhana dan penggunaan memori yang lebih rendah.
Pengambilan dua tahap: Pertama menggunakan vektor dasar presisi rendah untuk pengambilan kandidat cepat, lalu menggunakan vektor presisi tinggi untuk menghitung ulang jarak. Metode ini menyeimbangkan performa pengambilan dan recall.
Tabel berikut menjelaskan kombinasi umum parameter kuantisasi.
Konfigurasi | Kombinasi parameter | Deskripsi |
FP32 |
| Fitur: Garis dasar presisi penuh dengan recall stabil tetapi penggunaan memori tinggi. Kasus penggunaan: Skenario yang membutuhkan akurasi tinggi atau melibatkan dataset kecil. |
FP16 |
| Fitur: Mengurangi jejak memori vektor hingga sekitar 50% dari FP32, dengan recall yang hampir identik. Kasus penggunaan: Skenario yang membutuhkan akurasi tinggi atau melibatkan dataset kecil. Menawarkan sedikit kompromi recall dibandingkan FP32. |
SQ8 |
| Fitur: Mengurangi jejak memori vektor hingga sekitar 25% dari FP32, dengan sedikit penurunan recall. Kasus penggunaan: Skenario sensitif memori di mana penurunan kecil pada recall dapat diterima. |
SQ8 + Pengurutan Ulang Presisi Tinggi |
| Fitur: Menggunakan SQ8 untuk traversal graf dan kemudian memulihkan recall melalui perhitungan ulang jarak presisi tinggi. Kasus penggunaan: Skenario yang perlu menyeimbangkan efisiensi pengambilan dan recall. |
RaBitQ + Pengurutan Ulang Presisi Tinggi |
| Fitur: Menggunakan pengkodean yang lebih ringkas untuk traversal graf dan mengurutkan ulang hasil kandidat dengan menggunakan vektor presisi tinggi. Kasus penggunaan: Skenario dengan pembangunan ulang indeks yang sering dan membutuhkan recall tinggi. |
Kuantisasi memberikan manfaat berikut:
Mengurangi ukuran file indeks dan jejak memori waktu proses.
Menurunkan overhead bandwidth memori selama pemuatan dan pengambilan indeks.
Meningkatkan pemanfaatan cache CPU, sehingga satu worker dapat memuat dan memproses lebih banyak vektor.
Memungkinkan Anda menyeimbangkan performa pengambilan, biaya sumber daya, dan recall dengan menggabungkan kuantisasi dasar dan pengurutan ulang presisi tinggi.
Kami merekomendasikan menggunakan FP16 saat membuat indeks HGraph. Untuk contoh lainnya, lihat Contoh: Buat indeks vektor dengan kuantisasi FP16 dan Contoh: Buat indeks vektor dengan traversal presisi rendah RaBitQ dan pengurutan ulang presisi tinggi.
Isi data
INSERT OVERWRITE TABLE <table_name> [PARTITION <partition_spec>]
SELECT ......Bangun ulang indeks vektor
Gunakan perintah berikut untuk membangun ulang indeks vektor pada data yang sudah ada.
Bangun ulang indeks untuk tabel non-partisi.
ALTER TABLE <table_name> REBUILD INDEX <index_name> ;Bangun ulang indeks untuk tabel partisi. Anda dapat membangun ulang indeks vektor untuk beberapa partisi sekaligus.
ALTER TABLE <table_name> PARTITION
(<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD INDEX <index_name> ;
ALTER TABLE <table_name> PARTITION(partition_name >=value) REBUILD INDEX <index_name> ;Daftar indeks vektor untuk suatu tabel
SHOW INDEXES ON <table_name>;Lihat informasi indeks vektor
DESC INDEX index_name ON <table_name> [PARTITION <partition_spec>];Hapus indeks vektor
DROP INDEX [IF EXISTS] index_name ON <table_name> [PARTITION <partition_spec>];Contoh
Siapkan data
SET odps.sql.type.system.odps2=true;
SET odps.sql.type.vector.enable=true;
DROP TABLE IF EXISTS vector_test;
DROP VIEW IF EXISTS vector_test;
CREATE TABLE IF NOT EXISTS vector_test(
c0 int,
c1 vector(float, 2),
c2 vector(float, 3)
) STORED AS aliorc
TBLPROPERTIES (
'table.format.version'='2',
'acid.data.retain.hours'='24',
'columnar.nested.type'='true',
'transactional'='true'
);
INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F) UNION ALL
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F)
UNION ALL
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F);Contoh: Buat indeks vektor dan masukkan data
CREATE VECTOR INDEX c2_vector_index
ON vector_test (c2)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'cosine',
'build_params' = '{"max_degree": 16, "ef_construction": 128}');
ALTER TABLE vector_test REBUILD INDEX c2_vector_index;
INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F)
UNION ALL
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F)
UNION ALL
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F)
UNION ALL
SELECT 4, vector(4.4F,5.5F), vector(4.4F,5.5F,6.6F)
UNION ALL
SELECT 5, vector(5.5F,6.6F), vector(5.5F,6.6F,7.7F);
Contoh: Bangun ulang indeks vektor
ALTER TABLE vector_test REBUILD INDEX c2_vector_index;
SELECT * FROM vector_test;
-- Hasil berikut dikembalikan:
+------+------+------+
| c0 | c1 | c2 |
+------+------+------+
| 1 | [1.1, 2.2] | [1.1, 2.2, 3.3] |
| 2 | [2.2, 3.3] | [2.2, 3.3, 4.4] |
| 3 | [3.3, 4.4] | [3.3, 4.4, 5.5] |
| 4 | [4.4, 5.5] | [4.4, 5.5, 6.6] |
| 5 | [5.5, 6.6] | [5.5, 6.6, 7.7] |
+------+------+------+
Contoh: Daftar indeks vektor
SHOW INDEXES ON vector_test;
-- Hasil berikut dikembalikan:
{"Indexes": [{
"createTime": 1779900024105,
"id": "512d520**45e1c7ba8",
"indexColumns": [{"name": "c2"}],
"name": "c2_vector_index",
"properties": {
"algorithm": "hgraph",
"build_params": "{\"max_degree\": 16, \"ef_construction\": 128}",
"distance_type": "cosine"},
"type": "VECTOR"}]}Contoh: Lihat informasi indeks vektor
DESC INDEX c2_vector_index ON vector_test;
-- Hasil berikut dikembalikan:
+------------------------------------------------------------------------------------+
| Index Detail |
+------------------------------------------------------------------------------------+
| name: c2_vector_index |
| id: 512d520**e1c7ba8 |
| index_type: VECTOR |
| index_columns: c2 |
| status: ACTIVE |
| coverage_percentage: 100% |
| storage_size_bytes: 6940 |
| properties: build_params={"max_degree": 16, "ef_construction": 128}, distance_type=cosine, algorithm=hgraph |
+------------------------------------------------------------------------------------+
Contoh: Hapus indeks vektor
DROP INDEX c2_vector_index ON vector_test;
-- Hasil berikut dikembalikan:
{"Indexes": []}Contoh: Buat indeks vektor dengan kuantisasi FP16
CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'dot_product',
'build_params' = '{
"max_degree":48,
"ef_construction":400,
"base_quantization_type":"fp16"
}'
);
-- Setelah membuat indeks, Anda harus membangun ulangnya untuk data yang sudah ada.
ALTER TABLE doc_table PARTITION (pt='20260730') REBUILD INDEX doc_vector_index;Contoh: Buat indeks vektor dengan RaBitQ dan pengurutan ulang
CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'dot_product',
'build_params' ='{
"max_degree":48,
"ef_construction":400,
"base_quantization_type":"rabitq",
"use_reorder":true,
"precise_quantization_type":"fp32"
}'
);