SQL Vector 儲存與向量型態

在傳統 SQL 中,我們處理的是結構化的數字與文字。但對於 AI 驅動的應用,資料庫需要能夠儲存「語義向量 (Embeddings)」。本章將詳細介紹如何在主流資料庫中宣告向量欄位、儲存資料,以及在大規模場景下的效能優化建議。

PostgreSQL (pgvector)

PostgreSQL 透過 pgvector 提供的支援最為成熟,不僅有專門的資料型態,還有針對高維度資料優化的索引。

宣告與維度限值

向量的高度取決於 Embedding 模型。例如 text-embedding-3-small 是 1536 維。

-- 宣告長度固定為 1536 的向量欄位
CREATE TABLE document_embeddings (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding VECTOR(1536)
);
pgvector 目前支持高達 16,000 維度的向量,足以應對市面上絕大多數的大型語言模型。

資料插入細節

除了標準的中括號語法,你也可以進行大量的 COPY 操作來提升效能。

INSERT INTO document_embeddings (content, embedding)
VALUES ('這是測試內容', '[0.012, -0.05, 0.42, ...]');

MySQL 8.4+:原生 VECTOR 型態登場

對於 MySQL 使用者而言,8.4 LTS 版本是個里程碑,它正式引入了原生的 VECTOR 資料型態,不再需要強行擠進 JSONBLOB 中。

定義原生向量欄位

MySQL 的 VECTOR 類別是以二進位格式儲存 4 字節的單精度浮點數。

CREATE TABLE product_vectors (
    product_id INT PRIMARY KEY,
    vec VECTOR(768) NOT NULL -- 指定維度
);

輔助函數的使用

MySQL 提供了一系列函數來處理向量與外部格式(如字串)的轉換:

  • STRING_TO_VECTOR():將字串轉為資料庫二進位向量。
  • VECTOR_TO_STRING():將向量轉回易讀的字串。
  • VECTOR_DIM():查詢該欄位的維度。
-- 插入時建議使用轉換函數
INSERT INTO product_vectors (product_id, vec)
VALUES (101, STRING_TO_VECTOR('[0.1, 0.2, 0.3, ...]'));

-- 驗證維度
SELECT VECTOR_DIM(vec) FROM product_vectors WHERE product_id = 101;

Azure SQL / SQL Server 的現況

在傳統的內部部署 SQL Server 中,通常使用 VARBINARY(MAX) 儲存壓縮後的向量。但在 Azure SQL 中,已經推出了內建的向量功能 (Preview)。

CREATE TABLE ProductCatalog (
    ProductID INT PRIMARY KEY,
    ProductDescription NVARCHAR(MAX),
    Embedding Vector(1536) -- 僅限支援向量功能的 Azure SQL 版本
);

大規模儲存的挑戰與優化

當你的資料達到百萬、千萬級別時,向量儲存會面臨磁碟空間與 I/O 的嚴峻挑戰。

儲存精度與量化 (Quantization)

為了省空間,有時候不需要完美的 32-bit 浮點數精度。

  • Float16:將空間減半,但搜尋精準度可能微幅下降。
  • 二進位量化 (Binary Quantization):極端情況下將浮點數轉為 bit,空間節省 32 倍,適用於初步大規模篩選。

批次寫入 (Batch Loading)

向量檢索應用通常涉及大量的資料預熱(將整站文章 embedding 存入)。

  • 避免單筆插入:使用 INSERT INTO ... VALUES (), (), ... 一次插入數百筆。
  • PostgreSQL 專屬:使用 COPY 指令是完成千萬級 Embedding 灌入的最快方式。

維度陷阱:千萬別設錯

維度不可更改:一旦 CREATE TABLE 定義了 VECTOR(1536),你就不能插入 768 維的資料。如果未來更換了 Embedding 模型,你通常需要建立新欄位並重新計算所有資料的向量。因此,在儲存前務必鎖定使用的 AI 模型。

總結

  1. PostgreSQL:功能最強、社群範例最多,適合各類 RAG 應用。
  2. MySQL 8.4+:正式進入向量時代,效能優於之前的 JSON 方案。
  3. 效能關鍵:插入時注意批次處理,查詢前注意維度匹配。

搞定了儲存,下一章我們將討論向量搜尋的核心:相似度相似度搜尋語法