嵌入入门 – 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 引擎示例

本指南使用美国社会保障医疗保险 FAQ 数据集构建了一个简单的 FAQ 检索系统。工作流包括三个步骤:

  1. 使用 Hugging Face Inference API 对 FAQ 问题进行嵌入。
  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,突出 Sentence Transformers 与 GPT‑3 嵌入的比较。
  • sbert.net 上的 官方文档
  • Research threads 关于近期嵌入进展的研究讨论(例如 Nima Boscarino 的 Twitter 线程)。

训练与高级技术

当你对推理已经熟悉后,可以探索:

  • 微调嵌入模型(train-sentence-transformers)。
  • Reranker(交叉编码器)训练(train-reranker)。
  • 稀疏嵌入模型,如 SPLADE(train-sparse-encoder)。
  • 文本、图像、音频和视频的多模态嵌入(multimodal-sentence-transformers)。
  • Matryoshka 嵌入,能够在最小损失下进行维度压缩。
  • 针对 CPU 优化的静态嵌入(static-embeddings)。
  • 量化方法,以减小存储并加速检索。

这些扩展能够实现更高的准确率、更低的延迟以及成本效益更高的生产级语义搜索系统部署。


本教程附带了一个 Colab 笔记本,复现了所有步骤。

SUMMARY: Hugging Face 宣布了一份逐步指南,介绍如何使用 Sentence‑Transformers 库和 Hugging Face Hub 创建、托管和查询向量嵌入,演示了一个可搜索的 FAQ 系统。

TITLE: 嵌入入门 – Hugging Face 教程

Sources