向量搜索优化3板斧: 空间、性能、召回(recall)
文中参考文档在github需点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
关注公众号, 持续发布PostgreSQL、PolarDB、DuckDB等相关文章.
向量搜索优化3板斧: 空间、性能、召回(recall)
向量搜索是近似求解, 并不是以返回精确结果为目标. 使用向量搜索要在这“空间、性能、召回”三个方面取一个平衡.
1、空间包括
表的空间占用
索引的空间占用
2、性能包括
创建索引的速度
表/索引膨胀后, 维护索引的速度
有向量索引的情况下, 向量记录的写入速度
向量数据近似搜索查询速度
向量条件 及 标量条件的混合搜索速度
3、召回指
召回正确率
优化思路
为了达到3者的平衡, 可以从以下几个方面入手优化:
1、向量维数, 例如
vec[n], n就是向量维数, 通向量维数常由模型来决定, 模型训练的数据含量越大(非重复数据, 非同质化数据), 可能需要越多的维数来进行表达; 私有知识库也一样, 数据含量越大(非重复数据, 非同质化数据), 则需要越多的维数, 将非结构化数据映射到对应的向量空间.维数越多, 需要越多的空间来存储一个向量值.
2、向量精度, 指每一个向量维度上的取值范围, 例如float32[n], 这里的float32就是向量精度, 代表一个向量中某个维度的数据类型. float32[16], 表示16个维度, 每个维度由1个float32类型表示.
向量精度通常也是取决于模型的要求, 精度越高, 需要更多的存储空间.
3、创建索引时的参数、向量搜索时的参数.
直接影响召回率、创建索引的效率.
1和2是先天优化, 通过降低维数、降低精度来控制空间占用(一定程度也能提升性能), 不断逼近能容忍的最小召回率. 例如128维数降低到64维数; float32降低到float16、int(1byte)甚至bit (float16容易理解, 降到bit是什么鬼? 其实也比较容易理解, 就是<=0用0表示, >0用1表示, 这不就只需要1个bit么.). 参考 https://jkatz05.com/post/postgres/pgvector-scalar-binary-quantization/
3是后天优化, 通过调整参数, 在满足召回条数的情况下, 不断逼近能容忍的最小召回率. 参考 《头大! 索引扫描和全表扫描结果不一样, 这向量数据库还能用? 教你一招大幅提升召回率(recall)》
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:
文章中的参考文档请点击阅读原文获得.