Ukládání vektorů ve službě Azure Database for PostgreSQL

Dokončeno

Vzpomeňte si, že k spuštění sémantického vyhledávání potřebujete vložené vektory uložené ve vektorové databázi. Flexibilní server Azure Database for PostgreSQL se dá použít jako vektorová databáze s rozšířením vector .

Diagram flexibilního serveru Azure Database for PostgreSQL a rozšíření s názvem vektor Vedle ní jsou čtyři uložené vektory s n-dimenzemi a libovolnými číselnými hodnotami.

Úvod do vector

Opensourcové vector rozšíření poskytuje vektorové úložiště, dotazování podobnosti a další vektorové operace pro PostgreSQL. Po povolení můžete vytvořit vector sloupce pro ukládání vložených objektů (nebo jiných vektorů) společně s jinými sloupci.

/* 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]');

Do existujících tabulek můžete přidat vektorové sloupce:

ALTER TABLE documents ADD COLUMN embedding vector(3);

Jakmile máte nějaká vektorová data, můžete je zobrazit společně s normálními daty tabulky:

# SELECT * FROM documents;
 id | embedding
----+-----------
 1 | [1,2,3]
 2 | [2,1,3]
 3 | [4,5,6]

Rozšíření vector podporuje několik jazyků, jako jsou .NET, Python, Java a mnoho dalších. Další informace najdete v úložištích GitHubu.

Pokud chcete vložit dokument s vektorem [1, 2, 3] pomocí Npgsql v jazyce C#, spusťte kód takto:

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();
}

Vložení a aktualizace vektorů

Jakmile tabulka obsahuje vektorový sloupec, lze řádky přidat s hodnotami vektoru, jak jsme si poznamenali dříve.

INSERT INTO documents (embedding) VALUES ('[1,2,3]');

Vektory můžete také hromadně načíst pomocí příkazu (viz úplný příklad v PythonuCOPY):

COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);

Vektorové sloupce je možné aktualizovat jako standardní sloupce:

UPDATE documents SET embedding = '[1,1,1]' where id = 1;

Rozšíření vector poskytuje v1 <=> v2 operátor pro výpočet kosinus vzdálenosti mezi vektory v1 a v2. Výsledkem je číslo v rozmezí od 0 do 2, kde 0 znamená "sémanticky identický" (bez vzdálenosti) a dva znamená "sémanticky opačný" (maximální vzdálenost).

Můžete vidět termíny kosinus vzdálenosti a podobnosti. Vzpomeňte si, že kosinus je mezi -1 a 1, kde -1 znamená "sémanticky opačný" a 1 znamená "sémanticky identický". Všimněte si, že similarity = 1 - distance.

Výsledkem je, že dotaz seřazený podle vzdálenosti vzestupně vrátí nejdříve nejméně vzdálené (nejvíce podobné) výsledky, zatímco dotaz seřazený sestupně vrátí nejvíce podobné (nejméně vzdálené) výsledky jako první.

Tady jsou některé vektory a jejich vzdálenosti a podobnosti, které ilustrují koncepty. Tento výpočet můžete vypočítat sami spuštěním něčeho takového:

SELECT '[1,1]' <=> '[-1,-1]';

Zvažte tyto vektory:

2D graf znázorňující vektory (1,1), (1,0), (0,1) a (0,0).

Jejich podobnosti a vzdálenosti jsou:

v1 V2 vzdálenost podobnost
[1, 1] [1, 1] 0 1
[1, 1] [-1, -1] 2 -1
[1, 0] [0, 1] 0 0

Pokud chcete získat dokumenty v pořadí od blízkosti vektoru [2, 3, 4], spusťte tento dotaz:

SELECT
  *,
  embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;

Výsledky:

 id | embedding |   distance
----+-----------+-----------------------
 3 | [4,5,6] | 0.0053884541273605535
 1 | [1,2,3] | 0.007416666029069763
 2 | [2,1,3] | 0.05704583272761632

Dokument s id=3 nejpodobnější dotazem, za kterým následuje krátce id=1a naposledy id=2.

Přidejte do SELECT dotazu klauzuli, LIMIT N která vrátí nejvíce N podobné dokumenty. Pokud například chcete získat nejpodobnější dokument:

SELECT
  *,
  embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;

Výsledky:

 id | embedding |   distance
----+-----------+-----------------------
 3 | [4,5,6] | 0.0053884541273605535