Vektörleri PostgreSQL için Azure Veritabanı'de depolama
Anlamsal arama çalıştırmak için vektör veritabanında depolanan vektörlerin katıştırılması gerektiğini unutmayın. PostgreSQL için Azure Veritabanı esnek sunucusu, uzantılı bir vector olarak kullanılabilir.
Giriş vector
Açık kaynak vector uzantısı PostgreSQL için vektör depolama, benzerlik sorgulama ve diğer vektör işlemleri sağlar. Etkinleştirildikten sonra, diğer sütunların yanı sıra eklemeleri (veya diğer vektörleri) depolamak için sütunlar oluşturabilirsiniz vector .
/* 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]');
Var olan tablolara vektör sütunları ekleyebilirsiniz:
ALTER TABLE documents ADD COLUMN embedding vector(3);
Bazı vektör verilerine sahip olduktan sonra normal tablo verilerinin yanında görebilirsiniz:
# SELECT * FROM documents;
id | embedding
----+-----------
1 | [1,2,3]
2 | [2,1,3]
3 | [4,5,6]
Uzantı vector.NET, Python, Java ve diğer birçok dili destekler. Daha fazla bilgi için GitHub depolarına bakın.
C# dilinde Npgsql kullanarak vektör [1, 2, 3] içeren bir belge eklemek için aşağıdaki gibi bir kod çalıştırın:
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();
}
Vektör ekleme ve güncelleştirme
Bir tabloda vektör sütunu olduğunda, daha önce belirtildiği gibi satırlar vektör değerleriyle eklenebilir.
INSERT INTO documents (embedding) VALUES ('[1,2,3]');
Ayrıca deyimini COPY kullanarak vektörleri toplu olarak yükleyebilirsiniz (Python'da tam örne bakın):
COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);
Vektör sütunları standart sütunlar gibi güncelleştirilebilir:
UPDATE documents SET embedding = '[1,1,1]' where id = 1;
Kosinüs uzaklığı araması yapma
Uzantı, vector vektörler v1 <=> v2 ile v1arasındaki kosinüs v2 mesafesini hesaplamak için işlecini sağlar. Sonuç, 0 ile 2 arasında bir sayıdır; burada 0 "anlamsal olarak özdeş" (uzaklık yok) ve iki de "anlamsal olarak karşıt" (maksimum uzaklık) anlamına gelir.
Kosinüs uzaklığı ve benzerliği terimlerini görebilirsiniz. Kosinüs benzerliğinin -1 ile 1 arasında olduğunu, burada -1'in "anlamsal olarak karşıt" ve 1'in "anlamsal olarak aynı" anlamına geldiğini hatırlayın. öğesine dikkat similarity = 1 - distanceedin.
Yukarı doğru, artan uzaklığa göre sıralanmış bir sorgunun önce en az uzak (en benzer) sonuçları döndürmesi, benzerliğe göre sıralanmış bir sorgunun önce en benzer (en az uzak) sonuçları döndürmesidir.
Kavramları göstermek için bazı vektörler ve bunların uzaklıkları ve benzerlikleri aşağıdadır. Aşağıdaki gibi bir şey çalıştırarak bu hesaplamayı kendiniz hesaplayabilirsiniz:
SELECT '[1,1]' <=> '[-1,-1]';
Şu vektörleri göz önünde bulundurun:
Benzerlikleri ve uzaklıkları şunlardır:
| v1 | V2 | uzaklık | benzerlik |
|---|---|---|---|
[1, 1] |
[1, 1] |
0 | 1 |
[1, 1] |
[-1, -1] |
2 | -1 |
[1, 0] |
[0, 1] |
1 | 0 |
Belgeleri vektöre [2, 3, 4]yakınlık sırasına göre almak için şu sorguyu çalıştırın:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;
Sonuçlar:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535
1 | [1,2,3] | 0.007416666029069763
2 | [2,1,3] | 0.05704583272761632
ile id=3 belge, sorguya en çok benzeyen belgedir ve bunu kısa süre id=1sonra ve son olarak id=2tarafından izler.
En LIMIT N benzer belgeleri döndürmek SELECT için sorguya bir N yan tümce ekleyin. Örneğin, en benzer belgeyi almak için:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;
Sonuçlar:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535