2026-09-16 11 min read -- 次瀏覽
Embedding 與向量資料庫:語義搜尋從零開始
把文字變成空間座標,用 Chroma 三個函式做出真正的語義搜尋與 RAG 地基。
📌 本篇文章重點
- Embedding 把「意思」變成向量:意思相近的文字,向量距離就短。
- 向量資料庫用「相似度」找最相關的資料,是 RAG 的地基。
- 漢字選 embedding 模型比選向量庫更影響效果。
- 小型專案用本機向量庫(Chroma)就夠,別急著上大系統。
一、為什麼這篇值得看?
搜尋「貓咪」你的系統該不該回「養貓指南」?關鍵字做不到,但「語義」做得到。理解 embedding 與向量資料庫,你才真正看懂 RAG、推薦、去重與語義搜尋這些進階玩法。
二、核心概念,3 分鐘搞懂
- Embedding:把一段文字變成一個數字向量(如 512 或 1024 維)。「消防員」與「滅火員」的向量距離近,「消防員」與「披薩」就遠。
- 向量資料庫:專門儲存向量+做「相似度查詢」的資料庫,核心是 ANN 索引(如 HNSW)。
💡 直覺
embedding 模型是「翻譯官」:把語言翻成空間座標。向量庫是「地圖 APP」:快速告訴你跟哪個點最近。
三、動手實作:3 步做語義搜尋
Step 1
建立嵌入(本機免費)
Bash
ollama pull nomic-embed-text
pip install chromadb
Step 2
寫入向量庫
Python
import chromadb
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="x")
MODEL = "nomic-embed-text"
db = chromadb.Client()
col = db.create_collection("faq")
docs = {
"d1": "AI 不會自己補資料,最好先做 RAG。",
"d2": "向量資料庫有 Chroma、pgvector、Qdrant。",
"d3": "今天的天氣很好,適合打球。",
}
for i, (k, v) in enumerate(docs.items()):
r = client.embeddings.create(model=MODEL, input=v)
col.add(ids=[k], embeddings=[r.data[0].embedding], documents=[v])
Step 3
語義查詢
Python
q = "我想讓 AI 記住我的文件"
qr = client.embeddings.create(model=MODEL, input=q)
hits = col.query(query_embeddings=[qr.data[0].embedding], n_results=2)
for doc, dist in zip(hits["documents"][0], hits["distances"][0]):
print(f"[{dist:.3f}] {doc}")
# 距離近的會是 d1(RAG 相關),d4(天氣)會被排到最後
💡 驗證口訣
先問「最相近的三筆是我想的嗎?」。若否,先換 embedding 模型/加前處理,別急著換資料庫。
四、向量庫選擇表
| 方案 | 部署 | 適合規模 |
|---|---|---|
| Chroma | 本機/嵌入 | 原型、小型專案 |
| pgvector | PostgreSQL 外掛 | 已有 Postgres 的專案 |
| Qdrant | 本機/容器 | 中型、要 HA |
| Milvus | 分散式 | 大規模檢索 |
五、常見問題(FAQ)
Q1維度越多越準嗎?
不一定。維度是訓練決定的,不是你調的。混搭的關鍵是「embedding 模型與資料語域契合」。
Q2一定要選跟 OpenAI 一樣的向量模型嗎?
不用,但「寫入」與「查詢」必須用同一個模型,否則座標系統對不上。
Q3資料更新了怎麼處理?
向量庫支援 upsert:用同一筆 id 覆寫即可。定期重建索引也可但不能配合頻繁更新。
總結
記憶住兩件事:embedding 決定「懂不懂意思」,從向量庫負責「找得快不快」。小專案先接地氣用 Chroma 跑通再升級,你會發現語義搜尋沒比關鍵字難多少。