AI创想

标题: 【大模型 向量库】从向量搜索到向量数据库 [打印本页]

作者: deguidao    时间: 昨天 21:45
标题: 【大模型 向量库】从向量搜索到向量数据库
作者:CSDN博客
大模型向量库



向量:AI核心

向量伴随着 AI 模型的发展而发展。
向量:AI 理解世界的通用数据形式,是多模态数据的压缩。
比如大模型输入输出都是文字文本,但模型实际接触和学习数据是向量化文本。
这个步骤叫 Embedding(嵌入),将文字文本转化为保留语义关系的向量文本。
embedding 模型对自然语言的压缩和总结,将高维数据映射到低维空间。
不仅文字,图像也是向量化之后进行处理:

(, 下载次数: 0)



向量库:语义近似搜索

传统数据库是基于文本的精确匹配、SQL语言查找符合条件的数据,适合关键字搜索。
向量库:专门存储和查询向量的数据库,适合语义搜索。
(, 下载次数: 0)

向量数据库步骤:
传统数据库索引是精确匹配,要么符合查询要求(返回数据),要么不符合查询要求(无数据返回)。
向量搜索
向量数据库
传统数据库无法满足此类操作和需求,只能实现部分向量数据的存储,且无法高效搜索向量。
向量搜索能够实现对语义更为精准的理解,在多模态、不同语言等环境下能够输出更为准确的结果。
如:英文的Capital可以指“资本”或者“首都”,“从中国去美国”和“从美国去中国”存在方向,传统的数据库不能很好解决这些问题。
那是不是还可以组合俩者,提供更加全面和精准的搜索?
或者加速搜索速度,先使用向量库进行初步的语义搜索以缩小搜索范围,然后在这个范围内使用传统数据库进行精确的关键字搜索。

大模型 + 向量库

(, 下载次数: 0)


Step 1 语料库准备:
Step 2 问题输入:
Step 3 向量搜索:
Step 4 Prompt优化:
Step 5 结果返回:

YOLO + 向量数据库

假设你正在使用YOLO模型来识别和分类眼底图像中的疾病,比如糖尿病性视网膜病变、青光眼等。
不使用向量数据库的情况
使用向量数据库的情况
假设一个医院收集了数千张眼底图像,并使用YOLO模型来识别各种疾病标志。
如果没有向量数据库,每次新的病例来临时,医生可能需要手动查找和比较历史病例来辅助诊断。
这不仅费时,而且无法保证一致性和准确性,特别是在病例数量庞大时。
如果使用向量数据库,YOLO模型可以将每张图像中识别出的疾病标志转换为特征向量并存储。
当新病例来临时,模型会对新眼底图像进行分析,并将其特征向量与数据库中现有的向量进行比较。
这样可以迅速找到历史病例中与新病例具有相似特征的图像,为医生提供即时的、数据驱动的参考。
此外,医生还可以追踪特定患者的病情变化,通过比较同一患者不同时间点的眼底图像的特征向量。
用与不用向量数据库的具体区别
那俩者怎么结合呢?
使用YOLO模型和向量数据库进行目标检测和检索涉及几个步骤:
假设医生想要诊断一个新的眼底图像,以确定是否有糖尿病性视网膜病变的迹象。
医生通过界面上传图像,系统自动进行以下步骤:
使用向量数据库可以大大加快医生访问和比较历史案例的速度,提高工作效率,并可能提高诊断的准确性。


嵌入(Embedding)设计

嵌入的核心思想是将每个单词或短语映射到一个高维空间(通常是数百到数千维)中的点。
这些点的相对位置可以表示不同单词之间的语义关系,例如同义词会在高维空间中彼此靠近,而无关的词则会相距较远。
举个例子:假设我们有三个单词:“猫”、“狗”和“汽车”。
在一个良好构建的嵌入空间中,“猫”和“狗”的向量会比“猫”和“汽车”的向量更为接近,因为“猫”和“狗”在语义上更相关(都是宠物),而“汽车”则与这两者在语义上相距较远。
设计步骤:
最近邻搜索

(, 下载次数: 0)


在D维空间中的查询向量q与一组向量x_1, x_2, ..., x_N进行比较,以找到最近的向量。
数学表达式是查询向量q与每个数据库向量x_n之间的平方欧几里得距离的argmin。
结果是查询q的最近向量x_74。

(, 下载次数: 0)


两种寻找最近邻的实现方式:
朴素实现非常直接,使用简单的循环计算q和x之间的平方差。
Faiss实现,对查询数量较少的情况(M <= 20)使用SIMD(单指令多数据)以及对查询数量较多的情况使用BLAS(基本线性代数子程序)进行计算。

(, 下载次数: 0)


上图介绍了,向量如何组装进SIMD寄存器以及计算过程以达到结果。
如何使用SIMD指令计算平方欧几里得距离,这些指令允许并行计算,可以显著加快计算速度。

(, 下载次数: 0)


如何利用SIMD和BLAS进行大规模矩阵计算。
上图展示了如何将查询向量和数据库向量堆叠成矩阵,并使用sgemm函数(BLAS的矩阵乘法函数)来高效计算内积。
它还指出了不同BLAS实现之间的性能差异,比如Intel MKL和OpenBLAS,其中Intel MKL报告称比OpenBLAS快30%。
主要主题是最近邻搜索的优化,特别关注如何使用高级技术如SIMD和优化的库如BLAS高效计算高维向量之间的距离。
结论是,通过使用这些高级技术,可以在最近邻搜索中实现显著的性能提升,这对于机器学习和数据检索中的许多应用至关重要。
近似近邻搜索

(, 下载次数: 0)


在不同数据规模下,原始数据与压缩数据处理的对比。
左侧是为原始数据设计的方法,如局部敏感哈希(LSH)、树/空间划分和图遍历,这些方法在较小规模的数据集上表现良好。
右侧是为压缩数据设计的方法,包括查找表和哈明距离基础上的线性扫描,适用于更大规模的数据集。
(, 下载次数: 0)


几乎与上图相同,但它标记了局部敏感哈希(LSH)方法,可能是为了强调这种方法在处理原始数据时的重要性。
MinHash-LSH 哈希模糊去重:如何解决医学大模型的大规模数据去重?
(, 下载次数: 0)


详细介绍了局部敏感哈希(LSH)的工作原理,它是一种通过哈希函数将相似项映射到相同符号的概率很高的技术。
图中展示了数据记录时如何应用多个哈希函数,并在搜索时如何使用相同的哈希函数来定位可能的候选项,然后通过欧几里得距离进行比较。

(, 下载次数: 0)


FLANN(Fast Library for Approximate Nearest Neighbors)是一个用于近似最近邻搜索的库,支持如随机化KD树和k均值树等数据结构。
它在2000年代末到2010年代初非常流行,已经被集成到OpenCV和PCL库中。
但FLANN的缺点是内存消耗大,且需要存储原始数据,目前也不再积极维护。
输入输出:
输入:一个查询向量和一个高维数据集。
输出:数据集中与查询向量最近的一个或多个最近邻向量。
  1. import numpy as np
  2. import pyflann
  3. # 创建一个FLANN对象
  4. flann = pyflann.FLANN()# 生成随机样本数据
  5. num_data =1000
  6. dim =10
  7. data = np.random.rand(num_data, dim).astype(np.float32)# 训练数据集
  8. flann.build_index(data, algorithm='kdtree')# 生成一个查询向量
  9. query = np.random.rand(dim).astype(np.float32)# 搜索最近邻
  10. result, _ = flann.nn_index(query, num_neighbors=5)# 输出最近邻的索引print(result)
复制代码
(, 下载次数: 0)


Annoy 是另一个用于近似最近邻搜索的库,使用“2均值树”和“多树”以及“共享优先队列”来提高搜索的效率和准确度。
它随机选择两点来划分空间,并递归地重复这个过程,以构建出层次化的树结构。
通过这种方式,Annoy能够快速定位查询点所在的单元格,并比较距离以找到最近邻。
  1. from annoy import AnnoyIndex
  2. # 初始化AnnoyIndex
  3. f =40# 维度
  4. t = AnnoyIndex(f,'angular')# 使用Angular距离# 添加数据到索引for i inrange(1000):
  5.     v =[np.random.gauss(0,1)for z inrange(f)]
  6.     t.add_item(i, v)# 构建索引
  7. t.build(10)# 10棵树# 保存索引
  8. t.save('test.ann')# 加载索引
  9. u = AnnoyIndex(f,'angular')
  10. u.load('test.ann')# 快速加载# 查询print(u.get_nns_by_item(0,3))# 查询与第0个向量最近的3个邻居
复制代码
(, 下载次数: 0)


PQ是一种将向量分割成子向量,并对每个子向量进行量化的方法,它简单且内存高效。
PQ通常通过对训练数据执行k均值聚类来事先训练,然后使用编码本来量化新的向量。
例如,在图像检索系统中,有一个高维的特征向量表示每个图像的内容。
PQ 可以用来减少这些特征向量的存储空间,同时保持能够快速检索相似图像的能力。
使用方法
在实际应用中,PQ通常与倒排索引结合使用,以在大型数据库中快速检索最近邻。
倒排索引允许系统只搜索与查询向量具有相似PQ编码的那些数据点,从而大大减少计算量。

主流向量数据库

(, 下载次数: 0)

全球主流向量数据库:Pinecone、Milvus、Vespa、Weaviate、Qdrant。
超过70%的向量数据库选择了开源,超过一半的向量数据库具有云化部署的能力。
大部分向量数据库产品在进行ANN相似性搜索时采用HNSW(Hierarchical Navigable Small World)算法。
(, 下载次数: 0)


对比每个向量数据库的特点、能力和架构选择。
(, 下载次数: 0)

Pinecone适用场景
适合需要完全托管解决方案的企业,不愿意或没有资源自己维护和管理数据库基础设施。
由于其支持水平扩展和实时索引更新,Pinecone非常适合动态数据集和实时搜索应用,如个性化推荐系统和实时监测系统。
(, 下载次数: 0)


Milvus 适用场景:
适合希望自主托管和拥有更大控制权的企业,特别是那些需要高度可扩展的搜索引擎和支持多种ANN算法的场合。
这可能包括大规模的相似性搜索任务,如图像或视频检索,以及在选择最佳算法方面需要灵活性的场景。
(, 下载次数: 0)


Vespa 适用场景
由于其低延迟处理大数据集的能力,Vespa适合需要高性能和实时查询的应用,如新闻文章、广告和推荐系统。
Vespa的可定制性和深度数据结构使其适合于复杂查询的场景,例如金融服务中的风险分析和实时决策支持。
(, 下载次数: 0)

Weaviate 适用场景
Weaviate的GraphQL-like接口和强大的问答组件使其非常适合需要复杂查询和自然语言处理能力的应用,如知识图谱、语义搜索和客户支持自动化。
它的接口友好性可能特别适合需要快速原型设计和演示的研发团队。
(, 下载次数: 0)

Qdrant 适用场景
Qdrant的优化器和扩展过滤支持使其适合需要高度优化和灵活查询规划的应用,如电子商务中的个性化推荐和多维度过滤。
其对动态查询规划和负载数据索引的支持还适用于需要处理各种类型数据的应用程序,包括地理位置数据和文本。

Milvus 实践

教程:https://milvus.io/docs
代码:https://github.com/milvus-io/milvus
基于您提供的描述,Milvus是一个强大的向量数据库系统,具有以下特点和架构层次:
特点:
架构层次:

Embedding 模型选择

Embedding中⽂模型排名:https://huggingface.co/spaces/mteb/leaderboard




原文地址:https://blog.csdn.net/qq_41739364/article/details/136164023




欢迎光临 AI创想 (http://llms-ai.com/) Powered by Discuz! X3.4