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 資料型態,不再需要強行擠進 JSON 或 BLOB 中。
定義原生向量欄位
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 模型。
總結
- PostgreSQL:功能最強、社群範例最多,適合各類 RAG 應用。
- MySQL 8.4+:正式進入向量時代,效能優於之前的
JSON方案。 - 效能關鍵:插入時注意批次處理,查詢前注意維度匹配。
搞定了儲存,下一章我們將討論向量搜尋的核心:相似度相似度搜尋語法。