Vektorok tárolása az Azure Database for PostgreSQL-ben

Befejeződött

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.

Egy rugalmas Azure Database for PostgreSQL-kiszolgáló és a

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;

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:

A vektorokat (1,1), (1,0), (0,1) és (0,0) ábrázoló 2D gráf.

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