Sentence Transformers : 向量嵌入 本地
Sentence Transformers 是一个 Python 库,可从 Hugging Face 加载嵌入模型,并通过 model.encode 将文本转换为向量,支持在 CPU 或 GPU 上运行;model.similarity 可随后比较这些向量。对于法语,建议使用多语言模型:英语模型如 all-MiniLM-L6-v2 效果不佳。请确保文本段落长度不超过模型的最大长度,否则超出部分将被截断且无任何提示。
本指南介绍如何安装该库、对语料库进行编码、选择能理解法语的模型、避免静默错误(长度限制、查询前缀、混用两个模型),以及加快您自己机器上的索引构建。它还将 Sentence Transformers 与 Ollama 的嵌入 API 进行比较,帮助您决定使用哪一个。
#什么是embedding,以及该库的作用
嵌入模型将文本转换为一组数字,也就是一个向量,使语义相近的两段文本具有相近的向量。Sentence Transformers 文档将这类模型称为双编码器:它们为文本计算固定大小的表示,嵌入计算通常高效,相似度计算则非常快速。这是 RAG 的基础组件:对问题进行编码,查找向量最相近的段落,再将这些段落提供给语言模型。需要记住两个要点:用于编码文档的模型必须与用于编码问题的模型相同,而模型对“相近”的理解来自其训练。主要使用英语数据训练的模型,对法语的判断不太可靠。
该模型生成 384 维向量,可作为入门示例,但它是为英语设计的:对于法语语料库,请按下方说明替换它。库会自动将模型放到最佳可用设备(cuda、mps 或 cpu)上,您也可以通过 device 参数强制指定设备。
#安装与法语语料库编码
你的文档,你的 AI:基于你的 PDF、笔记和邮件的可靠本地 RAG——无需向云端发送任何内容。
- 在线空间,终身可用
- PDF + 文件
- 30 天内退款
- 01安装库在Python环境中执行 pip install -U sentence-transformers。PyPI显示,版本6.1.0发布于2026年9月18日,要求Python 3.10或更高版本。
- 02选择多语言模型请选择标明支持多语言的模型(参见下表),不要选择针对英语训练的 all-* 模型。
- 03批量文档编码将文本列表传递给encode:库会批量处理,比逐个文本调用更高效地利用硬件资源。
- 04使用相同模型编码问题使用与文档相同的模型和前缀,然后用 similarity 进行比较。
- 05将模型名称与索引一同保存请将模型名称记录在元数据中:如果更换模型,就需要重新编码整个语料库。
Sentence Transformers 文档为该模型列出的前缀是:问题使用 query:,文档使用 passage:。不添加相应前缀时,检索效果会下降,而且不会出现错误提示。encode 的 prompt 参数会为每段文本添加该前缀。
#选择支持法语的模型
文档中推荐了原始模型,并建议参考 MTEB 排名作为灵感来源,但有两个注意事项:一是过滤掉超出您设备能力的过大模型,二是进行实验,因为排名靠前的模型未必能在您的具体任务上表现良好。下表列出了文档中提到的模型信息。
| 模型 | 文档中所述内容 | 用于法语 |
|---|---|---|
| all-MiniLM-L6-v2 | 速度约为 all-mpnet-base-v2 的 5 倍,质量良好;384 维,最多 256 个 token | 否:以英文为主 |
| all-mpnet-base-v2 | all-* 系列中质量最优,通用型模型 | 否:以英文为主 |
| 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: 前缀(如文档中所指示) | 是的,支持多语言检索 |
#那些破坏语料库却不会触发错误提示的错误
- 用英语模型处理法语文本
- 一切都能正常运行,检索结果却仍然失真。这是最常见的错误。
- 超过模型长度限制的段落
- 文档明确指出,超过长度限制的文本会被截断,只保留开头的 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 Transformers | Ollama的嵌入API |
|---|---|---|
| 安装 | 需安装的Python库 | 若已使用 Ollama,则已具备该功能 |
| 模型选择 | 来自 Hugging Face 的任意兼容模型 | 来自 Ollama 库的模型 |
| 前缀和长度控制 | 精细控制:prompt、max_seq_length、命名提示词 | 根据模型和调用情况而定 |
| 训练或微调 | 是的,该库已支持 | 否 |
| 典型应用场景 | 批量索引、实验、重排序 | 可轻松集成到已基于 Ollama 构建的流程中 |
#嵌入向量仅作为初步筛选
Sentence Transformers 的文档将双编码器描述为两阶段检索的第一步,其中交叉编码器(或重排序器)用于重新排序最相关的结果。交叉编码器会同时读取问题和每个文档段落,虽然速度较慢,但在少量候选文档上更为精确。通过相似度筛选约二十个文档段落,再进行重排序以保留少数结果,是 RAG 流程中成本最低的优化之一。专门针对重排序器的指南详细说明了其部署方法;在决定保留前,请先在二十个问题上评估其性能提升,因为该方法会为每次查询增加延迟、需要维护第二个模型以及带来额外的内存消耗。
在比较模型之前,先看看语料库中有什么内容是个好习惯:是简短且独立成意的句子,还是较长的技术段落?问题是以关键词形式提出的,还是用完整句子表达的?答案会帮助您选择长度上限、切分方式和模型。内容密集的法律语料与简短问答库所需的设置并不相同,任何公开排名都无法替您判断这一点。
#在索引前评估模型选择
- 01编写二十个真实问题请使用用户可能提出的真实问题,使用他们自己的表达方式,而非文档中的表述。
- 02记录预期的文本段落针对每个问题,找出包含答案的一个或多个片段。
- 03比较两个或三个模型使用每个模型对同一语料库进行编码,并检查正确段落是否出现在前五个结果中。
- 04每次变更都重新运行修改模型、切分方式或前缀后,请在重新索引前重新运行这个小测试。
#FAQ
运行 Sentence Transformers 是否需要 GPU?+
在法语场景下应选择哪个 Sentence Transformers 模型?+
可以用自己的对话模型进行编码吗?+
如果更换嵌入模型会怎样?+
如果我的文本超过最大长度会怎样?+
生成嵌入向量:选 Sentence Transformers 还是 Ollama?+
#深入了解
- 来源:Sentence Transformers,快速入门
- 来源:Sentence Transformers,嵌入计算
- 来源:Sentence Transformers,预训练模型
- 来源:Ollama,嵌入向量
有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。