论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
数据库
›
向量数据库
›
向量数据库原理解析
向量数据库原理解析
渣渣兔
论坛元老
|
2025-4-9 22:06:22
|
显示全部楼层
|
阅读模式
楼主
主题
1772
|
帖子
1772
|
积分
5316
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
基础的向量数据库原理想必都很熟了,其核心就是对于所有要查询的query embedding,找一个或多个与其最相似的data embedding。
向量数据库做成对embedding得相似度盘算很简单,难就难在:你面对的是一个可能存储几十万几百万embedding的数据库,对于恣意一个来访的embedding,你真的要遍历这几百万数据库吗?
为了搜索服从,各种框架就要开始发力了。
最简单的方法
假如你能提前把embedding分到几个独立的数据库里,例如这个库存储百科信息,那个库存储金融专业信息,则单个数据库就会比力小了,再让rag通过意图辨认的方式路由到子数据库。
这个方法只能常数级别缓解,但是也是须要的。
k-means
你使用聚类算法,或几十个embedding为一组,或几百个embedding为一组,求组内的mean embedding来代表这一个组,那么你能以更大的常数级别削减你所要检索的embedding数量。你找到了top-k最相似的组,就再从这些组里面细化地检索最相似向量。
位置敏感hash(LSH)
这是一种聚类方法的变体。之所以用它,我觉得是因为聚类方法要提前设定聚类数量, 而且要迭代很多次,盘算起来很耗时。
LSH是一种期望将位置相近的向量映射到相近编码空间上的方法。举一个简单的例子,我假如在平面上随机地画128个超平面,并让每个超平面的上侧embedding计为1,下侧为0,就这样为每个embedding编码出128位0-1编码,那么来了一个查询embedding,它同样有个编码,我自然以为与其编码类似的那一批embedding是与其近来的。那么我会提前把每个01编码看作一个bucket,里面存的都是编码类似的embedding,用的时间直接查找拿bucket就行,然后再细查。
LSH改良
由于随机画超平面来做01编码的方法存在随机性,会出现“明明相近,但被超平面分开”的偶合。这无法避免,但可以缓解。一般来说,会通太过割embedding的方式做到。例如embedding dim为1024,我会把它切成8段,每一段都单独土地算LSH,就有了8个桶集合。我查询的时间,把自己也分成8段,去找对应的集合里面编码类似的桶,找出8个子集。显然,这种方法能够大大缓解由一次LSH导致的偶合。
k-measn改良(积量化PQ)
k-means也会有题目,你的embedding空间太大了,k设几十万都不够。如何解决?也是分割embedding。1024的embedding维度,我分成64段,每段16维,那么可能每段只需要k=256就够聚类了。然后我就有了一个64个值、每个值值域为1~256的序列,用于表示一个1024的embedding在每个子空间里聚类的环境。这不光是从1024->64维的降维,每个单元也从float32的32位降到了256的8位。
导航小世界NSW
这是基于图布局的导航搜索算法。
假设我们已经为离散的点基于某种方法(例如k-means,德劳内三角剖分法)构建了一个拓扑图,那么我们可以通过一个未经理论证明的猜想“6人猜想:恣意两个人,只需要6个中间人,就可以形成关系”实现快速搜索。
该算法这样搞:对于一个查询向量S,随机一个图数据库中的embedding A为起始点,然后探求A的邻人,找到其中与S相似度最高的B,B再找其邻人,再与S算相似度…这样能快速找到最相近的节点。
分层导航小世界HNSW
实在NSW还不够快,一步步挪太慢了。之所以一步步挪,是因为我们构建拓扑图时,就是这么构建的。而且我们可以直观地想到,在从A开始时,你完全不必纠结于步子太大,只要最后够小就行。
那如何构建一个有长隔断拓扑关系的图呢?指数衰减概率分布可以用来指导一个新加入的embedding是否应该一次次地出现在更高、更粗糙拓扑图上的概率。
假如我要搞6层分层,0为最底层,1~6为导航层,新加入的点A一定会出现在0层,然后在0层使用德劳内三角法构建拓扑。A以指数衰减概率抛硬币,判定其是否出现在1层,出现,则在1层加入A,然后用德劳内三角。就这样一直往上。
?题目:每一层构建拓扑时,要求每个新增节点要与至少M个近邻节点连接,这本质上也是一次搜索,这要怎么做?
我觉得HNSW前期应使用德劳内三角,后期由于每一层节点已经不少了,直接用其自己的方法导航找到近来的K个就行。
最小天生树算法
构建拓扑确实很难,所以想了很多方法。最小天生树算法是一种图论算法,从某个节点出发,每次添加的节点都要求与已有节点的隔断最小。这种方法不像k-nn只围着自己一圈形成菊花状局部拓扑。
实际应用时,仍旧是靠HNSW自己找k个相近节点,然后构建一个全连接子图,在这上面找出一个最小天生树。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
渣渣兔
论坛元老
这个人很懒什么都没写!
楼主热帖
事务的ACID特性
SqlServer2012升级到SqlServer2016
深度干货!一篇Paper带您读懂HTAP | St ...
DCM: 中间件家族迎来新成员
(内附源码)Node.js小试——使用Node ...
SaaS软件工程师成长路径
iOS事件传递链与响应链
arthas使用介绍
go-zero单体服务使用泛型简化注册Handl ...
Java后端05(初识MyBatis)
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表