首页 > 数据库 >向量数据库

向量数据库

时间:2024-07-17 20:44:15浏览次数:12  
标签:数据库 索引 搜索 精度 https 聚类 向量

一:向量数据库原理

https://blog.csdn.net/zevjay/article/details/138022283

Faiss的核心在于其高效的索引结构和搜索算法

(一)索引结构

常见的索引结构包括:

Flat Index:最简单的索引结构,将所有向量存储在一起,适用于小规模数据集。搜索时需遍历整个数据集,计算查询向量与每个数据向量的相似度。

IVF (Inverted File Index) :基于聚类的思想,先将数据集划分为多个子集(聚类中心),再对每个子集内部使用其他索引结构(如Flat或Hierarchical Clustering)。搜索时先找到最相关的几个子集(近似搜索),再在子集中精确搜索。

HNSW (Hierarchical Navigable Small World) :基于图的近似最近邻搜索算法(K-近邻算法),构建多层图结构,每一层节点代表一个向量,节点间边代表相似度。搜索时通过层次跳跃快速缩小搜索范围,最终找到近似最近邻。https://www.cnblogs.com/ssyfj/p/13053055.html

https://nicksxs.me/2024/06/23/%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8BHNSW%E7%AE%97%E6%B3%95/

PCA (Principal Component Analysis) / Product Quantization:通过降维或量化技术压缩向量,减少存储空间和计算复杂度。https://zhuanlan.zhihu.com/p/534004381

意思是说将原始向量分解成若干个低维向量的笛卡尔积,并对分解得到的低维向量空间做量化,这样原始向量便能通过低维向量的量化code表示。
将N条D维向量分解,每个D维向量X分解成M组D/M维子向量Y,然后对每组子向量Y进行K-means聚类,这样每组子向量都可以有K个映射结果(每个结果可以用log2K位表示),最后原始向量就可以被压缩从D*32--->M*log2K 其中参数K=256和m=8被认为最佳参数,主要参数是m,如下
pq_m:子向量个数,影响压缩率与精度。一般设置为8或16,具体根据数据特性调整。
以文章例子来看:
  • 5w条1024维的数据,每条可以转为8*128(8组128维的子向量)---(每一维占一个int 32位)
  • 然后对每一组子向量(5w条128维)进行k-means聚类,这里设置聚成256类(256可以用8位表示)
  • 所以区别每个类只需要8bit,那么原始的一条数据1024*32位变成了8*8位

(二)搜索算法

Exact Search:精确搜索,计算查询向量与所有数据向量的相似度,返回最相似的结果。适用于数据量较小或对精度要求极高的场景。

Approximate Search:近似搜索,牺牲一定精度换取搜索速度,常用于大规模数据集。如IVF、HNSW等索引结构均支持近似搜索。

(三)索引类型选择和参数调优

根据数据集大小、查询速度要求、内存限制等因素,选择合适的索引类型至关重要。 小规模数据集(< 10^5向量):使用IndexFlatL2或IndexFlatIP进行精确搜索即可,简单且高效。
Flat 的意思是,入库的向量不会经过任何形式的预处理(例如归一化)或量化,它们以原始的、完整的形式存储。
并且在进行相似度检索时,会完整地扫库一次(俗称暴力搜索),所以它的计算结果一定是全局最优的

IndexFlatL2 是根据L2距离来衡量向量之间的相似度,L2距离越短,说明两个向量之间越相似
IndexFlatIP 则是根据内积(Inner Product)来衡量向量之间的相似度,内积越大,说明两个向量之间越相似
中等规模数据集(10^5 - 10^8向量):考虑使用IndexIVFFlat或IndexIVFPQ。前者基于聚类的近似搜索,后者结合了Product Quantization进一步压缩向量。根据内存和精度需求调整nlist(聚类中心数)和nprobe(搜索时访问的聚类中心数)参数
nlist:增大nlist可提高搜索速度,但可能导致精度下降。一般通过交叉验证确定最优值。
nprobe:增大nprobe可提高精度,但会增加搜索时间。在实际应用中,可设置为可配置项,根据实时性能需求动态调整。
大规模数据集(> 10^8向量):推荐使用IndexHNSW或IndexIVFPQ。前者基于图的近似搜索,后者结合了量化压缩。适当调整M(HNSW层数,影响搜索)efConstruction(构建图时扩展的邻居数量,影响构建)参数。
M:控制图的层数,影响搜索速度与精度。一般情况下,较大的M可提高精度,但会增加内存占用。可通过实验确定最优值。
efConstruction:构建图时扩展的邻居数量,影响索引构建时间和精度。通常设置为较大值(如200)以构建高质量图。

二:使用案例

https://soulteary.com/2022/09/03/vector-database-guide-talk-about-the-similarity-retrieval-technology-from-metaverse-big-company-faiss.html https://soulteary.com/2022/09/10/the-dimensionality-reduction-of-traditional-text-retrieval-methods-using-faiss-to-achieve-vector-semantic-retrieval.html <iframe style="display: none !important"></iframe>

标签:数据库,索引,搜索,精度,https,聚类,向量
From: https://www.cnblogs.com/ssyfj/p/18308236

相关文章

  • 数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附
    原文链接:http://tecdat.cn/?p=24973最近我们被客户要求撰写关于心脏病的研究报告,包括一些图形和统计输出。世界卫生组织估计全世界每年有1200万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病简介心血管疾病的早期预后可以帮助决定改变高危患者的生活方式,从......
  • 17-2 向量数据库之野望2 - 基础宝典
    介绍矢量数据库是一项技术,已成为不断变化的数据管理领域的重大变革者。凭借其无与伦比的速度和效率,这些尖端数据库正在彻底改变数据检索的规范。我们将在这次深入研究中探索矢量数据库的细微差别,理解其基本概念,并提供代码示例来展示其革命性的能力。传统关系型数据库难以满足......
  • mysql数据库常用命令
    mysql数据库创建表的内容需要声明数据类型,数据类型分为整数Int、浮点数也就是小数、字符串、日期时间data。如id的话需要用整数int,商品价格的话用浮点数,名字用字符串varchar(30)括号里面是字符串的长度。常用命令:1、声明要使用的数据库use名称;2、创建表createtabletest(......
  • 数据库的数据类型
    1.数值类型 整数类型(INTEGER):-INT:标准整数类型。-SMALLINT:较小范围的整数。(-32768-32767 ||0-65535)-TINYINT:更小范围的整数。(-128-127||0-255)-BIGINT:大范围的整数。(-9,223,372,036,854,775,808-9,223,372,036,854,775,807|| 0-18,446,744......
  • 如何免密登录数据库(8.0及5.7版本都可以)
    Mysql-8.0及之后因为mysql8.0之后–skip-grant-tables无效,需要在mysql的bin目录中使用mysqld--console--skip-grant-tables--shared-memory,来代替,(注意:需要先将服务停止:netstopmysql)然后在打开另一个cmd窗口,进行修改密码操作(mysql-uroot-p)之后会出一堆乱七八糟的东西......
  • Django中使用ORM语言对MYSQL数据库插入数据
    1.pycharm终端进入django中的shelldjango项目目录下输入命令:pythonmanage.pyshell2.新增数据2.1使用save()保存导入模型(类)、实例模型、调用save()方法验证结果2.2使用create()导入模型、调用create()方法验证结果2.3使用bulk_create批量新增多条记录导入模型......
  • 华为高斯数据库openGauss_5.0.2 企业版部署学习
    系统环境欧拉系统官方下载链接openEuler-22.03-LTS-SP4-x86_64-dvd.iso https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso openEuler下载|openEulerISO镜像|openEuler社区官网 数据库安......
  • 使用ETLCloud实现MySQL数据库与StarRocks数据库同步
    在现代数据架构中,数据同步是保证数据一致性和分析准确性的关键步骤之一。本文将介绍如何利用ETLCloud技术实现MySQL数据库与StarRocks数仓数据库的高效数据同步,以及其在数据管理和分析中的重要性。数据同步的重要性在数据驱动的时代,企业依赖于准确、实时的数据分析来做出战略决......
  • laravel 数据库迁移失败
    1.错误信息Migrating:2014_10_12_000000_create_users_tableIlluminate\Database\QueryExceptionSQLSTATE[42S01]:Basetableorviewalreadyexists:1050Table'users'alreadyexists(SQL:createtable`users`(`id`bigintunsignednotnull......
  • Oracle数据库中的分页查询
    分页关键词rownum和MySQL不同,MySQL中使用Limit进行分页实现,比如select*fromtlimit10,5实现了查询(10,10+5]范围内的数据。Oracle数据库不支持limit关键字,但是有rownum这一虚拟字段。rownumrownum是一个伪列,由数据库自己创建。rownum会在条件满足后、结果集确定后自动编......