-
使用场景
- 传统AI和机器学习场景
人脸识别、图像搜索、语音识别等功能 - 与大模型配合使用
- 背景
- LLM模型本身是没有记忆功能的,记忆功能的实现是通过将对话记录存储在内存或数据库中,当发送消息给模型时,程序自动将最近几次的对话记录通过prompt组合成最终的问题并发送给大模型。
- 大模型存在输入端上下文(tokens)的限制,限定了输入内容长度,通过将需要发送大模型的内容拆分成多次输入,可以解除token限制
- 过程
文本上传后将文本的所有内容转化成向量 (过程称为Vector Embedding), 然后当用户提出相关问题时,将用户搜索的内容转换成向量,在数据库中搜索最相似的向量,匹配最相似的上下文,最后将上下文返回给大模型
我们可以将所有对话以向量的方式保存起来,当我们提问给 ChatGPT 时,我们可以将问题转化为向量对过去所有的聊天记录进行语义搜索,找到与当前问题最相关的‘记忆’,一起发送给 ChatGPT,极大的提高 GPT 的输出质量
- 背景
- 传统AI和机器学习场景
-
与传统数据库相比的区别
传统数据库:搜索功能基于索引方式(B-Tree、倒排索引等),本质为文本的精确度匹配,对语义搜索的功能很弱;
向量数据库:通过算法对特征工程生成的高维度向量数据进行相似度搜索实现特征本质的相似检索。
-
相似性搜索 (Similarity Search)
查找相似向量的高效搜索算法:
在查询相似向量时需要从库中海量数据查询,需要对每个向量进行比较计算,计算量巨大,所以需要高效算法解决这个问题,解决思路:
减少向量大小:通过降维或减少表示向量值的长度
缩小搜索范围:通过聚类或将向量组织成基于树形、图形结构来实现,并限制搜索范围仅在最接近的簇中进行,或通过最相似的分支进行过滤
常见的聚类算法:
除暴力搜索能完美搜索出最近邻,搜索算法只能在速度、质量、内存上作权衡,这些算法也被称为近似最相邻(Approximate Nearest Neighbor)
K-Means
步骤:
1.选择k个初始聚类中心
2.将每个数据点分配到最近的聚类中心
3.计算每个聚类的新中心
4.重复步骤2、3,直到聚类中心不再改变或到达最大迭代次数
Faiss算法
将向量想象为包含在Voronoi单元格中,当引入一个新的查询向量时,首先测量其与各个质心(centroids)的距离,然后将搜索范围限制在该质心所在的单元格内。为了避免搜索遗漏问题,可以将搜索范围动态调整,调整nprobe参数,决定搜索最近的几个聚类中心
聚类算法的内存占用问题的优化
聚类算法需要维护每个向量的浮点数坐标,占用空间较大;维护聚类中心和每个向量的聚类中心索引,也会占据较多内存
Product Quantization (PQ)
将向量分解为多个子向量,对每个子向量独立进行量化,如将128维的向量分为8个16维的向量,然后在8个16维的子向量上分别进行聚类,可以将码本的大小降低
Hierarchical Navigable Small Worlds (HNSW)
HNSW使用了分层格式,每层的节点都会与上一层的节点相连,搜索时从第一层开始逐层向下搜索。搜索质量和速度较高,内存开销较大,不仅将所有向量存储在内存中,还维护了一个图的结构
Locality Sensitive Hashing (LSH)
局部敏感哈希,特点是快速提供一个近似、非穷举的结果。LSH使用一组哈希函数将相似向量映射到桶中,从而使相似向量具有相同的哈希值,可以通过哈希值判断向量之间的相似度。
常用的哈希场景为尽可能避免哈希碰撞,避免相同哈希下链表过长导致时间复杂度O(n),n为链表长度。但在向量搜索中,为了找到相似向量,所以专门设计一种哈希函数,使得哈希碰撞概率尽可能高,位置越近或越相似的向量越容易碰撞。在搜索时,先hash到对应桶,极大缩小查询范围,再查询桶中向量
向量在高维空间距离计算(判断相似度的衡量方式):
欧几里得距离(Euclidean Distance)
特点:计算向量的绝对距离
适用场景:用于考虑向量长度的相似性计算,用于推荐系统中推荐相似商品
公式计算:
余弦相似度(Cosine Similarity)
特点:计算向量之间的夹角,对向量长度不敏感,只关注向量的方向
适用场景:用于高维度向量相似性计算,如语义搜索和文档分类
计算公式:
点积相似度 (Dot product Similarity)
特点:计算两个向量之间的点积值,兼顾了向量的长度和方向
适用场景:图像识别、语义搜索、文档分类
公式计算:
索引过滤
实际业务场景中往往不会对全量数据进行相似性搜索,会通过部分业务字段进行过滤再查询。存储在向量数据库中的向量还包含元数据,如用户ID、文档ID、会话ID等信息,可以在搜索时过滤搜索结果。向量数据库通常维护两个索引,一个向量索引,一个元数据索引。
常用向量数据库
向量数据库 | URL | GitHub Star | Language | Cloud |
chroma | GitHub - chroma-core/chroma: the AI-native open-source embedding database | 7.4K | Python | ❌ |
milvus | 21.5K | Go/Python/C++ | ✅ | |
pinecone | ❌ | ❌ | ✅ | |
qdrant | 11.8K | Rust | ✅ | |
typesense | 12.9K | C++ | ❌ | |
weaviate | 6.9K | Go | ✅ |
参考文献: