Vektorok tárolása az Azure Database for PostgreSQL-ben
Ne feledje, hogy a szemantikai keresés futtatásához vektoradatbázisban tárolt vektorok beágyazására van szükség. A rugalmas Azure Database for PostgreSQL-kiszolgáló vektoradatbázisként használható a vector kiterjesztéssel.
Bevezetés a vector
A nyílt forráskódú vector bővítmény vektoros tárolást, hasonlósági lekérdezést és egyéb vektorműveleteket biztosít a PostgreSQL-hez. Ha engedélyezve van, vector létrehozhat oszlopokat a beágyazások (vagy más vektorok) tárolására más oszlopok mellett.
/* 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]');
Vektoroszlopokat hozzáadhat meglévő táblákhoz:
ALTER TABLE documents ADD COLUMN embedding vector(3);
Ha már rendelkezik vektoradatokkal, láthatja a normál táblaadatok mellett:
# SELECT * FROM documents;
id | embedding
----+-----------
1 | [1,2,3]
2 | [2,1,3]
3 | [4,5,6]
A vector bővítmény számos nyelvet támogat, például a .NET-et, a Pythont, a Java-t és sok mást. További információért tekintse meg a GitHub-adattáraikat.
Ha vektoros [1, 2, 3] dokumentumot szeretne beszúrni a C#-ban az Npgsql használatával, futtassa a következő kódot:
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();
}
Vektorok beszúrása és frissítése
Ha egy táblázat tartalmaz egy vektoroszlopot, a korábban leírtaknak megfelelően a sorok vektorértékekkel is hozzáadhatók.
INSERT INTO documents (embedding) VALUES ('[1,2,3]');
A vektorokat tömegesen is betöltheti az utasítással (lásd a COPYPython teljes példáját ):
COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);
A vektoroszlopok a standard oszlopokhoz hasonlóan frissíthetők:
UPDATE documents SET embedding = '[1,1,1]' where id = 1;
Koszinuszos-távolság keresés végrehajtása
A vector bővítmény az v1 <=> v2 operátort biztosítja a v1 és v2 vektorok közötti koszinusz távolság kiszámításához. Az eredmény egy 0 és 2 közötti szám, ahol a 0 "szemantikailag azonos" (nincs távolság), a kettő pedig "szemantikailag ellentétes" (maximális távolság).
Láthatja a koszinuszas távolság és a hasonlóság kifejezéseket. Ne feledje, hogy a koszinusz hasonlósága -1 és 1 között van, ahol a -1 "szemantikailag ellentétes", az 1 pedig "szemantikailag azonos" értéket jelent. Vegye figyelembe, hogy similarity = 1 - distance.
A végeredmény az, hogy a távolról növekvő sorrendbe rendezett lekérdezések a legkevésbé távoli (leginkább hasonló) eredményeket adnak vissza először, míg a hasonlóság szerint csökkenő sorrendbe rendezett lekérdezések a leginkább hasonló (legkevésbé távoli) eredményeket adnak vissza először.
Az alábbiakban néhány vektort és azok távolságait és hasonlóságait mutatjuk be a fogalmak szemléltetéséhez. Ezt a számítást saját maga is kiszámíthatja a következőhöz hasonló futtatásával:
SELECT '[1,1]' <=> '[-1,-1]';
Vegye figyelembe az alábbi vektorokat:
Hasonlóságuk és távolságuk a következő:
| v1 | 2. verzió | távolság | hasonlóság |
|---|---|---|---|
[1, 1] |
[1, 1] |
0 | 1 |
[1, 1] |
[-1, -1] |
2 | -1 |
[1, 0] |
[0, 1] |
1 | 0 |
Ha a dokumentumokat a vektorhoz [2, 3, 4]való közelség sorrendjében szeretné lekérni, futtassa ezt a lekérdezést:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;
Eredmények:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535
1 | [1,2,3] | 0.007416666029069763
2 | [2,1,3] | 0.05704583272761632
A lekérdezéshez leginkább hasonlító dokumentum a id=3, amelyet kicsit lemaradva követ a id=1, végül pedig a id=2.
Adjon hozzá egy LIMIT N záradékot a SELECT lekérdezéshez a leginkább N hasonló dokumentum visszaadásához. Például a leginkább hasonló dokumentum lekéréséhez:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;
Eredmények:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535