进阶 11 分钟Embeddings

Sentence Transformers : 向量嵌入 本地

直接回答

Sentence Transformers 是一个 Python 库,可从 Hugging Face 加载嵌入模型,并通过 model.encode 将文本转换为向量,支持在 CPU 或 GPU 上运行;model.similarity 可随后比较这些向量。对于法语,建议使用多语言模型:英语模型如 all-MiniLM-L6-v2 效果不佳。请确保文本段落长度不超过模型的最大长度,否则超出部分将被截断且无任何提示。

本指南介绍如何安装该库、对语料库进行编码、选择能理解法语的模型、避免静默错误(长度限制、查询前缀、混用两个模型),以及加快您自己机器上的索引构建。它还将 Sentence Transformers 与 Ollama 的嵌入 API 进行比较,帮助您决定使用哪一个。

作者: Mohamed Meguedmi·更新于 2026-09-30·已在 Windows、macOS 和 Linux 上测试

#什么是embedding,以及该库的作用

嵌入模型将文本转换为一组数字,也就是一个向量,使语义相近的两段文本具有相近的向量。Sentence Transformers 文档将这类模型称为双编码器:它们为文本计算固定大小的表示,嵌入计算通常高效,相似度计算则非常快速。这是 RAG 的基础组件:对问题进行编码,查找向量最相近的段落,再将这些段落提供给语言模型。需要记住两个要点:用于编码文档的模型必须与用于编码问题的模型相同,而模型对“相近”的理解来自其训练。主要使用英语数据训练的模型,对法语的判断不太可靠。

官方文档中的第一个示例
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
    "The weather is lovely today.",
    "It's so sunny outside!",
    "He drove to the stadium.",
]
embeddings = model.encode(sentences)
print(embeddings.shape)  # [3, 384]
similarities = model.similarity(embeddings, embeddings)

该模型生成 384 维向量,可作为入门示例,但它是为英语设计的:对于法语语料库,请按下方说明替换它。库会自动将模型放到最佳可用设备(cuda、mps 或 cpu)上,您也可以通过 device 参数强制指定设备。

#安装与法语语料库编码

本地 RAG 工具包

你的文档,你的 AI:基于你的 PDF、笔记和邮件的可靠本地 RAG——无需向云端发送任何内容。

  • 在线空间,终身可用
  • PDF + 文件
  • 30 天内退款
  1. 01
    安装库
    在Python环境中执行 pip install -U sentence-transformers。PyPI显示,版本6.1.0发布于2026年9月18日,要求Python 3.10或更高版本。
  2. 02
    选择多语言模型
    请选择标明支持多语言的模型(参见下表),不要选择针对英语训练的 all-* 模型。
  3. 03
    批量文档编码
    将文本列表传递给encode:库会批量处理,比逐个文本调用更高效地利用硬件资源。
  4. 04
    使用相同模型编码问题
    使用与文档相同的模型和前缀,然后用 similarity 进行比较。
  5. 05
    将模型名称与索引一同保存
    请将模型名称记录在元数据中:如果更换模型,就需要重新编码整个语料库。
使用多语言模型进行语义搜索
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("intfloat/multilingual-e5-large")

docs = [
    "Le contrat peut être résilié avec un préavis de trois mois.",
    "La facture est payable à trente jours fin de mois.",
]
question = "Quel est le délai pour mettre fin au contrat ?"

doc_emb = model.encode(docs, prompt="passage: ", normalize_embeddings=True)
q_emb = model.encode(question, prompt="query: ", normalize_embeddings=True)
print(model.similarity(q_emb, doc_emb))

Sentence Transformers 文档为该模型列出的前缀是:问题使用 query:,文档使用 passage:。不添加相应前缀时,检索效果会下降,而且不会出现错误提示。encode 的 prompt 参数会为每段文本添加该前缀。

#选择支持法语的模型

文档中推荐了原始模型,并建议参考 MTEB 排名作为灵感来源,但有两个注意事项:一是过滤掉超出您设备能力的过大模型,二是进行实验,因为排名靠前的模型未必能在您的具体任务上表现良好。下表列出了文档中提到的模型信息。

Sentence Transformers文档中提及的模型
模型文档中所述内容用于法语
all-MiniLM-L6-v2速度约为 all-mpnet-base-v2 的 5 倍,质量良好;384 维,最多 256 个 token否:以英文为主
all-mpnet-base-v2all-* 系列中质量最优,通用型模型否:以英文为主
multi-qa-mpnet-base-cos-v1在2.15亿个问题-答案对上进行语义搜索训练否:以英文为主
paraphrase-multilingual-MiniLM-L12-v2使用涵盖 50 多种语言的平行语料进行训练是的,专为句子相似度设计
paraphrase-multilingual-mpnet-base-v2同一家族,支持超过 50 种语言是的,但更耗资源
distiluse-base-multilingual-cased-v1支持 15 种语言,包括法语是,语言支持有限
multilingual-e5-large要求使用 query: 和 passage: 前缀(如文档中所指示)是的,支持多语言检索
i
句子相似度与文档检索不是同一项任务
经过识别同义改写训练的模型,不一定是检索能够回答问题的段落时的最佳选择。对于 RAG,应优先选择针对检索任务训练的模型。我们关于法语嵌入模型和 BGE-M3 的指南对候选模型进行了比较。

#那些破坏语料库却不会触发错误提示的错误

用英语模型处理法语文本
一切都能正常运行,检索结果却仍然失真。这是最常见的错误。
超过模型长度限制的段落
文档明确指出,超过长度限制的文本会被截断,只保留开头的 max_seq_length 个 token:每个长段落的末尾都将无法被模型看到。
文档与问题使用不同模型
这些向量已不再表示相同的内容,因而产生异常结果;这类问题通常是只更新处理链中的一部分所造成的。
遗漏的前缀
部分模型在提问和文档输入时需要不同的前缀;若省略该前缀,将导致检索效果下降。
未归一化的向量搭配不合适的评分方式
若模型要求余弦相似度,请对向量进行归一化或使用对应度量,否则排序效果会下降。

#测量相似度:归一化与余弦

两个向量通过相似度度量进行比较,最常用的是余弦相似度。Ollama 的文档指出,其接口返回归一化的向量,并建议在大多数语义搜索中使用余弦相似度。对于归一化的向量,余弦相似度和点积会给出相同的排序,因此可以使用针对点积优化的索引。需要注意的是一致性:向量数据库采用的度量方式必须与模型预期的度量方式一致,模型说明中会注明这一信息。

关于文本长度,文档给出了一个大致参考:许多 BERT 类模型的上限为 512 个 token,相当于 300 至 400 个英文单词,而 all-MiniLM-L6-v2 的上限为 256 个 token。法语每个词所需的 token 更多:请将文本切分为长度低于上限的片段,并留出余量,同时检查 model.max_seq_length。您可以降低该值,但不能将其提高到模型支持的上限之外。文档还指出,用短文本训练的模型对长文本的表示效果较差。

#在本地机器上快速索引

处理器或 GPU
模型在当前可用的最佳设备上运行。GPU 能加快批量索引的构建速度,但对单次查询影响不大。
精度降低
根据文档说明,在 GPU 上改用 float16 或 bfloat16 可以加速推理,同时只带来很小的精度损失。
ONNX和OpenVINO后端
文档提到,根据硬件和后端不同,可能实现高达2到3倍的加速;请在您的设备上进行测试。
多个GPU或进程
encode 接受设备列表:这对大型语料库很有用,但对小型语料库的帮助较小,因为存在启动开销。
更紧凑的向量表示
向量的二值量化或整数量化,以及维度可截断的模型,可以减少存储需求和检索成本。
缓存与索引
无需重新编码未更改的文档:缓存键基于内容,而非文件名。在同时运行语言模型的机器上,当无人使用时应进行索引。

#向量索引的大小是多少

索引大小的计算方法是将向量数量乘以向量维度;如果数值采用 float32 格式,再乘以 4 字节。一个 384 维向量占用 1 536 字节,因此一百万个文本片段对应的向量约占 1.5 GB。维度为 1 024 时,同样一百万个文本片段对应的向量约占 4 GB。这些数值不包括向量数据库的元数据和索引结构。因此,模型的选择直接影响检索所需的内存,而前文提到的向量量化可以减少这部分内存占用。

#Sentence Transformers 或 Ollama 的嵌入API

Ollama 也提供了嵌入向量:文档指出,ollama run peut 命令会生成向量,且 api/embed 接口返回 L2 归一化的向量。文档推荐使用 embeddinggemma、qwen3-embedding 和 all-minilm 模型,其向量维度通常为 384 到 1024 维,同时提醒两条规则:大多数情况下使用余弦相似度,以及索引和查询时应使用相同模型。

生成嵌入向量该选哪个工具?
标准Sentence TransformersOllama的嵌入API
安装需安装的Python库若已使用 Ollama,则已具备该功能
模型选择来自 Hugging Face 的任意兼容模型来自 Ollama 库的模型
前缀和长度控制精细控制:prompt、max_seq_length、命名提示词根据模型和调用情况而定
训练或微调是的,该库已支持否
典型应用场景批量索引、实验、重排序可轻松集成到已基于 Ollama 构建的流程中

#嵌入向量仅作为初步筛选

Sentence Transformers 的文档将双编码器描述为两阶段检索的第一步,其中交叉编码器(或重排序器)用于重新排序最相关的结果。交叉编码器会同时读取问题和每个文档段落,虽然速度较慢,但在少量候选文档上更为精确。通过相似度筛选约二十个文档段落,再进行重排序以保留少数结果,是 RAG 流程中成本最低的优化之一。专门针对重排序器的指南详细说明了其部署方法;在决定保留前,请先在二十个问题上评估其性能提升,因为该方法会为每次查询增加延迟、需要维护第二个模型以及带来额外的内存消耗。

在比较模型之前,先看看语料库中有什么内容是个好习惯:是简短且独立成意的句子,还是较长的技术段落?问题是以关键词形式提出的,还是用完整句子表达的?答案会帮助您选择长度上限、切分方式和模型。内容密集的法律语料与简短问答库所需的设置并不相同,任何公开排名都无法替您判断这一点。

#在索引前评估模型选择

  1. 01
    编写二十个真实问题
    请使用用户可能提出的真实问题,使用他们自己的表达方式,而非文档中的表述。
  2. 02
    记录预期的文本段落
    针对每个问题,找出包含答案的一个或多个片段。
  3. 03
    比较两个或三个模型
    使用每个模型对同一语料库进行编码,并检查正确段落是否出现在前五个结果中。
  4. 04
    每次变更都重新运行
    修改模型、切分方式或前缀后,请在重新索引前重新运行这个小测试。

#FAQ

FAQ
运行 Sentence Transformers 是否需要 GPU?+
否。嵌入模型体积较小,可在CPU上运行,库会自动选择最佳可用设备。GPU主要用于加速大规模语料库的索引;对于单个问题的编码,大多数情况下性能差异不大。
在法语场景下应选择哪个 Sentence Transformers 模型?+
选择多语言模型:文档提到 paraphrase-multilingual-MiniLM-L12-v2 支持超过 50 种语言,以及配合 query: 和 passage: 前缀使用的 multilingual-e5-large。用您自己的问题测试两三个候选模型,而不要只依赖 MTEB 排名;文档提醒,该排名无法预测您的实际结果。
可以用自己的对话模型进行编码吗?+
不能。嵌入模型经过训练,会将语义相近的文本映射到彼此接近的位置;对话模型没有接受这种训练,因此即使代码看似正常运行、没有报错,检索效果也会很差。请使用专门的嵌入模型,并将其与撰写回答的模型区分开。
如果更换嵌入模型会怎样?+
必须重新编码整个语料库,因为两个模型的向量不可直接比较:它们的维度和坐标不同。请在记录索引时一并记录模型名称,并预留计算时间,在切换前重建向量数据库,同时在整个操作期间保持旧索引运行。
如果我的文本超过最大长度会怎样?+
文本会被截断,只保留开头的 max_seq_length 个 token,且不会报错:检索会忽略片段末尾的内容。使用 all-MiniLM-L6-v2 时,上限为 256 个 token。请将文本切分为短于模型长度上限的片段,并留出余量。
生成嵌入向量:选 Sentence Transformers 还是 Ollama?+
Sentence Transformers 提供更高的控制力(前缀、长度、Hugging Face 模型、训练)。如果您的工作流已基于 Ollama,则 Ollama 的 API 更为简单。在这两种情况下,索引和查询都应使用相同的模型,并采用该模型推荐的相似度度量方法。

#深入了解

这份指南对您有帮助吗?

有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。