一种将文本(或图像、或音频)表示为数字列表(即向量)的方法,该向量能够捕捉其含义。在这一数字空间中,相似的概念会彼此靠近—“cat”和“kitten”距离较近,而“cat”和“economics”则相距甚远。
嵌入模型将一段文本——一句话、一段段落、甚至整个文档——压缩成一个固定长度的浮点数向量,通常维度在384到4096之间。其神奇之处在于这些数字的排列方式:在训练过程中,模型学会将语义相似的文本在高维空间中彼此靠近,而将语义不同的文本相互远离。标准的训练方法采用对比学习,模型会看到成对的相关文本(如问题与答案、句子与同义句),并学习最小化它们的向量距离,同时最大化不相关对之间的距离。BAAI的bge-large-en、OpenAI的text-embedding-3和Cohere的embed-v3等模型都采用这种通用方法,但它们在架构、训练数据和优化的具体对比目标上有所不同。
在实际应用中,使用嵌入模型时,首先需要将文档编码为向量并存储在向量数据库中,如Qdrant、Pinecone、Milvus或FAISS。在查询时,使用相同模型将用户的提问编码为向量,并执行最近邻搜索以找到最相似的文档向量。距离度量方式至关重要——余弦相似度是最常见的,但有些模型是为点积或欧几里得距离训练的。一个常见误区是:必须使用相同的嵌入模型处理文档和查询。不同模型生成的向量存在于完全不同的空间中,即使维度相同也无法比较。
嵌入向量的维度体现了表现力与成本之间的权衡。1536维的向量能捕捉比384维更丰富的语义细节,但存储和搜索成本是后者的四倍。对于百万级文档,这意味着向量数据库需要数十GB的RAM,而非仅仅几GB。一些新模型支持Matryoshka嵌入,允许将向量截断到更少维度并实现平滑降级——对最重要的文档集使用完整的1024维,对次要文档集使用前256维。量化也有帮助:将向量存储为INT8而非float32可减少4倍内存占用,且精度损失很小,这也是为什么生产系统越来越多地使用量化嵌入。
一个常见误解是嵌入模型像人类一样理解含义。它们在表面语义相似性(如同义词、同义句、相关概念)方面表现优异,但在否定(“餐厅不好”和“餐厅好”常被判定为相似)、复杂逻辑关系以及未训练过的领域术语方面可能表现不佳。这就是为什么检索增强生成系统(RAG)通常结合向量搜索与关键词搜索(混合搜索),并使用重排序模型进行二次筛选以提高精确度。嵌入模型会检索出大量候选文档,而速度较慢但更精确的重排序模型会根据实际相关性进行排序。正确构建这一流程的重要性远高于选择MTEB排行榜上得分最高的嵌入模型。