Vectoren opslaan in Azure Database for PostgreSQL

Voltooid

Tip

Zie het tabblad Tekst en afbeeldingen voor meer informatie.

Denk eraan dat u embeddingvectoren 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.

Diagram van Azure Database for PostgreSQL flexibele server met behulp van de vectorextensie voor het opslaan van vier embeddingvectoren.

Inleiding tot pgvector

De opensource-extensie pgvector biedt vectoropslag, gelijkenisquery's en andere vectorbewerkingen voor PostgreSQL. Zodra deze optie is ingeschakeld, kunt u vector kolommen maken om embeddings (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.

Om een document met vector [1, 2, 3] in te voegen 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;

De vector extensie biedt de v1 <=> v2 operator om de cosinusafstand tussen vectoren v1 en v2 te berekenen. Het resultaat is een getal tussen 0 en 2, waarbij 0 'semantisch identiek' (geen afstand) betekent en 2 'semantisch tegenovergesteld' (maximale afstand) 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 conclusie is dat een query die oplopend op afstand is gesorteerd, eerst de minst verre (meest vergelijkbare) resultaten retourneert, terwijl een query die op aflopende similariteit is gesorteerd, 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]';

Beschouw deze vectoren:

Diagram van een tweedimensionale grafiek met vectoren (1, 1), (1, 0), (0, 1) en (-1, -1).

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 id=3 is het meest vergelijkbaar met de query, gevolgd door id=1, en ten slotte door id=2.

Voeg een LIMIT N clausule 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

Tip

Zie het tabblad Tekst en afbeeldingen voor meer informatie.