將向量儲存在適用於 PostgreSQL 的 Azure 資料庫中

已完成

回想一下,您需要內嵌儲存在向量資料庫中的向量來執行語意搜尋。 「適用於 PostgreSQL 的 Azure 資料庫」彈性伺服器可用作具有 vector 延伸模組的向量資料庫

「適用於 PostgreSQL 的 Azure 資料庫」彈性伺服器和名為

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 延伸模組支援數種語言,例如 .NETPythonJava,以及其他許多語言。 如需詳細資訊,請參閱其 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 運算子來計算向量 v1v2 之間的餘弦距離。 結果是一個介於 0 到 2 之間的數字,其中 0 表示「語意相同」(無距離),而 2 表示「語意相反」(最大距離)。

您可以看到術語餘弦距離相似性。 回想一下,餘弦相似性介於 -1 和 1 之間,其中 -1 表示「語意相反」,而 1 表示「語意相同」。請注意 similarity = 1 - distance

結果是,依距離遞增排序的查詢會先傳回距離最短 (最相似) 的結果,而依相似性遞減排序的查詢會先傳回最相似 (距離最短) 的結果。

以下有一些向量及其距離和相似性來說明這些概念。 您可以執行類似下列內容來自行計算此計算:

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

設想下列這些向量:

一個顯示向量 (1,1)、(1,0)、(0,1) 和 (0,0) 的 2D 圖形。

其相似性和距離如下:

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