文本嵌入详解:工作原理 [+示例]
本指南介绍什么是文本嵌入、它们如何将文本转换为捕捉含义的向量,以及如何选择和评估嵌入模型,并将其应用于搜索、RAG 和其他实际用例。

如果你已经了解文本嵌入的基本概念,却不知道如何实际运用,那么你来对地方了。我们将剖析向量、分词和相似度计算,深入探究嵌入模型的评估方法,并为你展示真实的应用案例。
什么是文本嵌入?
文本嵌入是单词、句子或文档的数值表示,能够捕捉它们的语义及相互关系。文本嵌入由嵌入模型生成,这些模型会将文本转换为向量——即机器学习算法可以处理和比较的数字数组。
机器学习工程师借助文本嵌入,帮助软件应用识别单词与句子之间的关系,从而更轻松地搜索、分类和分析海量数据。
假设你每天会收到数千张支持工单。客户反馈的问题五花八门,而你需要对它们进行分类和标记。自动化这一流程的一种方法,是使用预训练的文本嵌入模型将每张工单转换为向量。
例如,两位客户提交了以下消息:
- “我的订阅被重复扣费了”:[0.21, -0.47, 0.83, ...]
- “我的账户里有一笔重复付款”:[0.19, -0.45, 0.80, ...]
以上为简化的示意向量。
虽然两位客户的措辞不同,但他们描述的是同一个问题。嵌入模型会在数学空间中将它们的向量放在相近的位置,从而捕捉到这种关系。这两张工单都会被归入同一类别,并转交给账单团队处理。
文本嵌入的商业应用场景
文本嵌入被广泛用于各类自然语言处理(NLP)任务,包括:
- 语义搜索:根据含义查找相关信息。Delivery Hero 将商品嵌入和查询嵌入与关键词搜索结合使用,帮助生鲜杂货顾客找到相关商品。例如,搜索“低脂酸奶”时,即使措辞并不完全匹配,也能找到希腊酸奶或脂肪含量为 0.5% 的酸奶。
- 文本分类:对文本进行分类,例如识别垃圾邮件或按主题整理文档。MindCraft.ai 开发了一套文档分类系统,利用基于 Transformer 的文本嵌入和机器学习对企业文档进行分类,并识别敏感信息,以满足 GDPR 合规要求。
- 聚类:将相似的文档或文本片段归为一组,以识别其中的模式。Doczy.ai 将合同文本转换为嵌入,并对语义相关的条款和概念进行分组,即使不同合同以不同措辞表达相似的义务,也能将其归到一起。
- 检索增强生成(RAG):检索相关信息,供 LLM 生成更准确、更贴合上下文的回答。Ring 在多语言 RAG 聊天机器人中使用 Amazon Titan 文本嵌入,在回答各国际市场客户的问题之前,先检索相关的支持文档。
- 推荐系统:根据文本相似度推荐相关的文章、商品或其他内容。LinkedIn 的 JUDE 系统利用 LLM 为职位描述和会员档案生成的文本嵌入来改进职位推荐,捕捉候选人背景与空缺职位之间的关系。
- 命名实体识别(NER):帮助识别文本中的人名、组织名和地名,并对其进行分类。Amazon Health Services 使用 NER 识别客户查询中的医学概念,例如疾病、症状、药物和治疗方法,并将这种理解与基于嵌入的相似度搜索相结合,把查询与相关的医疗健康产品和服务关联起来。
- 机器翻译:为在不同语言之间翻译文本的模型提供支持。Transglot 在语义翻译记忆库中使用文本嵌入,识别含义相近的已翻译段落,帮助本地化工作流复用现有译文。
文本嵌入是如何工作的?
那么,嵌入模型是如何决定为一段文本分配哪些数值的?我们又为什么应该信任它?
一切都从训练开始。嵌入模型从海量文本中学习,寻找词语搭配使用的规律。例如,Word2Vec 等传统模型通过根据周围的词预测某个词(或反过来)进行学习。现代以检索为核心的模型则通常采用对比学习,其训练目标是让相关的查询-文档对获得比无关配对更高的相似度分数。
模型训练完成后,当你输入一段新文本时,会发生以下过程:
- 分词。模型首先将文本拆分为更小的片段,称为词元(token)。它们可能是完整的单词、单词的一部分或标点符号。每个词元都会从模型的词表中获得一个数字 ID,这个 ID 本身并不携带任何含义。
- 编码与池化。模型利用训练中学到的模式处理这些词元,并生成一个向量。向量中的每个数字都是一个坐标或分量,而维度则是该数字确定向量位置时所沿的轴。每个值都会影响文本在数学空间中的位置,这个空间称为嵌入空间。
- 相似度计算。为了查找相关文本,检索系统会使用余弦相似度或点积等相似度度量,将查询嵌入与文档嵌入进行比较。
例如,在线商店正是通过这种方式,根据用户的查询返回匹配的商品。
词嵌入、句子嵌入和文档嵌入有什么区别?
主要区别在于每个嵌入用单个向量表示多少文本。你可以根据想要捕捉的信息,为单个词、完整的句子或整篇文档创建嵌入。
- 词嵌入捕捉单个词语之间的关系,能够识别出“服务中断”和“停机”是相关概念。
- 句子嵌入能够理解整个句子的含义,即使不同的句子用不同的措辞表达同一个意思。
- 文档嵌入将整篇文档表示为一个向量,而不是为每个句子单独创建向量。这有助于保留文档的总体主题,并找到涵盖相同主题的其他文档;但细节可能更难(甚至无法)检索。
粒度应该细到什么程度?合适的级别取决于你的数据以及你想要实现的目标。
对于较大的文档,常见做法是将文本拆分为更小的块,并为每个块分别生成嵌入。这样,你既能获得文档的整体含义,又能保留具体细节,而这些细节在生成文档嵌入时可能会丢失。
分块大小对嵌入质量的影响有多大?
影响相当大。Rahul Kumar(Xenoss AI 工程副总裁)表示,难点在于找到一个既能完整承载一个概念、又不会丢失重要上下文的分块大小。他这样解释其中的权衡:
“分块大小决定了一个嵌入承载多少语义上下文。分块越大,向量获得的上下文就越多,但也会把更多主题平均到同一个向量中。一个涵盖三个主题的分块会落在它们的中间位置,与其中任何一个都匹配得不好。分块越小,含义就越清晰,但可能会丢失让它能被检索到的上下文。”
因此,Kumar 建议根据内容选择分块策略,而不是固守某一种固定大小。用他的话说:“带重叠的固定大小分块只适用于电子邮件或抓取的网页这类格式统一的文本。”
对于合同或政策等结构化文档,递归式、结构感知的拆分方式更为合适。而语义分块则很适合处理转录文本,因为它会在话题或含义发生转变的地方拆分文本。
文本嵌入与关键词搜索
既然可以直接搜索关键词,为什么还要使用文本嵌入?因为关键词搜索依赖于词语匹配,而基于嵌入的语义搜索即使在查询和文档用词不同的情况下,也能检索到相关信息。
但语义相似并不总是意味着相关。Shaw Talebi(AI Builder Academy 创始人)通过一个简历搜索系统演示了这一局限。在 Talebi 的案例中,搜索“有 Apache Airflow 经验的数据工程师”时,排名前五的结果中只有一条提到了 Apache Airflow,而且仅排在第三位——尽管数据集中另有三份简历列出了这项技能。
这说明,语义搜索有助于找到概念上相关的信息,但可能会遗漏技术技能、产品标识符或错误代码等精确要求。
为解决这一问题,Rahul Kumar 建议根据检索系统的薄弱环节来选择检索方法:
- 当查询包含 SKU、错误代码或法律条文引用等精确术语时,混合搜索(将关键词匹配与语义搜索相结合)是默认之选。
- 当只有排名靠前的少数结果才重要时(例如基于检索到的上下文生成答案),重排序器的成本就物有所值。
- 当答案分布在多个相互关联的数据源中时,图检索会很有帮助。
Kumar 还分享了他的团队如何将这些方法付诸实践。在一个项目中,他们同时运行 BM25 关键词搜索和向量搜索,使用倒数排序融合(RRF)合并结果,再用 LLM 对前 124 个结果进行重排序,最终精选出 6 个。
“改用图优先检索后——先用向量搜索找到相似的潜在空间,再进行两跳图遍历——排序质量(nDCG)从 0.58 提升到 0.67,p90 检索时间也从 19 秒缩短到 3 秒以内。”Kumar 补充道。
文本嵌入模型的类型
总体而言,所有嵌入模型做的都是同一件事——学习文本中的关系。不过,它们在训练目标、所考虑的信息以及设计用来处理的任务方面各不相同。
静态词嵌入模型
传统的词嵌入模型根据大规模文本集合中的词语使用模式,学习词语的稠密数值表示。这些嵌入是静态的,也就是说,无论某个词在特定上下文中是什么含义,它得到的向量都是相同的。
两种知名的方法是:
- Word2Vec:由 Google 于 2013 年开发,通过两种架构从相邻词中学习表示:连续词袋模型(CBOW),根据相邻词预测某个词;以及 skip-gram,根据给定词预测其相邻词。
- GloVe(Global Vectors for Word Representation,全局词向量表示):由斯坦福大学于 2014 年开发,利用词语共现统计来学习词语之间的关系。
上下文语言模型
与静态嵌入不同,通用语言模型生成的上下文表示会随周围文本的变化而变化。这有助于模型区分同一个词的不同含义。
- BERT(2018 年,Google):使用双向自注意力机制,同时考虑词元两侧的词。例如,它会为“I deposited money at the bank”(我把钱存进了银行)和“I sat on the bank of a river”(我坐在河岸上)中的“bank”生成不同的表示。
- GPT(2018 年,OpenAI):使用基于 Transformer 的表示,在预测下一个词元时考虑前文。GPT 模型主要用于语言生成。
句子和文档嵌入模型
将较长的文本(从单个句子到段落乃至整篇文档)表示为向量。
- Doc2Vec:将 Word2Vec 式的学习扩展到句子、段落和文档,可用于对相关文章进行分组,或按主题对文档进行分类。
- Universal Sentence Encoder(USE):由 Google 于 2018 年开发,用于为句子和短段落生成固定长度的表示,以支持语义相似度计算和文本分类。
- Sentence-BERT(SBERT,2019 年):由达姆施塔特工业大学的 Nils Reimers 和 Iryna Gurevych 开发,基于 Google 的 BERT 模型构建,常用于语义搜索、释义检测和聚类。
- pplx-embed-v1(2026 年,Perplexity):这是一个专为真实场景下的网络规模检索打造的先进文本嵌入模型系列,采用基于扩散的预训练,将因果语言模型转化为双向编码器。它为独立编码的查询和文档生成稠密嵌入,并通过量化感知训练降低存储成本。我们的 4B INT8 模型在多语言 MTEB 检索基准上取得了 69.66 的 nDCG@10,而 Google 的 gemini-embedding-001 为 67.71。
- pplx-embed-context-v1(2026 年,Perplexity):解决了文档分块的一个常见问题:段落与周围文本分离后可能会失去原有含义。借助延迟分块,该模型会先处理整篇文档,再将上下文化的词元表示池化为各个独立的分块嵌入。我们的 4B 模型在 ConTEB 上取得了 81.96 的 nDCG@10,而 voyage-context-3 为 79.45。
- pplx-embed-v2-context(2026 年,Perplexity):将上下文检索更推进一步。它不只是被训练来找到包含答案的段落,还会学习识别有助于解释或验证该答案的支撑段落。该模型在训练期间使用从上下文压缩模型中蒸馏出的相关性信号,而在推理时无需该教师模型。我们的 9B 预览版在 context-bench 上,前 10 个结果的答案召回率达到 45.5%,证据召回率达到 40.6%。
Perplexity 的模型还支持大规模存储嵌入。这些模型可生成 INT8 和二进制嵌入,与 FP32 相比,存储需求分别降至 1/4 和 1/32。
模型 | 维度 | 上下文 | MRL | 量化 | 指令 | 池化 |
pplx-embed-v1-0.6B | 1024 | 32K | 是 | INT8/二进制 | 否 | 均值 |
pplx-embed-v1-4B | 2560 | 32K | 是 | INT8/二进制 | 否 | 均值 |
pplx-embed-context-v1-0.6B | 1024 | 32K | 是 | INT8/二进制 | 否 | 均值 |
pplx-embed-context-v1-4B | 2560 | 32K | 是 | INT8/二进制 | 否 | 均值 |
pplx-embed 模型的维度、上下文长度、量化和池化配置
稠密嵌入、稀疏嵌入和多向量嵌入
还有一个值得了解的区别,对语义搜索而言尤为重要:嵌入模型在如何表示文本和计算相关性方面可能有所不同。
- 稠密嵌入:使用紧凑的向量表示文本,向量中的大多数值都是非零值。
- 稀疏嵌入:使用大部分值为零的向量,其中重要词项对应学习得到的权重。SPLADE(2021 年)等模型会学习哪些词项对检索相关文档至关重要。
- 多向量嵌入:为一段文本保留多个向量,从而在查询与文档之间进行更细致的比较。ColBERT(2020 年)等模型利用这类表示进行更细致的查询-文档比较。
- 结合多种方法的模型:BGE-M3(2024 年)由北京智源人工智能研究院(BAAI)开发,可在同一模型中支持稠密检索、稀疏检索和多向量检索。
如何选择和评估文本嵌入模型
MTEB 等公开基准是很好的起点。你可以借助它们筛选出两到三个满足你的语言、输入长度和部署要求的模型。但先别急着选出最终赢家。我们再怎么强调都不为过:一定要用你自己的数据测试这些模型。
下面是一套实用的评估工作流:
- 构建测试数据集。收集 50 到 100 条具有代表性的搜索查询作为初始评估集(可能需要更多),其中要包含释义、技术术语和精确错误代码等棘手情况。针对每条查询,确定哪些文档或段落包含相关答案。这些相关性标签就是你的基准真值(ground truth)。
- 衡量检索质量。使用同一评估数据集测试每个模型,在遵循各模型在查询格式、归一化和相似度评分方面的特定要求的同时,确保文档准备和检索条件具有可比性。然后使用 Sentence Transformers 的 InformationRetrievalEvaluator 计算以下指标:
- Recall@k:表示前 k 个结果中出现的相关段落所占的比例。
- MRR:衡量第一个相关结果在排名中的位置有多靠前。
- nDCG@k:根据相关性衡量前 k 个结果的排序质量。
- 对延迟和吞吐量进行基准测试。测量每个模型嵌入一条查询所需的时间,最好报告在真实负载下的中位数(p50)和第 95 百分位(p95)延迟。
- 计算存储和运营成本。向量存储取决于嵌入的数量、维度和数值精度。例如,一百万个 768 维的 FP32 嵌入大约需要 3.1 GB 的原始向量存储空间,不含索引开销。为降低存储需求,你可以将向量量化为更低的数值精度。比如,从 FP32 切换到 INT8 可将原始向量存储空间缩减至约四分之一。但压缩可能会影响检索质量,因此请重新运行评估,检验其中的权衡。
最后,将各项结果并排比较:检索指标、p95 延迟、吞吐量、存储和成本。选择能在生产约束范围内满足质量要求的模型。
何时应使用嵌入而非 LLM?
如今 LLM 能处理从文档分析到复杂推理的各类任务,人们很容易想把所有文本都丢给模型,让它自行处理。但为此买单,你恐怕不会太乐意。
此外,LLM 更擅长判断和撰写,但受限于单个提示中能容纳的信息量。而嵌入则成本低、速度快、结果稳定,并且能处理数以百万计的条目。
“嵌入在搜索、推荐(‘更多类似内容’)、发现重复内容(例如重复的支持工单)以及按主题对大量内容进行分组方面更胜一筹。它们在跨语言场景中也表现出色。而当任务需要推理时,LLM 更具优势,例如总结、比较选项或撰写答案。大多数实际系统两者都需要,各自负责自己擅长的部分。”Kumar 总结道。
开发者在文本嵌入上常犯的错误
为了解开发者容易忽视哪些问题,我采访了 Rahul Kumar 和 Xibeijia Guan(Ahrefs 数据科学家)。他们指出了值得注意的六个错误:
- 跳过文本预处理。如果输入数据包含 HTML、导航菜单、广告或其他无关内容,去除样板内容等预处理步骤可以清除不必要的信息,从而帮助提升嵌入质量。
- 忽视模型的最大输入长度。不同模型的 token 上限和截断行为各不相同。超出上限的文本可能会被截断,导致重要信息丢失。
- 未遵循模型的特定要求。某些嵌入模型要求使用特定前缀(例如 query: 和 passage:),或针对不同任务使用不同的指令。不遵循这些要求可能会降低检索性能。
- 使用不兼容的相似度度量。余弦相似度和点积并非总能互换。请检查嵌入是否经过归一化,并使用针对该模型和向量索引推荐的评分方法。
- 将主题相似误认为相关。在领域范围较窄的文档集合中,许多文档可能在语义上相似,却并不能回答同一个问题。请检查失败的查询和排名分布。当用户需要精确信息时,可以测试词法检索或混合检索、重排序以及元数据过滤器。
- 忽视嵌入归一化。不同的嵌入模型可能输出归一化或未归一化的向量。请根据所使用的相似度指标,检查嵌入是否已归一化,以及是否需要额外进行归一化。
文本嵌入常见问题
1. 如何生成文本嵌入?
最简单的方法是使用预训练的嵌入模型。例如,借助 Python 的 Sentence Transformers 库,你可以加载 all-MiniLM-L6-v2 等模型,将文本传入 model.encode(), 然后得到一个数值向量。或者,你也可以通过 API 生成嵌入。
对于语义搜索或 RAG,通常需要将文档拆分为多个块,为每个块生成嵌入,并将向量存储在可搜索的索引中。
2. 最好的文本嵌入模型有哪些?
根据你要构建的内容,以下几个模型值得考虑:
- Perplexity 的 pplx-embed-v1:专为大规模密集检索而构建,提供 INT8 和二进制嵌入,可降低向量存储需求。
- Perplexity 的 pplx-embed-context-v1:适用于从长文档中检索段落,在这类场景中,单个块一旦脱离上下文就会失去意义。
- all-MiniLM-L6-v2:适合轻量级的本地语义搜索、聚类和句子相似度任务。生成紧凑的 384 维向量,但会截断超过 256 个词片(word piece)的输入。
- BGE-M3:适用于多语言 RAG 和混合检索。支持 100 多种语言,并结合了密集、稀疏和多向量表示。
- Qwen3-Embedding:在多语言搜索、代码检索和特定任务嵌入方面的有力候选。提供 0.6B、4B 和 8B 三种开放权重模型,均支持指令。
- OpenAI 的 text-embedding-3-large:一种基于 API 的选项,适合在不想自行托管模型时用于语义搜索和文档检索。最高支持 3072 维,你可以降低维度以节省存储空间。
- Google 的 Gemini Embedding 模型:适用于托管式检索应用。Gemini Embedding 2 还支持在共享嵌入空间中跨文本、图像、音频、视频和 PDF 进行搜索。
3. 可以将 LLM 用作嵌入模型吗?
可以,但通用 LLM 与针对嵌入优化的 LLM 之间存在差异。LLM 会生成文本的内部向量表示,你可以将其提取并池化为单个嵌入。不过,如果没有额外训练,这些向量未必适用于语义搜索。
例如,Qwen3-Embedding 采用 LLM 主干,并针对嵌入和检索任务进行了进一步训练。因此,虽然你可以改造 LLM 来生成嵌入,但专用嵌入模型通常是更实际的起点。