向量检索学习记录

1、Faiss

2、PQ量化

  • 预训练:2步 cluster(聚类) + assign(分配) (假设原始向量为128维, 切分4段每段32维度,假设聚类中心数nlist为256)
    • cluster-1 把集合中每个128维向量的切分成4个32维的;
    • cluster-2 在切分完的每个32维向量组内进行聚类,得到256个聚类中心点(一般是固定的)

  • assign-1 由于nlist取256, 那么每个聚类中心可以用8bit表示(2^8 == 256);
  • assign-2 那么每个128维的原始向量经过量化编码之后就可以用4个8位表示,如上图右侧
    • 有128维压缩成了4维,4维中的每一维数字代表的是当前段所属的聚类中心id
  • 检索

  • 对于量化后向量集合进行检索的方式有2种;ADC(非对称距离)及SDC(对称距离),后面的讲解是ADC的检索方式:
    • query向量也切分为预训练中的4段,每段计算与预训练好的256个中心的距离【此处为4*256次32维向量的距离运算】,得到query向量与256个聚类中心距离的表; 4*256
    • 此时,库的向量已经被量化成4个簇心 ID(assign-2中说的),而query向量的4段子向量与各自的256个簇心距离已经预计算好了,所以在计算两个向量的时候只用查4次表【由于有N个待对比向量,所以此处是4*N次查表】;
    • 比如库里的某个向量被量化成了[124, 56, 132, 222], 那么首先查表得到query向量第一段子向量与其ID为124的簇心的距离,然后再查表得到query向量第二段子向量与其ID为56的簇心的距离......最后就可以得到四个距离d1、d2、d3、d4,query向量跟库里向量的距离d = d1+d2+d3+d4。
    • 效率对比:所以在提出的例子里面,使用PQ只用4×256次32维向量距离计算加上4xN次查表,而最原始的暴力计算则有N次128维向量距离计算,很显然随着向量个数N的增加,后者相较于前者会越来越耗时;

3、IVFPQ

  • IVFPQ(Inverted File + PQ)(传统PQ的检索加速,本质:空间分割+快速定位x个子空间+在x个子空间内进行遍历)
    • PQ搜索过程中,会进行全空间遍历,即会遍历库里的全部向量并进行距离计算及查表【4*256次32维向量的距离运算 + 4*N次查表】,效率还可以提高
    • IVFPQ优化本质:将全局遍历锁定为感兴趣区域,则可以避免不必要的全局计算及排序;

  • 实现方式
    • PQ量化之前,增加了一个粗量化过程
    • 直接对库里所有向量做KMeans Clustering,假设簇心个数为1024
    • 每来一个query向量,首先计算其与1024个粗聚类簇心的距离,然后选择距离最近的top N个簇
    • 对topN个簇下的向量(PQ量化之后的)进行遍历及距离计算,找到最相似的topK
    • Faiss具体实现有一个小细节,提高计算精度:就是在计算查询向量和一个簇底下的向量的距离的时候,所有向量都会被转化成与簇心的残差,这应该就是类似于归一化的操作,使得后面用PQ计算距离更准确一点
    • 使用IVF过后,需要计算距离的向量个数就少了几个数量级,最终向量检索就变成一个很快的操作
  • faiss支持的索引模式
    • IndexFlatL2 暴力检索
      • 最基础的Index,精确
    • IndexIVFFlat
      • 为了加快搜索速度,可以将数据集分割成几部分。我们在d维空间中定义Voronoi单元格,并且每个数据库矢量都落入其中一个单元格中。在搜索时,只要查询x所在单元中包含的数据库向量y与少数几个相邻查询向量进行比较。(划分搜索空间)
    • IndexIVFPQ
      • 有损存储
      • 我们看到的索引IndexFlatL2和IndexIVFFlat都存储完整的向量。 为了扩展到非常大的数据集,Faiss提供了基于产品量化器的有损压缩来压缩存储的向量的变体。压缩的方法基于乘积量化(Product Quantizer)。
      • 在这种情况下,由于矢量没有精确存储,搜索方法返回的距离也是近似值

4、优化方式

  1. 量化压缩(压缩特征向量维度)
    1. PQ乘积量化

6、参考

### DeepSeek 向量检索模型概述 DeepSeek向量检索模型旨在提供高效、精准的内容匹配服务,适用于多种应用场景,如文档检索、推荐系统等。为了帮助用户更好地理解和应用该模型,以下是详细的使用指南和最佳实践。 ### 安装指南 对于希望在本地环境中部署并测试DeepSeek向量检索模型的用户而言,遵循以下指导可以顺利完成安装过程: #### 准备工作环境 确保已配置好Python开发环境,并且具备必要的依赖项管理工具(pip)。此外,考虑到性能优化的需求,在支持CUDA加速的硬件上运行将显著提升效率[^2]。 #### 获取模型文件 访问官方资源页面下载最新的预训练权重以及配套脚本;注意确认所选版本与目标平台兼容性良好。通常情况下,模型会被打包成压缩包形式分发给最终使用者。 #### 配置启动参数 利用`accelerate`命令行工具来简化跨多个GPU设备上的分布式计算任务设置。通过指定相应的选项调整并发处理能力及其他高级特性开关状态,例如混合精度浮点运算模式(`--mixed_precision`)可有效减少内存占用同时加快推理速度。 ```bash accelerate launch \ --num_processes 4 \ --mixed_precision fp16 \ deepseek_serving.py \ --model_path ./deepseek-llm-7b-chat \ --batch_size 32 ``` 上述实例展示了如何基于四个进程执行多GPU分布式的模型加载和服务端口开启操作,其中还包含了针对特定路径下的大型语言模型实例化时所需的批量大小设定。 ### 使用教程 当完成初步搭建之后,便可以通过API接口调用来实现具体业务逻辑交互。下面列举了一些常见的请求范例供参考学习: - **索引构建**:上传待查询的数据集至服务器端进行特征提取及存储结构创建; - **相似度搜索**:提交关键词表达式获取最接近的结果列表及其对应得分值; - **实时更新**:允许动态修改已有记录或新增条目而不影响在线服务能力连续性。 值得注意的是,随着每次迭代更新,可能会引入新的特性和改进之处,因此建议经常查阅官方发布的变更日志以便及时跟进变化趋势[^1]。 ### 最佳实践 为了充分发挥DeepSeek向量检索系统的潜力,这里给出几条实用性的建议: - 尽可能采用高质量标注样本作为输入源材料,这有助于提高召回率和准确性; - 结合实际需求灵活调节超参组合方案,找到平衡点所在从而达到最优解效果; - 积极参与到社区交流活动中去分享经验教训同时也汲取他人智慧结晶。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值