開始使用嵌入 – Hugging Face 教程
TL;DR
Hugging Face 發布了一個實用的教學,展示如何使用 sentence-transformers/all-MiniLM-L6-v2 模型透過 Inference API 產生文字嵌入,將產生的向量免費託管於 Hub,並執行語意搜尋以取得最相關的 FAQ 條目。
了解嵌入
嵌入是一種密集的數值向量,能捕捉文字、圖像或音訊等資料的語意。舉例來說,句子 "What is the main benefit of voting?" 可以表示為一個 384 維的向量,例如 [0.84, 0.42, …, 0.02]。由於向量編碼了語意,向量之間的距離(例如餘弦相似度)揭示了兩筆資訊的相似程度。
嵌入不限於文字;圖像嵌入可以與文字嵌入比較,以實現跨模態搜尋與分類。開源的 Sentence Transformers 函式庫提供最先進的模型,免費產生此類嵌入。
嵌入的應用
「一旦你了解這個機器學習多功能工具(嵌入),就能構建從搜尋引擎、推薦系統、聊天機器人到更多其他應用。你不必是具備機器學習專業知識的資料科學家,也不需要龐大的標記資料集。」– Dale Markowitz, Google Cloud
主要產品依賴嵌入:Google Search 進行文字對文字與文字對圖像的匹配,Snapchat 使用嵌入進行廣告排序,Meta 則利用嵌入進行社交搜尋。將資料集嵌入可將原始內容轉換為可搜尋的向量空間,但這過程在技術上可能相當挑戰且成本高昂。本教學展示了一個輕量、開源的工作流程,避免了這些障礙。
端到端 FAQ 引擎範例
本指南使用美國社會安全署 Medicare FAQ 資料集構建一個簡易的 FAQ 檢索系統。工作流程包含三個步驟:
- 將 FAQ 問題嵌入,使用 Hugging Face Inference API。
- 將嵌入矩陣上傳至 Hugging Face Hub 以免費託管。
- 查詢嵌入,找出與使用者問題語意最相似的 FAQ。
1. 為資料集產生嵌入
模型選擇
本教學選擇 sentence-transformers/all-MiniLM-L6-v2,這是 Sentence Transformers 函式庫中既小巧又強大的模型。
model_id = "sentence-transformers/all-MiniLM-L6-v2"
驗證
在 Hugging Face 帳號設定中建立寫入權杖,並將其存入 hf_token。
hf_token = "<your token>"
API 呼叫
使用 feature‑extraction 端點取得嵌入。首次請求可能需要約 20 秒,因為模型會在伺服器上下載;之後的呼叫則很快。
import requests
api_url = f"https://api-inference.huggingface.co/pipeline/feature-extraction/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}
def query(texts):
response = requests.post(
api_url,
headers=headers,
json={"inputs": texts, "options": {"wait_for_model": True}}
)
return response.json()
範例輸入
texts = [
"How do I get a replacement Medicare card?",
"What is the monthly premium for Medicare Part B?",
# … (additional 11 questions) …
]
output = query(texts)
API 會回傳每個問題對應的 384 維向量列表。將其轉換為 Pandas DataFrame 後得到形狀為 (13, 384) 的矩陣。
import pandas as pd
embeddings = pd.DataFrame(output)
2. 在 Hugging Face Hub 免費託管嵌入
datasets 函式庫讓你分享包含嵌入的 CSV 檔案。匯出後:
embeddings.to_csv("embeddings.csv", index=False)
透過 Hub UI(New dataset → upload file)或 CLI 上傳 embeddings.csv。產生的資料庫,例如 datasets/ITESM/embedded_faqs_medicare,可使用單一指令載入:
from datasets import load_dataset
faqs = load_dataset("ITESM/embedded_faqs_medicare")
3. 為查詢檢索最相似的 FAQ
載入嵌入為張量
import torch
faqs_embeddings = load_dataset('ITESM/embedded_faqs_medicare')
corpus = torch.from_numpy(
faqs_embeddings["train"].to_pandas().to_numpy()
).float()
將使用者查詢嵌入
question = ["How can Medicare help me?"]
query_vec = torch.FloatTensor(query(question))
語意搜尋
semantic_search 工具來自 Sentence Transformers,計算餘弦相似度並回傳前 k 個最接近的向量。
from sentence_transformers.util import semantic_search
hits = semantic_search(query_vec, corpus, top_k=5)
範例輸出:
[{'corpus_id': 8, 'score': 0.7565},
{'corpus_id': 7, 'score': 0.7419},
{'corpus_id': 3, 'score': 0.7253},
{'corpus_id': 9, 'score': 0.6736},
{'corpus_id': 10, 'score': 0.6505}]
將 corpus_id 映射回原始 texts 列表,即可得到五個最相關的 FAQ:
print([texts[h['corpus_id']] for h in hits[0]])
結果:
- 我該如何獲得 Medicare A 與 B 部分保費的協助?
- 什麼是 Medicare,誰可以申請?
- 我該如何註冊 Medicare?
- Medicare 有哪些不同的部分?
- 因為收入較高,我的 Medicare 保費會更高嗎?
相同的工作流程可套用於其他領域、更大的語料庫或多模態資料。
其他學習資源
- Sentence Transformers Hub – 模型集合與使用說明。
- Comparative tweet by Nils Reimers highlighting Sentence Transformers vs. GPT‑3 embeddings – Nils Reimers 的比較推文,突顯 Sentence Transformers 與 GPT‑3 嵌入的差異。
- Official documentation at
sbert.net– 官方文件位於sbert.net。 - Research threads on recent embedding advances (e.g., Nima Boscarino’s Twitter thread) – 關於近期嵌入技術進展的研究討論串(例如 Nima Boscarino 的 Twitter 討論串)。
訓練與進階技術
當你對推論已熟悉時,可探索:
- 微調嵌入模型(
train-sentence-transformers)。 - 重新排序器(cross‑encoder)訓練(
train-reranker)。 - 如 SPLADE 的稀疏嵌入模型(
train-sparse-encoder)。 - 用於文字、圖像、音訊與影片的多模態嵌入(
multimodal-sentence-transformers)。 - Matryoshka 嵌入,可在最小損失下進行維度縮減。
- 為 CPU 優化的靜態嵌入(
static-embeddings)。 - 量化方法以縮減儲存空間並加速檢索。
這些擴充功能可提升準確度、降低延遲,並以具成本效益的方式部署生產級語意搜尋系統。
本教學附有 Colab 筆記本,重現每一步驟。
Sources
- OriginalGetting Started With Embeddings