Skip to content

计划用一个系列详细讲一下Hugging Face生态。深入了解Hugging Face生态对AI项目开发来说是非常重要的。

首先从核心库讲起。在当前大模型技术中,Hugging Face 的 transformers 库可以说是事实上的“行业标准”。它作为大模型的“通用操作系统”(OS),为开发者提供了一套标准化的接口来加载、训练和使用数以万计的模型。然而,仅有“操作系统”是不够的,我们还需要针对特定任务的“专业应用套件”。sentence-transformers 便是其中最耀眼的明星之一,它在语义表示和检索领域扮演了“瑞士军刀”的角色。

本文旨在深入剖析这两个核心库,阐明它们各自的依赖关系与工作流程,同时将它们置于更宏大的 AI 软件栈 中,厘清它们与 vLLMSGLang 等高性能推理引擎的关系。读完本文,您将能够根据任务需求,自信地选择和组合这些强大的工具。

一、 AI 软件栈中的分层与定位

要理解这些库的关系,首先需要建立一个清晰的 AI 软件栈分层概念。一个典型的 AI 应用从底层硬件到上层应用,可以粗略地分为以下几层:

  1. 硬件与驱动层:物理基础,如 NVIDIA GPU 和 CUDA 驱动。
  2. 深度学习框架层:提供核心计算能力,如 PyTorch、TensorFlow。它们负责张量运算、自动微分和硬件加速。
  3. 模型实现与枢纽层(transformers 所在层):这一层负责定义和实现各种模型架构(如 BERT, GPT, Llama)。transformers 库提供了一个统一、灵活的接口,让研究者和开发者可以轻松加载来自 Hugging Face Hub 的数万个预训练模型。 它是连接算法研究与工程应用的桥梁。
  4. 任务封装与优化层(sentence-transformers 所在层):在模型实现层之上,这一层为特定任务提供更高阶的抽象和优化。sentence-transformers 就是一个典范,它专注于将 transformers 的 token 级别输出高效地转换为高质量的句子级别向量。
  5. 高性能推理与服务层(vLLMSGLang 所在层):这一层专注于生产环境的推理性能。当模型开发和微调完成后,需要部署上线以应对高并发请求,此时 transformers 自带的 .generate 方法在吞吐量和延迟上可能成为瓶颈。vLLM 等推理引擎通过 PagedAttention、连续批处理 (Continuous Batching) 等技术,显著地提升了推理效率和吞吐量。

三者关系小结:

  • transformers vs. vLLM/SGLang
    • transformers 提供了模型定义基础的、功能完备的推理实现,非常适合研究、原型验证和快速开发。
    • vLLM 和 SGLang 则是高性能的推理运行时 (runtime)。它们通常会加载transformers 定义的模型和权重,但用自己高度优化的内核来执行推理过程。值得一提的是,vLLM 自身支持两种运行模式:其原生后端用于最高性能;当模型不受原生后端直接支持时,也可通过设置 model_impl="transformers"回落到 Hugging Face 的实现。在生产环境中,开发者通常通过其 Python API (vllm.LLM) 或一个 OpenAI 兼容的 HTTP 服务来接入 vLLM。简单来说,你可以用 transformers 开发调试,然后用 vLLM 部署上线。
  • transformers vs. sentence-transformers
    • sentence-transformers 是 transformers 的下游库上层封装。它的底层必须依赖 transformers 来加载模型,但它在上层提供了专门针对语义相似度任务优化的模型结构和训练方法。

二、 transformers 库解构:大模型的“通用操作系统”

transformers 库的成功,很大程度上源于其“薄核心 + 可选依赖”的设计哲学。

  • 核心运行时依赖
    • numpy:科学计算的基础。
    • huggingface-hub:负责与 Hugging Face Hub 交互,下载和缓存模型、分词器等文件。
    • tokenizers:由 Hugging Face 开发的、基于 Rust 的高性能分词库。
    • safetensors:一种更安全、更快速的模型权重存储格式。
    • 其他工具库:如 filelock (处理并发缓存)、requests (网络请求)、tqdm (进度条) 等。
  • 可选/按需依赖
    • 深度学习后端torchtensorflow, 或 flax,你至少需要安装其中一个才能运行模型。
    • 特定分词器:如 sentencepiece,用于 T5、LLaMA 等模型。
    • 任务域相关:如 accelerate (简化分布式训练)、datasets (数据加载)、librosa (音频处理) 等。

典型工作流 (以推理为例)

transformers 将复杂的推理过程抽象为几个简单的步骤,最核心的是 pipeline 函数和 Auto* 类。

from transformers import pipeline

# 1. 使用 pipeline 一键完成任务
generator = pipeline("text-generation", model="Qwen/Qwen2-1.5B-Instruct")
result = generator("你好,请介绍一下你自己。")
print(result)

# --- pipeline 内部的分解动作 ---
from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "Qwen/Qwen2-1.5B-Instruct"

# 2. 加载分词器 (Tokenizer)
# 负责将文本字符串转换为模型可以理解的数字 ID
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 3. 加载模型 (Model)
# 下载并构建模型结构,加载预训练权重
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")

# 4. 准备输入并推理
prompt = "你好,请介绍一下你自己。"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=50)

# 5. 解码输出
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

这个流程清晰地展示了 transformers 作为“操作系统”的角色:它定义了加载应用(模型)、处理输入(分词)、执行(推理)、返回输出(解码)的标准流程。

三、 sentence-transformers 库解构:语义表示的“瑞士军刀”

当你的任务从通用的文本生成转向语义理解和比较时,例如构建语义搜索引擎、文本聚类或判断句子对相似度,sentence-transformers 就派上了用场。

标准 transformers 模型(如 BERT)的直接输出是每个 token 的向量,需要一个额外的池化 (Pooling) 操作才能得到代表整个句子的向量,而这个操作的优劣直接决定了句向量的质量。sentence-transformers 的核心贡献正在于此。

核心工作流 (以生成句向量为例)

它将复杂的句向量生成过程封装成了一个极其简单的 encode 方法。

from sentence_transformers import SentenceTransformer

# 1. 加载一个在语义相似度任务上微调过的模型
model = SentenceTransformer("all-MiniLM-L6-v2", device="cuda")

sentences = [
    "今天天气真好,适合出去玩。",
    "这是一个阳光明媚的日子。",
    "我晚上想吃意大利面。"
]

# 2. 一键编码,获取高质量句向量
embeddings = model.encode(sentences)

print(embeddings.shape)
# 输出: (3, 384),表示3个句子,每个句子被编码为384维的向量

其内部流水线大致为:

  1. 加载 transformers 模型:使用底层的 AutoModel 加载 BERT、RoBERTa 等模型。
  2. 添加池化层:在模型之上添加一个经过精心设计的池化层(如 Mean Pooling),将所有 token 的输出向量聚合成一个高质量的句向量。
  3. 提供专用训练范式:它内置了多种针对检索任务优化的损失函数(如 MultipleNegativesRankingLoss),使得开发者可以方便地在自己的数据上微调,以获得特定领域内更好的语义表示能力。

除了生成高质量的句向量(也称“密集向量/句向量检索”),sentence-transformers 还将另外两种重要的检索范式作为其“一等公民”:

  • Cross-Encoder(重排器):它不生成独立的向量,而是直接接收一个 (query, document) 对,并输出一个精确的相关性分数。这使它非常适合在由向量检索召回的少量候选结果上进行“精排”。
  • SparseEncoder(稀疏编码器):用于生成稀疏向量(如 SPLADE 模型),这种向量可以直接与传统的倒排索引结合,实现高效的混合检索

四、 总结与选型指南

为了更直观地理解,我们可以用一个表格来总结:

特性transformerssentence-transformersvLLM / 高性能推理引擎
定位模型定义与枢纽,通用 OS语义表示/检索任务封装库生产级推理运行时
核心功能加载/训练/微调各种模型,基础推理密集/稀疏向量生成、重排、检索训练高吞吐量、低延迟的模型服务
典型场景学术研究、模型微调、快速原型开发语义搜索、文本聚类、RAG 流程优化线上 AI 应用、高并发 API 服务
性能功能全面,但原生推理性能非最优推理性能继承自 transformers高,显著优于原生实现

如何选择?

  • 如果你是研究者,或需要进行各种模型的微调、实验transformers 是你的不二之选。
  • 如果你的核心任务是语义搜索、文本匹配、聚类等,直接使用 sentence-transformers 会让你事半功倍。
  • 当你需要将一个大模型部署到生产环境,并追求极致的性能和吞吐量时,你应该使用 vLLM 或其他推理引擎来加载和运行你的模型

最终,这些工具共同构成了一个强大而灵活的生态系统。开发者通常会以 transformers 为起点进行模型开发和微调,根据具体任务选择是否使用 sentence-transformers 优化语义表示,最后通过 vLLM 等工具将成果高效地部署到生产环境中,服务于最终用户。

持续沉淀企业 AI 技术内容。