昨天介紹了 Embedding 模型的選型考量,今天要來看向量資料庫(Vector Database)——負責儲存這些向量,並提供快速的相似度搜尋能力的角色。
傳統資料庫擅長的是精確匹配(WHERE id = 123)或範圍查詢(WHERE price > 100),但向量資料庫要解決的是完全不同的問題:在成千上萬筆向量裡,快速找出跟目標向量「距離最近」的幾筆。
如果資料量小,暴力比對(把查詢向量跟資料庫裡每一筆向量都算一次距離)也能work,但當資料量來到百萬筆以上,就需要專門的索引結構(如 HNSW、IVF)來加速搜尋,這也是向量資料庫存在的意義。
| 資料庫 | 型態 | 優點 | 缺點 |
|---|---|---|---|
| Chroma | 專用向量 DB | 輕量、Python 原生、上手快 | 大規模場景的成熟度較低 |
| Postgres + pgvector | 關聯式 DB 擴充套件 | 可與既有資料表整合、SQL 生態成熟 | 大規模效能不如專用向量 DB |
| Milvus | 專用向量 DB | 為大規模向量檢索設計、效能佳 | 部署維運較複雜 |
| Qdrant | 專用向量 DB | API 簡潔、支援豐富的過濾條件 | 社群生態相對新 |
| Pinecone | 全託管服務 | 免維運、開箱即用 | 需付費、資料存在第三方 |
延續 Day 3 的選型決定,這系列會用 Postgres + pgvector。除了前面提過的「與既有資料整合方便」之外,還有:
-- 在 Postgres 中啟用 pgvector 擴充套件
CREATE EXTENSION IF NOT EXISTS vector;
-- 建立儲存 chunk 與向量的資料表
CREATE TABLE chunks (
id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
embedding VECTOR(1536), -- 維度需與 Embedding 模型輸出一致
metadata JSONB,
created_at TIMESTAMP DEFAULT now()
);
pgvector 提供兩種主要索引類型:
| 索引類型 | 特色 | 適合情境 |
|---|---|---|
| IVFFlat | 建立速度快、記憶體用量較低 | 資料量中等、可接受略低的召回率 |
| HNSW | 查詢速度快、召回率高 | 對查詢速度與精準度要求高,可接受較高的建置成本 |
-- 建立 HNSW 索引
CREATE INDEX ON chunks USING hnsw (embedding vector_cosine_ops);
向量資料庫的選型要考量資料規模、是否需要跟既有系統整合、維運成本等因素。這系列選擇 Postgres + pgvector 作為示範,兼顧易用性與擴充彈性。明天我們要實際動手,把 Day 9 產出的 chunk 資料寫入向量資料庫、建立索引。