Bagikan melalui


Indeks pencarian vektor dan vektor di Mesin SQL Database

Berlaku untuk: Database SQL SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed Instancedi Microsoft Fabric

SQL Database Engine menyediakan kemampuan untuk menyimpan segala jenis data dan menjalankan segala jenis kueri: terstruktur dan tidak terstruktur, dan untuk melakukan pencarian vektor pada data tersebut. Ini adalah pilihan yang baik untuk skenario di mana Anda perlu mencari di semua data ini bersama-sama, dan Anda tidak ingin menggunakan layanan terpisah untuk pencarian yang akan mempersulit arsitektur Anda.

Nota

  • Fitur vektor tersedia di Azure SQL Managed Instance yang dikonfigurasi dengan kebijakan pembaruanSQL Server 2025 atau Always-up-to-date.

Vectors

Vektor adalah array angka yang diurutkan (biasanya float) yang dapat mewakili informasi tentang beberapa data. Misalnya, gambar dapat direpresentasikan sebagai vektor nilai piksel, atau string teks dapat direpresentasikan sebagai vektor nilai ASCII. Proses untuk mengubah data menjadi vektor disebut vektorisasi. Jenis data vektor di SQL Server dirancang untuk menyimpan array angka ini secara efisien.

Pemadatan

Embedding adalah vektor yang mewakili fitur-fitur penting dari data. Penyematan sering dipelajari dengan menggunakan model pembelajaran mendalam, dan pembelajaran mesin dan model AI menggunakannya sebagai fitur. Penyematan juga dapat menangkap kesamaan semantik antara konsep serupa. Misalnya, dalam menghasilkan penyematan untuk kata-kata person dan human, kami akan mengharapkan penyematannya (representasi vektor) serupa dalam nilai karena kata-kata juga serupa secara semantik.

Fitur Azure OpenAI mencakup model untuk membuat penyematan dari data teks. Layanan ini memecah teks menjadi token dan menghasilkan penyematan menggunakan model yang telah dilatih sebelumnya oleh OpenAI. Untuk mempelajari selengkapnya, lihat Membuat penyematan dengan Azure OpenAI.

Setelah penyematan dihasilkan, mereka dapat disimpan ke dalam database SQL Server. Ini memungkinkan Anda untuk menyimpan penyematan bersama data yang diwakilinya, dan melakukan kueri pencarian vektor untuk menemukan titik data serupa.

Pencarian vektor mengacu pada proses menemukan semua vektor dalam himpunan data yang mirip dengan vektor kueri tertentu. Oleh karena itu, vektor kueri untuk kata human mencari seluruh himpunan data untuk vektor serupa, dengan demikian menemukan kata-kata serupa: dalam contoh ini, seharusnya menemukan kata person sebagai cocokan yang dekat. Kedekatan ini, atau jarak, diukur menggunakan metrik jarak seperti jarak kosinus. Semakin dekat vektor, semakin mirip mereka.

SQL Server menyediakan dukungan bawaan untuk vektor melalui jenis data vektor . Vektor disimpan dalam format biner yang dioptimalkan tetapi diekspos sebagai array JSON untuk kenyamanan. Setiap elemen vektor disimpan menggunakan nilai floating point presisi tunggal (4 byte). Seiring dengan jenis data ada fungsi khusus untuk beroperasi pada vektor. Misalnya, dimungkinkan untuk menemukan jarak antara dua vektor menggunakan fungsi VECTOR_DISTANCE . Fungsi mengembalikan nilai skalar dengan jarak antara dua vektor berdasarkan metrik jarak yang Anda tentukan.

Karena vektor biasanya dikelola sebagai array float, membuat vektor dapat dilakukan hanya dengan mentransmisikan array JSON ke jenis data vektor . Misalnya, kode berikut membuat vektor dari array JSON:

SELECT 
    CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
    CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;

Atau, gunakan konversi tipe implisit

DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;

Hal yang sama berlaku untuk mengonversi vektor menjadi array JSON:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT 
    CAST(@v AS NVARCHAR(MAX)) AS s,
    CAST(@v AS JSON) AS j

Pencarian yang tepat dan jarak vektor (tetangga terdekat yang presisi)

Pencarian yang tepat, juga dikenal sebagai pencarian k-nearest neighbor (k-NN), melibatkan pengkalkulasian jarak antara vektor tertentu dan semua vektor lain dalam himpunan data, mengurutkan hasil, dan memilih tetangga terdekat berdasarkan metrik jarak yang ditentukan. Metode ini menjamin pencarian yang tepat dari tetangga terdekat tetapi dapat memerlukan komputasi yang intensif, terutama untuk dataset besar.

Fungsi jarak vektor digunakan untuk mengukur kedekatan antara vektor. Metrik jarak umum termasuk jarak Euklidean, kesamaan kosinus, dan hasil kali titik. Fungsi-fungsi ini sangat penting untuk melakukan pencarian k-NN dan memastikan hasil yang akurat.

Pencarian vektor tetangga terdekat (ENN) yang tepat melakukan perhitungan jarak lengkap di semua vektor terindeks untuk menjamin pengambilan tetangga terdekat berdasarkan metrik jarak yang ditentukan. Metode ini tepat tetapi intensif sumber daya, membuatnya cocok untuk himpunan data atau skenario yang lebih kecil di mana akurasi sangat penting.

Di Mesin SQL Database, pencarian k-NN dapat dilakukan menggunakan fungsi VECTOR_DISTANCE , yang memungkinkan perhitungan jarak yang efisien antara vektor dan memfasilitasi pengambilan tetangga terdekat.

Contoh berikut menunjukkan cara melakukan k-NN untuk mengembalikan 10 vektor paling mirip teratas yang disimpan dalam content_vector tabel ke vektor @qvkueri yang diberikan .

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance

Menggunakan pencarian yang tepat disarankan ketika Anda tidak memiliki banyak vektor untuk dicari (kurang dari 50.000 vektor sebagai rekomendasi umum). Tabel dapat berisi lebih banyak vektor selama predikat pencarian Anda mengurangi jumlah vektor yang digunakan untuk pencarian tetangga menjadi 50.000 atau lebih sedikit.

Perkiraan indeks vektor dan pencarian vektor (perkiraan tetangga terdekat)

Nota

Perkiraan indeks vektor dan pencarian vektor sedang dalam pratinjau dan saat ini hanya tersedia di SQL Server 2025 (17.x), Azure SQL Database, dan database SQL di Microsoft Fabric.

Mengidentifikasi semua vektor yang dekat dengan vektor kueri tertentu memerlukan sumber daya yang substansial untuk menghitung jarak antara vektor kueri dan vektor yang disimpan dalam tabel. Mencari semua vektor yang dekat dengan vektor kueri tertentu melibatkan pemindaian lengkap tabel dan penggunaan CPU yang signifikan. Ini disebut kueri "K-nearest neighbors" atau "k-NN" dan mengembalikan "k" vektor terdekat.

Vektor digunakan untuk menemukan data serupa untuk model AI untuk menjawab kueri pengguna. Ini melibatkan mengkueri basis data untuk menemukan vektor "k" yang terdekat dengan vektor kueri menggunakan metrik jarak seperti produk titik, kesamaan kosinus, atau jarak Euclidean.

Kueri K-NN sering menghadapi masalah dengan skalabilitas, membuatnya dapat diterima dalam banyak kasus untuk mengorbankan sebagian akurasi, terutama recall, demi keuntungan kecepatan yang signifikan. Metode ini dikenal sebagai perkiraan tetangga terdekat (ASN).

Konsep recall adalah penting dan harus diketahui oleh semua orang yang menggunakan atau berencana untuk menggunakan vektor dan penyematan. Faktanya, recall mengukur proporsi tetangga terdekat yang diperkirakan yang diidentifikasi oleh algoritma, dibandingkan dengan tetangga terdekat yang tepat yang akan dikembalikan oleh pencarian lengkap. Oleh karena itu, ini adalah pengukuran yang baik dari kualitas perkiraan yang dilakukan algoritma. Pengingatan sempurna, yang setara dengan tanpa perkiraan, adalah 1.

Untuk aplikasi AI, pertimbangan ini cukup masuk akal. Karena penyematan vektor sudah memperkirakan konsep, menggunakan ANN tidak secara signifikan memengaruhi hasilnya, asalkan pengenalan mendekati 1. Ini memastikan bahwa hasil yang dikembalikan sangat mirip dengan hasil dari k-NN, sambil menawarkan performa yang sangat ditingkatkan dan penggunaan sumber daya yang berkurang secara signifikan, yang sangat bermanfaat untuk database operasional.

Penting untuk dipahami bahwa istilah "indeks" ketika digunakan mengacu pada indeks vektor memiliki arti yang berbeda dari indeks yang biasa Anda gunakan untuk bekerja dalam database relasional. Bahkan, indeks vektor mengembalikan perkiraan hasil.

Di mesin SQL Database, indeks vektor didasarkan pada algoritma DiskANN . DiskANN mengandalkan pembuatan grafik untuk menavigasi dengan cepat melalui semua vektor terindeks untuk menemukan kecocokan terdekat dengan vektor tertentu. DiskANN adalah sistem berbasis grafik untuk mengindeks dan mencari sekumpulan besar data vektor menggunakan sumber daya komputasi terbatas. Ini secara efisien menggunakan SSD dan memori minimal untuk menangani lebih banyak data secara signifikan daripada indeks dalam memori, sambil mempertahankan kueri tinggi per detik (QPS) dan latensi rendah, memastikan keseimbangan antara memori, penggunaan CPU dan I/O dan performa pencarian.

Perkiraan pencarian algoritma tetangga terdekat dapat dilakukan terlebih dahulu membuat indeks vektor menggunakan perintah CREATE VECTOR INDEX T-SQL lalu menggunakan fungsi T-SQL VECTOR_SEARCH untuk menjalankan perkiraan pencarian.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT 
    t.id, s.distance, t.title
FROM
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t, 
        COLUMN = [content_vector], 
        SIMILAR_TO = @qv, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance