Ukládání vektorů ve službě Azure Database for PostgreSQL
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
.
Ú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;
Hledání kosinusové vzdálenosti
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:
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=1
a 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