是的,可以使用 Hugging Face Transformers API 直接使用 Sentence Transformer 模型,而无需使用 Sentence Transformers 库。Sentence Transformers 构建在 Transformers 库之上,通常将 BERT 等预训练模型与池化层相结合,以生成句子嵌入。虽然 Sentence Transformers 库通过抽象简化了这个过程,但您可以使用较低级别的 Transformers 组件来复制相同的功能。这包括手动处理分词、模型推理和池化操作,以从原始文本输入生成嵌入。
为了实现这一点,您首先需要使用 Hugging Face 的 AutoModel
和 AutoTokenizer
类加载一个预训练模型(例如,bert-base-uncased
)。分词将文本转换为输入 ID 和 attention mask,这些 ID 和 mask 被传递给模型以生成 token 级别的嵌入。关键步骤是应用一种池化策略(例如,平均池化)来将 token 嵌入聚合为固定长度的句子向量。例如,在获得模型的输出后,您可以平均整个 token 序列中的嵌入(使用 attention mask 排除填充 token)。这复制了许多 Sentence Transformer 模型的默认行为,这些模型在底层使用平均池化。此外,一些模型需要对输出向量进行归一化,这可以使用 NumPy 或 PyTorch 等库手动完成。
但是,存在一些权衡。Sentence Transformers 库抽象出样板代码,处理模型特定的细微差别(例如,最大序列长度),并确保与预训练的检查点架构兼容。直接使用 Transformers 时,您必须复制这些细节。例如,如果 Sentence Transformer 模型是使用特定的池化方法(如 CLS token 池化或最大池化)训练的,则需要显式地实现该逻辑。代码维护也会变得更加复杂,因为对 Transformers API 的更新可能需要进行调整。尽管如此,这种方法适用于喜欢最小依赖项或需要细粒度控制的开发人员。例如,您可以通过 AutoModel
加载 all-MiniLM-L6-v2
模型检查点,应用平均池化,并对输出进行归一化,以匹配 Sentence Transformers 库生成的嵌入。