快轉到主要內容
  1. AI/

Embedding 是什麼|語意搜尋與向量資料庫的基礎

Idle Engineer
作者
Idle Engineer
AI Runs. I Nap. | 404 Career Not Found
目錄

TL;DR | 面試情境模擬
#

👴 面試官:Embedding 是什麼?在 AI 系統裡有什麼用途?

🧑‍💻 :Embedding 是把文字(或圖片、音訊)轉換成固定長度的數字向量,讓語意相近的內容在向量空間裡距離也近。應用場景:語意搜尋(搜「跑步鞋」能找到「運動鞋」)、RAG(找到和問題最相關的文件片段)、推薦系統(找到相似的商品或內容)、分類(不需要標籤,靠向量距離聚類)。


比喻:把文字放到地圖上
#

想像你有一張巨大的語意地圖,每個詞或句子都是地圖上的一個點:

  • 「貓」和「狗」靠得很近(都是寵物)
  • 「銀行」(金融機構)和「銀行」(河岸)是不同的點
  • 「跑步」和「慢跑」幾乎重疊

Embedding 就是把文字放到這張地圖上,讓「距離」等於「語意差距」。


向量長度和維度
#

"Hello"  →  [0.23, -0.71, 0.15, 0.88, ..., -0.42]
              ←────────── 1536 維 ──────────────→

"Hi"     →  [0.25, -0.69, 0.18, 0.85, ..., -0.39]
             (和 "Hello" 非常接近)

"資料庫"  →  [0.91, 0.12, -0.55, 0.03, ..., 0.77]
             (和 "Hello" 很遠)

維度越高,表達能力越強,但計算和儲存成本也越高。OpenAI text-embedding-3-small 是 1536 維,large 是 3072 維。


相似度計算
#

向量之間的「距離」常用:

方法 說明 適用
Cosine Similarity 計算向量夾角,值域 -1 到 1 最常用,不受長度影響
Dot Product 向量內積 適合已正規化的向量
Euclidean Distance 歐氏距離 適合需要考慮絕對距離
from numpy import dot
from numpy.linalg import norm

def cosine_similarity(a, b):
    return dot(a, b) / (norm(a) * norm(b))

# 1.0 = 完全相同,0 = 無關,-1 = 相反

RAG 中的 Embedding 流程
#

準備階段(建索引):
  文件 → 切片(Chunking)→ Embedding → 存入向量資料庫

查詢階段(搜尋):
  使用者問題 → Embedding → 向量相似度搜尋 → 取前 K 個相關片段
                                              組合成 Context 給 LLM
                                                  LLM 生成回答

常用 Embedding 模型
#

模型 來源 維度 特點
text-embedding-3-small OpenAI 1536 便宜,夠用
text-embedding-3-large OpenAI 3072 品質更高
embed-english-v3.0 Cohere 1024 多語言強
bge-m3 BAAI 1024 開源,支援中文
nomic-embed-text Nomic 768 開源,本地跑

💡 延伸問題
#

Q1:Embedding 和 Fine-tuning 有什麼關係?
#

Fine-tuning 訓練整個模型的權重,包含模型內部的 embedding 表示。通用 Embedding 模型拿來直接用不需要訓練。如果你的領域非常特殊(法律、醫療),可以 Fine-tune 一個 Embedding 模型讓它更懂你的語言。

Q2:Chunking 策略為什麼重要?
#

把文件切成太長的片段,相關內容可能被稀釋;切太短,上下文不夠完整。常見策略:固定長度(512 tokens)、按段落切、按語意切(用 LLM 判斷邊界)。

Q3:多語言 Embedding 怎麼做?
#

訓練過多語言資料的模型(如 Cohere multilingual、bge-m3)可以讓中英文的相似內容有接近的向量,實現跨語言搜尋(中文問句找到英文文件)。