用 Embedding 做「相關文章」推薦
· 閱讀時間約 2 分鐘
最近幫部落格做了一個「相關文章」功能,用 AI 的語義向量(Embedding)來計算文章之間的相似度。
原文:《DIY 系列:來做個「相關文章」功能》
原理
三個步驟:
-
把文章餵給 Embedding 模型,得到一組向量(一串浮點數)。這組向量代表文章的「語意」,語意越接近的文章,向量在空間中的距離也越近。
-
計算餘弦相似度,也就是兩個向量之間的夾角,越接近 1 代表越相似。
-
排序取前 K 名,就是「相關文章」了。
兩種 Embedding 方案
方案一:Gemini API(免費)
到 Google AI Studio 申請 API Key,呼叫 gemini-embedding-001 模型。
免費方案有速率限制,我的做法是每篇截取前 2000 字,每隔兩秒呼叫一次。
方案二:BGE-M3 本地端(也免費)
用 Ollama 在本機跑 BGE-M3,CPU 就能跑,完全離線。
ollama pull bge-m3
pip install ollama
import ollama
res = ollama.embeddings(model="bge-m3", prompt="文章內容...")
vector = res["embedding"]
快取機制
每次重新計算 Embedding 很耗時,所以用 Hash(標題 + 內文) 來判斷文章是否有改變,沒變就直接讀快取。
相似度計算目前是全部重跑(讓新舊文章可以互相連結),一百多篇大概三秒,還可以接受。
完整流程
- 載入快取,用 Hash 比對找出需要更新的文章。
- 清除已刪除文章的舊快取。
- 對需要更新的文章重新 Embedding,存入快取。
- 計算所有文章兩兩之間的相似度,排序取前 K 名。
- 輸出
related.json或直接生成靜態 HTML。