將向量儲存在適用於 PostgreSQL 的 Azure 資料庫中
回想一下,您需要內嵌儲存在向量資料庫中的向量來執行語意搜尋。 「適用於 PostgreSQL 的 Azure 資料庫」彈性伺服器可用作具有 vector
延伸模組的向量資料庫。
vector
簡介
開放原始碼 vector
延伸模組為 PostgreSQL 提供向量儲存空間、相似性查詢和其他向量作業。 啟用之後,您可以建立 vector
資料行來將內嵌 (或其他向量) 與其他資料行一起儲存。
/* 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]');
您可以將向量資料列新增至現有的資料表:
ALTER TABLE documents ADD COLUMN embedding vector(3);
一旦您有一些向量資料後,您就可以在一般資料表資料旁邊看到它:
# SELECT * FROM documents;
id | embedding
----+-----------
1 | [1,2,3]
2 | [2,1,3]
3 | [4,5,6]
vector
延伸模組支援數種語言,例如 .NET、Python、Java,以及其他許多語言。 如需詳細資訊,請參閱其 GitHub 存放庫。
若要在 C# 中使用 Npgsql 插入具有向量 [1, 2, 3]
的文件,請執行如下的程式碼:
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();
}
插入和更新向量
一旦資料表有向量資料行,就可以使用向量值來加入資料列,如先前所述。
INSERT INTO documents (embedding) VALUES ('[1,2,3]');
您也可以使用 COPY
陳述式大量載入向量 (請參閱 Python 中的完整範例):
COPY documents (embedding) FROM STDIN WITH (FORMAT BINARY);
向量資料列可以像標準資料行一樣更新:
UPDATE documents SET embedding = '[1,1,1]' where id = 1;
執行餘弦距離搜尋
vector
延伸模組提供 v1 <=> v2
運算子來計算向量 v1
與 v2
之間的餘弦距離。 結果是一個介於 0 到 2 之間的數字,其中 0 表示「語意相同」(無距離),而 2 表示「語意相反」(最大距離)。
您可以看到術語餘弦距離和相似性。 回想一下,餘弦相似性介於 -1 和 1 之間,其中 -1 表示「語意相反」,而 1 表示「語意相同」。請注意 similarity = 1 - distance
。
結果是,依距離遞增排序的查詢會先傳回距離最短 (最相似) 的結果,而依相似性遞減排序的查詢會先傳回最相似 (距離最短) 的結果。
以下有一些向量及其距離和相似性來說明這些概念。 您可以執行類似下列內容來自行計算此計算:
SELECT '[1,1]' <=> '[-1,-1]';
設想下列這些向量:
其相似性和距離如下:
v1 | V2 | distance | 相似 |
---|---|---|---|
[1, 1] |
[1, 1] |
0 | 1 |
[1, 1] |
[-1, -1] |
2 | -1 |
[1, 0] |
[0, 1] |
1 | 0 |
若要按照與向量 [2, 3, 4]
的接近程度的順序取得文件,請執行以下查詢:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance;
結果:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535
1 | [1,2,3] | 0.007416666029069763
2 | [2,1,3] | 0.05704583272761632
具有 id=3
的文件與查詢最相似,其次是 id=1
,最後是 id=2
。
在 SELECT
查詢中新增 LIMIT N
子句以傳回前 N
個最相似的文件。 例如,若要取得最類似的文件:
SELECT
*,
embedding <=> '[2,3,4]' AS distance
FROM documents
ORDER BY distance
LIMIT 1;
結果:
id | embedding | distance
----+-----------+-----------------------
3 | [4,5,6] | 0.0053884541273605535