開始使用嵌入 – 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 檢索系統。工作流程包含三個步驟:

  1. 將 FAQ 問題嵌入,使用 Hugging Face Inference API。
  2. 將嵌入矩陣上傳至 Hugging Face Hub 以免費託管。
  3. 查詢嵌入,找出與使用者問題語意最相似的 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