Vectoren opslaan in Azure Database for PostgreSQL
Denk eraan dat u insluitvectors die zijn opgeslagen in een vectordatabase, nodig hebt om een semantische zoekopdracht uit te voeren. Azure Database for PostgreSQL flexibele server kan worden gebruikt als een vectordatabase met de vector-extensie.
Inleiding tot pgvector
De opensource-extensie pgvector biedt vectoropslag, gelijkenisquery's en andere vectorbewerkingen voor PostgreSQL. Zodra deze optie is ingeschakeld, kunt u kolommen maken vector om insluitingen (of andere vectoren) naast andere kolommen op te slaan.
/* 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]');
U kunt vectorkolommen toevoegen aan bestaande tabellen:
ALTER TABLE documents ADD COLUMN embedding vector(3);
Zodra u enkele vectorgegevens hebt, kunt u deze naast normale tabelgegevens zien:
# SELECT * FROM documents;
id | embedding
----+-----------
1 | [1,2,3]
2 | [2,1,3]
3 | [4,5,6]
De vector extensie ondersteunt verschillende talen, zoals .NET, Python, Java en vele andere. Bekijk hun GitHub-opslagplaatsen voor meer informatie.
Als u een document met vector [1, 2, 3] wilt invoegen met behulp van Npgsql in C#, voert u code als volgt uit:
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();
}
Vectoren invoegen en bijwerken
Zodra een tabel een vectorkolom heeft, kunnen rijen worden toegevoegd met vectorwaarden, zoals eerder is genoteerd.
INSERT INTO documents (embedding) VALUES ('[1,2,3]');
U kunt ook bulksgewijs vectoren laden met behulp van de COPY instructie (zie het volledige voorbeeld in Python):
COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);
Vectorkolommen kunnen worden bijgewerkt zoals standaardkolommen:
UPDATE documents SET embedding = '[1,1,1]' where id = 1;
Een cosinusafstandszoekopdracht uitvoeren
De vector extensie biedt de operator de v1 <=> v2 cosinusafstand tussen vectoren v1 en v2. Het resultaat is een getal tussen 0 en 2, waarbij 0 'semantisch identiek' (geen afstand) en twee 'semantisch tegenovergestelde' (maximumafstand) betekent.
U kunt de termen cosinusafstand en overeenkomsten zien. Zoals u weet, is cosinus vergelijkbaar tussen -1 en 1, waarbij -1 "semantisch tegenovergestelde" en 1 "semantisch identiek" betekent. Dus, similarity = 1 - distance.
De upshot is dat een query die is gesorteerd op afstand, eerst de minst verre (meest vergelijkbare) resultaten retourneert, terwijl een query die is gesorteerd op aflopend, de meest vergelijkbare (minst verre) resultaten als eerste retourneert.
Hier volgen enkele vectoren en hun afstanden en overeenkomsten om de concepten te illustreren. U kunt deze berekening zelf berekenen door bijvoorbeeld het volgende uit te voeren:
SELECT '[1,1]' <=> '[-1,-1]';
Houd rekening met deze vectoren:
Hun overeenkomsten en afstanden zijn:
| v1 | V2 | afstand | gelijkenis |
|---|---|---|---|
[1, 1] |
[1, 1] |
0 | 1 |
[1, 1] |
[-1, -1] |
2 | -1 |
[1, 0] |
[0, 1] |
1 | 0 |
Voer deze query uit om de documenten in de volgorde van de nabijheid van de vector [2, 3, 4]op te halen:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;
Resultaten:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535
1 | [1,2,3] | 0.007416666029069763
2 | [2,1,3] | 0.05704583272761632
Het document met is het meest vergelijkbaar met id=3 de query, gevolgd door id=1, en ten slotte door id=2.
Voeg een LIMIT N component toe aan de SELECT query om de N meest vergelijkbare documenten te retourneren. Als u bijvoorbeeld het meest vergelijkbare document wilt ophalen:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;
Resultaten:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535