2026-09-16 11 min read -- 次瀏覽

Embedding 與向量資料庫:語義搜尋從零開始

把文字變成空間座標,用 Chroma 三個函式做出真正的語義搜尋與 RAG 地基。

資料工程 Embedding向量庫RAG 問小墨這篇的內容
Embedding 與向量資料庫示意
Embedding:把文字變成「有空間關係」的數字。

📌 本篇文章重點

  • 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本機/嵌入原型、小型專案
pgvectorPostgreSQL 外掛已有 Postgres 的專案
Qdrant本機/容器中型、要 HA
Milvus分散式大規模檢索

五、常見問題(FAQ)

Q1維度越多越準嗎?

不一定。維度是訓練決定的,不是你調的。混搭的關鍵是「embedding 模型與資料語域契合」。

Q2一定要選跟 OpenAI 一樣的向量模型嗎?

不用,但「寫入」與「查詢」必須用同一個模型,否則座標系統對不上。

Q3資料更新了怎麼處理?

向量庫支援 upsert:用同一筆 id 覆寫即可。定期重建索引也可但不能配合頻繁更新。

總結

記憶住兩件事:embedding 決定「懂不懂意思」,從向量庫負責「找得快不快」。小專案先接地氣用 Chroma 跑通再升級,你會發現語義搜尋沒比關鍵字難多少。

問小墨 AI