Lagra vektorer i Azure Database for PostgreSQL
Kom ihåg att du behöver inbäddningsvektorer som lagras i en vektordatabas för att köra en semantisk sökning. Azure Database for PostgreSQL – flexibel server kan användas som en vektordatabas med vector tillägget.
Introduktion till vector
Tillägget med öppen källkod vector tillhandahåller vektorlagring, likhetsfrågor och andra vektoråtgärder för PostgreSQL. När du är aktiverad kan du skapa vector kolumner för att lagra inbäddningar (eller andra vektorer) tillsammans med andra kolumner.
/* 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]');
Du kan lägga till vektorkolumner i befintliga tabeller:
ALTER TABLE documents ADD COLUMN embedding vector(3);
När du har vissa vektordata kan du se dem tillsammans med normala tabelldata:
# SELECT * FROM documents;
id | embedding
----+-----------
1 | [1,2,3]
2 | [2,1,3]
3 | [4,5,6]
Tillägget vector stöder flera språk, till exempel .NET, Python, Java och många andra. Mer information finns i deras GitHub-lagringsplatser .
Om du vill infoga ett dokument med vektor [1, 2, 3] med npgsql i C# kör du kod så här:
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();
}
Infoga och uppdatera vektorer
När en tabell har en vektorkolumn kan rader läggas till med vektorvärden, som tidigare nämnts.
INSERT INTO documents (embedding) VALUES ('[1,2,3]');
Du kan också läsa in vektorer i bulk med hjälp av -instruktionen COPY (se fullständigt exempel i Python):
COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);
Vektorkolumner kan uppdateras som standardkolumner:
UPDATE documents SET embedding = '[1,1,1]' where id = 1;
Utföra en cosininavståndssökning
Tillägget vector tillhandahåller operatorn v1 <=> v2 för att beräkna cosinéavståndet mellan vektorer v1 och v2. Resultatet är ett tal mellan 0 och 2, där 0 betyder "semantiskt identiskt" (inget avstånd) och två betyder "semantiskt motsatt" (maximalt avstånd).
Du kan se termerna cosinusavstånd och likhet. Kom ihåg att cosinisk likhet är mellan -1 och 1, där -1 betyder "semantiskt motsatt" och 1 betyder "semantiskt identiskt". Observera att similarity = 1 - distance.
Resultatet är att en fråga som sorteras efter avståndsstigande returnerar det minst avlägsna (mest liknande) resultatet först, medan en fråga sorterad efter likhets fallande returnerar de mest lika (minst avlägsna) resultaten först.
Här är några vektorer och deras avstånd och likheter för att illustrera begreppen. Du kan beräkna den här beräkningen själv genom att köra något i stil med:
SELECT '[1,1]' <=> '[-1,-1]';
Tänk på följande vektorer:
Deras likheter och avstånd är:
| v1 | V2 | avstånd | likhet |
|---|---|---|---|
[1, 1] |
[1, 1] |
0 | 1 |
[1, 1] |
[-1, -1] |
2 | -1 |
[1, 0] |
[0, 1] |
1 | 0 |
Kör den här frågan för att hämta dokumenten i ordning efter närhet till vektorn [2, 3, 4]:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;
Resultat:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535
1 | [1,2,3] | 0.007416666029069763
2 | [2,1,3] | 0.05704583272761632
Dokumentet med id=3 är det som mest liknar frågan, följt kort av id=1, och slutligen av id=2.
Lägg till en LIMIT N sats i SELECT frågan för att returnera de mest N liknande dokumenten. För att till exempel få det mest liknande dokumentet:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;
Resultat:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535