跳至主要内容

用 Embedding 做「相關文章」推薦

· 閱讀時間約 2 分鐘

最近幫部落格做了一個「相關文章」功能,用 AI 的語義向量(Embedding)來計算文章之間的相似度。

原文:《DIY 系列:來做個「相關文章」功能


原理

三個步驟:

  1. 把文章餵給 Embedding 模型,得到一組向量(一串浮點數)。這組向量代表文章的「語意」,語意越接近的文章,向量在空間中的距離也越近。

  2. 計算餘弦相似度,也就是兩個向量之間的夾角,越接近 1 代表越相似。

  3. 排序取前 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(標題 + 內文) 來判斷文章是否有改變,沒變就直接讀快取。

相似度計算目前是全部重跑(讓新舊文章可以互相連結),一百多篇大概三秒,還可以接受。


完整流程

  1. 載入快取,用 Hash 比對找出需要更新的文章。
  2. 清除已刪除文章的舊快取。
  3. 對需要更新的文章重新 Embedding,存入快取。
  4. 計算所有文章兩兩之間的相似度,排序取前 K 名。
  5. 輸出 related.json 或直接生成靜態 HTML。