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)可以讓中英文的相似內容有接近的向量,實現跨語言搜尋(中文問句找到英文文件)。