TL;DR | 面試情境模擬 #
👴 面試官:什麼是向量資料庫?和一般資料庫有什麼差別?
🧑💻 你:一般資料庫用 SQL 做精確查詢(WHERE name = ‘Alice’),向量資料庫做相似度查詢(找到和這個向量最近的 K 個向量)。應用在 RAG 系統裡:文件先轉成 Embedding 向量存進去,查詢時把問題也轉成向量,找最相似的文件片段給 LLM 參考。Pinecone 是 Managed 服務最容易上手,pgvector 是 Postgres 的擴充套件,不用多一個服務,Chroma 適合本地開發。
比喻:圖書館的兩種找書方式 #
- 一般資料庫:去找書名叫「貓」的書(精確匹配)
- 向量資料庫:去找「主題和貓差不多的書」——可能找到「寵物飼養指南」「虎貓的生態」「家庭動物行為學」(語意相似)
向量資料庫的核心操作 #
寫入(Upsert) #
# 把文件轉成向量後存入
import openai
text = "PostgreSQL 是功能最完整的開源關聯式資料庫"
embedding = openai.embeddings.create(
model="text-embedding-3-small",
input=text
).data[0].embedding # [0.23, -0.71, 0.15, ...]
# 存入向量資料庫
collection.add(
documents=[text],
embeddings=[embedding],
ids=["doc_1"]
)
查詢(Query) #
# 把問題也轉成向量,找最相近的文件
query = "哪個資料庫功能最多?"
query_embedding = get_embedding(query)
results = collection.query(
query_embeddings=[query_embedding],
n_results=3 # 取最相近的 3 筆
)
常見向量資料庫比較 #
| 資料庫 | 類型 | 特點 | 適合場景 |
|---|---|---|---|
| Pinecone | Managed Cloud | 全託管,零維運,有免費額度 | 生產環境,不想管基礎設施 |
| pgvector | Postgres 擴充 | 已有 Postgres 可直接用 | 不想多一個服務,資料量中等 |
| Chroma | 本地 / Server | 開源,最容易本地跑 | 開發測試,原型 |
| Weaviate | Open Source | 功能豐富,支援多種搜尋模式 | 複雜查詢需求 |
| Qdrant | Open Source | 高效能,支援過濾查詢 | 需要精準過濾 + 語意搜尋 |
| Supabase | Managed | pgvector + Postgres 打包 | SaaS 開發,一站式 |
怎麼選? #
已有 Postgres?
├─ 是 → pgvector(零額外成本)
└─ 否
├─ 只是開發測試 → Chroma(本地)
├─ 想要全託管 → Pinecone 或 Supabase
└─ 需要複雜過濾 + 高效能 → Qdrant
ANN 演算法:為什麼搜尋那麼快? #
向量資料庫不是逐一比對所有向量(Exact NN,向量多了會很慢),而是用 ANN(Approximate Nearest Neighbor) 演算法:
- HNSW(Hierarchical Navigable Small World):建立多層圖結構,搜尋時跳躍式縮小範圍。大多數向量資料庫的預設演算法
- IVF(Inverted File Index):把向量分成多個 cluster,搜尋時只看相關的 cluster
代價是「近似」,不保證找到絕對最近的向量,但誤差極小,搜尋速度可以提升幾個數量級。
💡 延伸問題 #
Q1:向量資料庫和 Elasticsearch 的差別? #
ES 是關鍵字搜尋(BM25 演算法),擅長精確詞語匹配。向量資料庫是語意搜尋,擅長意思相近的查找。現代搜尋系統通常混合使用(Hybrid Search):關鍵字匹配找精確結果,向量搜尋找語意相關結果,再 re-rank 合併。
Q2:Chunking 怎麼影響搜尋品質? #
片段太長:向量被多個主題稀釋,相似度計算不準確。
片段太短:上下文不足,LLM 拿到的資訊不完整。
常用策略:512 tokens + 10% 重疊(overlap),確保跨片段的語意不中斷。
Q3:向量資料庫有 ACID 保證嗎? #
大多數沒有完整的 ACID。pgvector 繼承 Postgres 的 ACID。Pinecone、Chroma 等的一致性保證較弱,適合搜尋場景(不需要強一致性)但不適合做主資料庫。