检索增强生成(RAG)已成为构建生成式 AI 应用的主流架构,企业选择它主要原本是可以用自有数据约束模型输出,使答案更准确、可更新且更贴合业务场景。RAG 的效果在很大程度上取决于检索到的上下文质量——提升效果的常用手段包括合理切分文本块(chunking)、选用合适的嵌入模型与采用稳健的检索策略。嵌入(embeddings)是这一流程的核心:它将词、句与文档映射到向量空间,在该空间中语义关系变为可度量的数学关系;若嵌入选型不当,会带来检索噪声导致模型的输出不准确。所以本文将说明嵌入的基本原理与重要性、列出选型时的关键考量,并对典型模型与适用场景给出实用建议,帮助你为 RAG 系统挑选既高效又稳健的嵌入方案。
什么是嵌入?
嵌入是对语言中含义与模式的数值化表示。这些数字帮助系统找到与问题或主题高度相关的信息。这些嵌入由嵌入模型生成。嵌入模型可以将词、图像、文档,甚至声音,转换为一串称为向量的数字。
你可能在大语言模型语境下了解过嵌入,但嵌入的历史其实更悠久。
目前,大多数嵌入都由语言模型创建。与给每个 token 或词分配静态向量不同,语言模型会创建上下文化的词向量,让词/句子/片段在不同上下文下拥有不同表示。这些向量随后可被其他系统用于各类任务。
生成"文本"嵌入向量的方法有多种。最简单的方法是对模型产生的所有"token 嵌入"取平均值,而高质量文本嵌入模型往往针对嵌入任务专门训练。
我们可以用
sentence-transformers
来生成文本嵌入: from sentence_transformers import SentenceTransformer
# Load model
model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
# Convert text to text embeddings
vector = model.encode("Deephub Best ever!")
嵌入向量的数值个数(即维度)取决于底层嵌入模型。可通过
vector.shape
方法查看嵌入向量的维度。
嵌入在 RAG 中为何重要?
语义理解:嵌入将词、句子或文档转成向量(数字列表),让相近语义彼此靠近。这帮助系统理解语境与含义,而非仅做字面匹配。
高效检索:RAG 需要快速找到最相关的段落或文档。嵌入让检索更快更容易,通常结合 k 近邻(k-NN)等算法。
更高准确度:借助嵌入,模型能识别与你问题相关的信息,即使没用相同措辞。这意味着更准确、更相关的答案。
嵌入的类型
根据系统需要处理的信息类型不同,嵌入也有多种形式。
按系统需理解的信息类型划分
词嵌入(Word Embeddings)
词嵌入把每个词表示为多维空间中的一个点。含义相近的词,如 "dog" 与 "cat",会彼此靠近。这帮助计算机理解词与词之间的关系,而非只看拼写。
常见的词嵌入模型包括:
Word2Vec:从海量文本中学习词关系
GloVe:关注词的共现频率
FastText:将词拆成子词片段,更擅长处理罕见词或拼写错误
句子嵌入(Sentence Embeddings)
有些情况需要整句才能完整表达含义。句子嵌入将整句语义捕捉为一个向量。
知名的句子嵌入模型有:
Universal Sentence Encoder (USE):对各种句式表现良好,包括问句与陈述句
SkipThoughts:通过预测相邻句来学习,更好理解上下文与意图
文档嵌入(Document Embeddings)
文档可以是一个段落,也可以是整本书。文档嵌入把全文转成单个向量,便于在海量文档中检索与查询相关的内容。
主流的文档嵌入模型包括:
Doc2Vec:基于 Word2Vec 扩展,适用于更长文本
Paragraph Vectors:类似 Doc2Vec,但聚焦段落等较短文本单元
图像嵌入(Image Embeddings)
RAG 系统不只处理文本,还可处理图像。图像嵌入将图片转为一串数字,描述颜色、形状与模式。常用的图像嵌入模型是卷积神经网络(CNN),它对图像模式识别尤为擅长。
按嵌入的特性划分
嵌入具有不同特性,这会影响其工作方式与适用场景:
稠密嵌入(Dense) :稠密嵌入的向量几乎每个位置都有值,每个数都携带一些信息。稠密向量紧凑高效,在较小空间内承载丰富细节,便于快速相似度比较。
稀疏嵌入(Sparse) :稀疏嵌入的相当多位置为 0,只有少数位置有值,0 不携带信息。稀疏表示有助于突出最关键的特征,便于识别与众不同之处。
长上下文嵌入(Long Context) :有时需要理解整篇文档或长对话,而非短句。长上下文嵌入可一次处理大量文本。旧模型只能看短文本,如果给它们整篇文章,就必须切分,容易丢失关键信息或主线。新模型(如 BGE-M3)可一次接收上千词(最高 8,192 token),帮助系统保留完整语义脉络。
多向量嵌入(Multi-Vector) :通常一个对象(词/文档)只有一个向量;多向量嵌入为每个对象分配多个向量,各自刻画不同侧面。多向量能捕捉更细的特征与关系,带来更丰富、更准确的结果。
文本嵌入模型的关键参数
在选模型前,先要明确看什么指标。关键因素包括:
上下文窗口(Context Window)
上下文窗口是模型一次能处理的最大文本长度。例如窗口为 512 token 的模型,一次只能读 512 个词或词片;更长的文本必须切分。一些模型(如 OpenAI 的 text-embedding-ada-002(8192 token)和 Cohere 的嵌入模型(4096 token))可以处理更长文本。更大的上下文窗口允许处理更长文档而不丢失信息,对检索长文章、论文或报告很有帮助。
分词单元(Tokenization Unit)
分词是模型将文本拆分为 token 的方式。不同模型不同:
子词分词(BPE):把词拆成更小片段,如 "unhappiness" → "un" + "happiness",有助处理生僻或新词
WordPiece:与 BPE 类似,常用于 BERT 系列
词级分词:按整词拆分,对稀有词支持较差
分词方式影响模型对不同词,尤其是非常见词的理解能力。多数现代模型采用子词分词以获得更好灵活性。
维度(Dimensionality)
维度是模型为每段文本生成的向量长度。例如有的模型输出 768 维,有的 1024 维,甚至 3072 维。更高维可容纳更细节,但需要更多计算与存储;低维更快更省,但可能损失细节。
词表大小(Vocabulary Size)
即模型已知的唯一 token 数。更大的词表可覆盖更多词与语言,但占更多内存;更小词表更快,但可能不理解生僻或专业术语。
例如:多数现代模型的词表规模在 30,000–50,000 之间。
训练数据(Training Data)
训练数据是模型学习的来源。
通用语料:来自网页、书籍等多样文本,适合通用任务
领域语料:来自医疗、法律等专业文本,擅长特定垂直领域
在特定数据上训练的模型在该领域表现更好,但在通用任务上可能逊色。
成本(Cost)
最后就是成本考量了,它包含使用模型的费用与算力开销。取决于接入方式:
API 模型:按用量计费,如 OpenAI、Cohere
开源模型:使用免费,但需自备硬件(如 GPU)和运维能力
API 模型易上手,但数据量大时成本上升;开源自部署省授权费,但需要更多搭建与维护。
选择嵌入时的关键考量
设计 RAG 时我首先会问:"系统要处理什么数据?"若是通用知识或客服 FAQ,OpenAI 的 text-embedding-3-small 这类通用嵌入通常足够;若是医疗、法律或金融等专业领域,BioBERT、SciBERT、Legal-BERT 等领域模型更合适,它们对该领域语言与语境更敏感。若还需处理产品图片或语音查询,选择多模态嵌入。CLIP 非常适合同时处理文本与图像。
除此以外还需要评估查询与文档是短是长、结构化还是非结构化。有些模型擅长短文本,有些更擅长长文本。嵌入维度影响很大。高维(如 1536 或 4096)能捕捉更细微差别与上下文,通常提升检索准确性,但计算与存储成本高。
低维(如 384 或 768)更快更轻,适合扩展到百万级文档;代价是可能牺牲部分精度。实践中,建议从 384–768 维开始,性能与资源之间更均衡。现代向量数据库(Pinecone、Weaviate、FAISS 等)可以用量化或降维压缩嵌入,让你在不显著增加内存的情况下使用更大维度。
然后就是要确定计算的效率,比如对于实时应用,速度关键。若响应时延要求严格,选择推理延迟低的模型。DistilBERT、MiniLM 等轻量模型通常足够准确且更快。
最后就是评估 RAG 需要回答的问题类型,以及知识库内容的结构与长度。将内容切分为合适的块大小十分关键。上下文窗口大小是获得正确答案的关键因素之一。更大的上下文窗口在处理长且复杂的文档时会更有优势,能够提供更准确的回答。
选择合适嵌入的基准
新嵌入模型层出不穷,如何跟进?
MTEB 是社区运营的排行榜,比较 100+ 文本与图像嵌入模型,覆盖 1000+ 语言。它将评估指标、任务类型与广泛领域集中在一起,是选型的良好起点。
Massive Multilingual Text Embedding Benchmark(MMTEB)
传统基准常只覆盖少数语言或领域。MMTEB 进一步扩展,包含 250+ 语言、500+ 评测任务,并测试更具挑战的能力,如指令遵循、长文档检索、甚至代码检索。它是当前最全面的多语言嵌入基准之一。
如何使用 MTEB
MTEB 有助于挑选嵌入模型。不同模型在不同任务上表现各异。排行榜展示了各模型在广泛任务上的表现,帮助你按自身需求缩小范围。
但别被 MTEB 分数"迷惑"。MTEB 提供分数头部模型之间的差距往往很小。分数来自多任务平均,你看不到任务间的方差。有时榜首只略胜一筹,但是其实多个头部模型效果可能是一样的。
当模型非常接近时,平均分并不总是有意义。
建议:关注与你用例相似任务上的表现,这通常比总分更有参考价值。你不必深挖每个数据集,但知道文本类型(新闻、论文、社媒等)会有帮助。你可在数据集说明或样本中快速了解。
MTEB 很有用,但并不完美,别只盯最高分找到最适配你任务的模型才是最主要的。
在选择时一定要考虑你的应用需求。不存在对所有任务都最好的单一模型,这也是 MTEB 存在的意义:帮助你找到"更合适"的那个。
- 你需要的语言是什么?模型是否支持?
- 是否涉及金融、法律等专业词汇?
- 模型体量多大?能否在你的硬件(如笔记本)上运行?
- 你的机器内存有多大?模型能装得下吗?
- 最大输入长度是多少?你的文本偏长还是偏短?
明确对项目最重要的要素后,你就可以按这些特性在 MTEB 榜单中过滤模型,找到既表现优秀又满足实际约束的选择。
总结
选择嵌入模型这件事,说复杂也复杂,说简单也简单。
复杂在于需要考虑的因素确实很多:领域匹配、上下文长度、计算成本、部署难度...每一个都可能影响最终效果
简单在于,只要抓住核心需求,很多选择其实是自然而然的。
我见过不少团队在模型选择上踩坑。有的盲目追求 MTEB 高分,结果发现在自己的数据上表现平平;有的为了省成本选了最便宜的方案,后来发现检索质量差到用户抱怨;还有的一开始就选了最复杂的多向量模型,结果系统跑得很慢,维护成本高得离谱。
所以在大多数情况下,你不需要最新最炫的模型。OpenAI 的 text-embedding-3-small、NVIDIA 的 NV-Embed-v2、甚至开源的 BGE 系列,对于大部分应用场景都够用。关键是要match你的具体需求。
建议先从简单的开始。选一个在你领域表现还不错的通用模型,快速搭建原型,看看效果。如果检索质量达不到要求,再考虑换更专业的模型;如果成本控制不住,再优化部署方案。别想着一步到位。RAG 系统的优化是个迭代过程,嵌入模型只是其中一环。有了数据、有了用户反馈,你自然知道该朝哪个方向调整。
链接:
https://avoid.overfit.cn/post/27f128bfa34442e299acf8f400e236a4