Menyimpan vektor di Azure Database for PostgreSQL
Ingat bahwa Anda memerlukan penyematan vektor yang disimpan dalam database vektor untuk menjalankan pencarian semantik. Server fleksibel Azure Database for PostgreSQL dapat digunakan sebagai basis data vektor dengan ekstensi .
Pengantar vector
Ekstensivector terbuka menyediakan penyimpanan vektor, kueri kesamaan, dan operasi vektor lainnya untuk PostgreSQL. Setelah diaktifkan, Anda dapat membuat vector kolom untuk menyimpan penyematan (atau vektor lain) bersama kolom lainnya.
/* Enable the extension. */
CREATE EXTENSION vector;
/* Create a table containing a 3d vector. */
CREATE TABLE documents (id bigserial PRIMARY KEY, embedding vector(3));
/* Create some sample data. */
INSERT INTO documents (embedding) VALUES
('[1,2,3]'),
('[2,1,3]'),
('[4,5,6]');
Anda bisa menambahkan kolom vektor ke tabel yang sudah ada:
ALTER TABLE documents ADD COLUMN embedding vector(3);
Setelah Anda memiliki beberapa data vektor, Anda dapat melihatnya bersama data tabel normal:
# SELECT * FROM documents;
id | embedding
----+-----------
1 | [1,2,3]
2 | [2,1,3]
3 | [4,5,6]
Ekstensi ini vector mendukung beberapa bahasa, seperti .NET, Python, Java, dan banyak lainnya. Lihat repositori GitHub mereka untuk informasi selengkapnya.
Untuk menyisipkan dokumen dengan vektor [1, 2, 3] menggunakan Npgsql di C#, jalankan kode seperti ini:
var sql = "INSERT INTO documents (embedding) VALUES ($1)";
await using (var cmd = new NpgsqlCommand(sql, conn))
{
var embedding = new Vector(new float[] { 1, 2, 3 });
cmd.Parameters.AddWithValue(embedding);
await cmd.ExecuteNonQueryAsync();
}
Sisipkan dan perbarui vektor
Setelah tabel memiliki kolom vektor, baris dapat ditambahkan dengan nilai vektor, seperti yang disebutkan sebelumnya.
INSERT INTO documents (embedding) VALUES ('[1,2,3]');
Anda juga dapat memuat vektor secara massal menggunakan COPY pernyataan (lihat contoh lengkap di Python):
COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);
Kolom vektor dapat diperbarui seperti kolom standar:
UPDATE documents SET embedding = '[1,1,1]' where id = 1;
Melakukan pencarian jarak kosinus
Ekstensi ini vector menyediakan v1 <=> v2 operator untuk menghitung jarak kosinus antara vektor v1 dan v2. Hasilnya adalah angka antara 0 dan 2, di mana 0 berarti "identik secara semantik" (tidak ada jarak) dan dua berarti "semantik berlawanan" (jarak maksimum).
Anda dapat melihat istilah jarak kosinus dan kesamaan. Ingat bahwa kesamaan kosinus adalah antara -1 dan 1, di mana -1 berarti "berlawanan secara semantik" dan 1 berarti "identik secara semantik." Perhatikan bahwa similarity = 1 - distance.
Hasil akhirnya adalah bahwa kueri yang diurutkan dari jarak terdekat ke terjauh mengembalikan hasil yang terdekat (atau paling mirip) terlebih dahulu, sementara kueri yang diurutkan dari kesamaan tertinggi ke terendah mengembalikan hasil yang paling mirip (atau terdekat) terlebih dahulu.
Berikut adalah beberapa vektor dan jarak dan kesamaannya untuk mengilustrasikan konsep. Anda dapat menghitung perhitungan ini sendiri dengan menjalankan sesuatu seperti:
SELECT '[1,1]' <=> '[-1,-1]';
Pertimbangkan vektor ini:
Kesamaan dan jarak mereka adalah:
| v1 | V2 | jarak | Kesamaan |
|---|---|---|---|
[1, 1] |
[1, 1] |
0 | 1 |
[1, 1] |
[-1, -1] |
2 | -1 |
[1, 0] |
[0, 1] |
1 | 0 |
Untuk mendapatkan dokumen dalam urutan kedekatan dengan vektor [2, 3, 4], jalankan kueri ini:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;
Hasil:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535
1 | [1,2,3] | 0.007416666029069763
2 | [2,1,3] | 0.05704583272761632
Dokumen dengan id=3 adalah yang paling mirip dengan kueri, diikuti segera oleh id=1, dan terakhir oleh id=2.
Tambahkan klausa LIMIT N ke kueri SELECT untuk mengembalikan N dokumen paling mirip terbanyak. Misalnya, untuk mendapatkan dokumen yang paling mirip:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;
Hasil:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535