嵌入与向量数据库简介
向量数据库是专门存储和查询高维向量的数据管理系统。这些向量也称为嵌入,由机器学习模型生成。嵌入把文本、图像等数据表示为高维空间中的数值向量,用来表达数据的含义或特征。模型在语言理解、图像识别等任务中学习这些压缩表示,使相似输入在向量空间中彼此接近。语义搜索和推荐系统需要寻找含义或特征相似的内容,向量数据库非常适合这类应用。
这种数据结构针对向量相似度搜索进行了优化。关键词搜索依赖词语匹配,向量搜索根据嵌入之间的数值相似性检索结果,因此能够处理同义词和不同表述。例如,“raise an issue”(提出问题)和“create a ticket”(创建工单)的英文词语完全不同,但嵌入表示可能相近,因此向量搜索能够将它们匹配起来。
向量数据库使用专门的数据结构高效处理高维向量。对大型数据集中的全部向量逐一比较会非常缓慢,因此数据库通常采用近似最近邻(ANN)算法加速相似度搜索。目前最常用的索引方法是分层可导航小世界图(Hierarchical Navigable Small World,HNSW)算法。后面的章节还会介绍其他索引算法。
嵌入模型及其输出
本节关注 RAG 数据摄取流程中的嵌入环节。
嵌入模型是将数据编码为向量表示的机器学习模型,通常采用神经网络。在自然语言处理(NLP)中,Transformer 模型可以将句子表示为稠密向量;两个含义相似的句子即使没有共同词语,其向量也可能彼此接近。这使嵌入能够处理同义词,甚至表达跨语言的相同含义。可用模型很多,既包括可以自行运行的开源模型,也包括通过专有 API 调用的模型:
- OpenAI Embeddings:OpenAI 通过 API 提供文本嵌入模型,较知名的包括
text-embedding-ada-002及其后继text-embedding-3系列。text-embedding-ada-002输出 1536 维向量;text-embedding-3-small默认输出 1536 维,text-embedding-3-large默认输出 3072 维。第三代模型还支持通过dimensions参数缩短输出维度。具体配置见 OpenAI 嵌入文档。这些通用嵌入模型在大规模语料上训练,在多种语义任务中都有良好表现。 - Sentence Transformers(Hugging Face 模型):大量开源嵌入模型支持在自己的计算设备上运行,尤其是文本模型。例如,SentenceTransformers 库提供
all-MiniLM-L6-v2等预训练模型,可以生成 384 维句子嵌入。这些模型基于 BERT、RoBERTa 等 Transformer 架构,经过微调后能够为句子或文本段生成有意义的向量表示。开源嵌入模型还可以根据具体领域进行微调。 - 其他提供商:Cohere、Google 等 AI 服务提供商也提供嵌入服务。嵌入模型种类丰富,发展迅速。
选择嵌入模型时,应考虑数据类型,例如文本或图像;输出维度;模型在目标任务中的表现,例如对短文本或长文档语义差异的识别能力;部署方式,例如自行托管或调用 API;以及成本限制。Hugging Face Hub 等平台提供了许多现成的预训练模型,可以通过实验比较哪些嵌入更适合你的应用。
无论选择哪种模型,核心方法都是用嵌入模型将数据编码为向量,再通过这些向量在向量数据库中建立索引并检索信息。查询阶段使用的嵌入模型必须与索引阶段的模型相同或兼容,这样查询向量与已存储向量才会处于同一语义空间。例如,文档使用一个模型编码,查询却使用完全不同模型生成的嵌入,就无法得到有意义的搜索结果。
向量索引类型与 ANN 算法
向量数据库依靠索引结构和 ANN 算法进行快速相似度搜索。各种索引需要在搜索准确性、速度和内存使用之间进行取舍。
常见索引类型包括:
- Flat 索引(穷举搜索):这种方法最简单,直接存储全部向量,每次查询都与集合中的每个向量比较,得到精确结果,召回率和准确性最高。搜索时间随向量数量线性增长,因此大型数据集的查询速度较慢。Flat 索引适用于小型数据集,或者对准确性要求极高、对延迟要求较低的场景。
- LSH(局部敏感哈希):这种 ANN 方法将向量映射到哈希桶,使相似向量有较大概率进入同一桶。LSH 使用多个随机投影或哈希函数对向量分组,搜索时只比较相同哈希桶中的向量。它的搜索速度可以很快,但较高召回率通常需要大量哈希表。对于维度很高的数据,所需哈希位数会显著增加,因此处理效果受到限制。LSH 通常适合维度较低的嵌入或较小的数据集,在现代高维应用中使用较少。
- HNSW(分层可导航小世界图):一种先进的图索引方法。HNSW 将向量组织为多层小世界图,每个向量节点都与其近邻连接。搜索算法通过遍历图结构寻找相近项目,无须检查全部节点。HNSW 能兼顾搜索速度与较高召回率,但每个节点需要存储多条连接,因此可能占用较多内存。参数
M控制每个节点连接的近邻数量。增大M可以改善召回率,同时增加索引的内存消耗;扩大搜索候选范围也可以改善召回率,但会增加查询计算量和延迟。现代向量数据库大多采用 HNSW。 - IVF(倒排文件索引):这种方法由 Facebook 的 FAISS 库率先推广,将向量空间划分为多个聚类,即 Voronoi 区域,并将每个向量分配给最近的聚类中心。查询时只搜索距离查询向量最近的若干个聚类,数量由
nprobe等参数控制,从而减少比较次数。如果最近邻位于另一个聚类,IVF 可能遗漏结果,但它通常能以较低延迟和内存使用获得较高召回率。IVF 经常与量化等技术结合,进一步优化搜索。 - PQ(乘积量化):一种常与 IVF 等索引结合使用的向量压缩方法。PQ 将每个向量划分为多个子向量,再使用从数据中学习的码本,将每个子向量量化为较短的编码。数据库存储这些紧凑编码,可以大幅减少完整浮点向量所需的内存。搜索时通过预先计算的编码距离近似估算向量距离。PQ 使大规模向量集合能够以较低内存消耗和更快的磁盘读取速度完成搜索,代价是压缩造成一定准确性损失。Milvus、FAISS 等系统提供 IVF+PQ 配置,适合能够接受少量精度损失、需要兼顾速度和内存使用的场景。
各类索引都有适用场景。例如,在计算设备配置适中、需要高准确性搜索时,经常选择速度快但内存占用较高的 HNSW;处理磁盘上的数十亿个向量时,则可能选择 IVF+PQ。
用于衡量相似性的距离指标
相似度搜索需要量化两个向量的接近程度,因此相似性指标是系统的重要组成部分。最常见的指标包括欧氏距离、余弦相似度和点积,Qdrant 完整支持这三种指标:
- 余弦相似度:计算两个向量夹角的余弦值,比较方向。方向完全相同的两个向量,其余弦相似度为最大值 1.0;相互正交时为 0;方向完全相反时为 −1。余弦相似度关注各个分量之间的相对关系,因此常用于文本嵌入。使用时,通常会将嵌入向量归一化为单位长度。
两组向量的长度不同,但夹角相同,因此余弦相似度相同。 - 点积:计算两个向量对应分量的乘积之和,同时受到方向和长度影响。对于未归一化的向量,即使方向相近,长度较大的向量,例如较长文档生成的向量,也可能得到更高的点积。如果所有向量都归一化为长度 1,点积在数学上就等于余弦相似度。点积常用于向量长度具有意义的嵌入。
夹角相同的两组向量,在长度发生变化时可以具有不同的点积。 - 欧氏距离(L2 距离):向量空间中两点之间的 L2 范数距离。计算时,将各个对应分量的差值平方后相加,再取平方根。欧氏距离将向量分量视为空间坐标,衡量它们的绝对差异。欧氏距离很近的向量具有很高相似性。当向量分量的大小具有意义时,欧氏距离是自然的选择。
两组向量端点的方向和位置不同,也可以具有相同的欧氏距离。
距离指标应根据数据和嵌入模型选择。文本语义嵌入的长度可能没有特定含义,因此通常使用余弦相似度。其他场景,或者模型已经将向量归一化时,也可能采用欧氏距离或点积。向量数据库会根据所选指标进行排序,返回与查询向量距离最小或相似度最高的向量。
使用二维示意图理解每种指标的计算方式很有帮助。可以将向量方向理解为含义,将长度理解为对该含义的强化程度,这样更容易理解不同距离指标的取舍。