随着大型语言模型(LLM)的开源与普及,开发人员逐渐意识到向量数据库在增强模型能力方面的重要性。像 GPT 这类大模型通常使用大规模的嵌入向量来表示文本数据,而向量数据库提供了高效存储和检索这些向量数据的能力,使得在应用中存储和访问高维语义信息变得更加高效和快速。
向量数据库概述
向量数据库是一种专门用于索引、存储结构化或非结构化数据(例如文本、图像、音频等)及其向量嵌入(数据的数字表示)的数据库系统。它允许用户在生产环境中快速大规模地查找和检索相似的对象。由于其高效的搜索功能,向量数据库有时也被称为向量搜索引擎。与传统的关系型数据库不同,向量数据库不依赖于精确匹配,而是基于向量之间的相似度进行模糊匹配。
向量嵌入技术
现实生活中的数据主要分为结构化数据(如电子表格中的组织整齐的数据)和非结构化数据(如文档、图像、音视频等)。绝大多数业务数据属于非结构化数据,这类数据很难以传统方式存储以便轻松找到所需内容。如何对这些数据进行量化存储并实现快速查找是核心挑战。
向量嵌入是一种将非结构化数据转换为数学向量的方法,使得数据可以被量化存储并且可以进行快速查找。通过向量嵌入,非结构化数据被映射到一个多维的向量空间中,每个数据项都用一个向量来表示。这些向量通常被设计成能够捕捉数据的语义信息,使得相似的数据在向量空间中距离较近,不相似的数据在向量空间中距离较远。
现代机器学习模型可以经过训练将原始数据转换为嵌入,表示为固定维度的浮点数数组(或向量)。向量数据库便是用于存储这些嵌入向量的专用数据库。
![向量空间示意图]
向量搜索原理
使用向量嵌入,我们可以在向量空间中搜索彼此接近的对象,以找到并检索相似的对象。这种搜索方式被称为向量搜索、相似性搜索或语义搜索。
具体向量搜索是如何进行的?举个例子来讲:我们基于人格五因素测试对多人进行性格测试,在 5 个维度上收集了他们的评分,并将这些评分作为向量嵌入。为方便在平面坐标系中展示向量之间的关系,我们先只取 2 个维度的数据,将评分范围调到 -1 ~ 1,并将这些点表示为从坐标原点到它们的向量。
如果 Jay 需要寻找与其性格相似的人去代替,机器如何识别呢?这时向量的表示法就可以让我们通过数学方式计算向量的相似性来找到目标。
向量的相似性通常通过计算两个向量之间的距离来确定。计算相似度分数的常用方法是余弦相似度,其数学定义与公式如下:
给定两个 n 维属性向量 A 和 B,它们的余弦相似度 cos(θ) 通过使用向量点积和向量长度表示为:
$$ \cos(\theta) = \frac{A \cdot B}{||A|| ||B||} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} $$
其中,Ai 和 Bi 分别是向量 A 和 B 的第 i 个分量。按照数学公式我们可以计算出 Person #1 和 Jay 相似度最高,两个向量的夹角也最小,因此他们更相似。
实际上两个维度的特征不足以判断人格是否相似,因此我们需要用到 5 个维度的数据。虽然数据维度升高,但这种比较向量相似度的方法适用于任意维度的向量空间。
向量索引技术
向量索引是一种用于在大规模数据集中快速搜索相似向量的技术。通俗地说,就像我们在一堆杂乱的图片中找到与给定图片相似的图片一样。构建向量索引就像是给大量的照片贴上标签并整理成相册一样。
想象一下,你有一个非常大的图像库,每张图片都表示为一个向量。现在,你希望找到与给定图片相似的图片。这时,向量索引就派上了用场。可以根据给定图片的向量,在多维数据空间中快速定位相册,然后快速定位那些与给定图片在向量空间中距离较近的图片,而不必一个一个地比较每张图片。
常见的构建索引的算法包括:
- 基于聚类的索引 (如 IVF)
- 基于邻近图的索引 (如 HNSW)
- 基于树的索引 (如 KD-Tree)
- 基于哈希的索引 (如 LSH)
- 基于压缩的索引 (如 PQ)
向量索引在实际中有许多应用,比如图像搜索、语义搜索、推荐系统等。它能够帮助我们快速地处理和检索大规模的向量数据,从而在很多领域提高效率和性能。
工作流程
向量数据库的常见的工作管道包含以下主要步骤:
- 索引:对嵌入的向量通过索引算法对其进行索引并将向量数据和构建好的索引结构存储到数据库中。
- 查询:向量数据库会根据查询向量在向量索引中进行搜索,并返回与查询向量最相似的向量结果。
- 后期处理:在某些情况下,向量数据库从数据集中检索出一组与查询向量最相似的向量,并对它们进行后期处理,以返回最终的结果。这个步骤可能包括使用不同的相似度度量重新对查询到的相似向量进行排序。换句话说,就像在购物网站上找到了一些可能的商品,然后根据不同的标准重新排序,以便更好地满足用户的需求。


