LLM应用开发与落地:chroma的近似搜索问题

背景

最近开始测试一个游戏客户的RAG模块,发现一个向量数据库中大家容易忽略的一个点:近邻搜索算法。一开始我们选择的是chroma作为向量数据库,因为chroma的用户接口和设计非常简单,而我偏向于简单。创建collection时设置的距离计算方式是 "hnsw:space": "cosine"。

但是在测试过程中发现,使用 “为什么宗族商店贡献每天都会减少?” 去向量数据库中查询的时候,发现无法查到最匹配的句子 “宗族商店贡献每天都会无故减少,这是什么原因?”。

入库问题

一开始我以为是bug,是不是这句话没有入到向量数据库,然后查询了下,发现这句话是在向量数据库中的,并且距离为0

distances: [[0.0]]documents: [['宗族商店贡献每天都会无故减少,这是什么原因?']]

然后我再单独写了个脚本用 “为什么宗族商店贡献每天都会减少?”这句话去搜索最近邻向量,确实没有查询到 “宗族商店贡献每天都会无故减少,这是什么原因?

向量计算问题

然后我怀疑是不是使用的embedding 模型计算这两个句子时计算出来的向量距离就是比较远。单独自己写了个生成这两个句子的向量并计算余弦距离的工具,计算出来发现结果是 0.02539,也符合预期。

chroma 的近邻查找算法

最后只能怀疑chroma的近邻搜索算法了。找了下chroma的资料,没有明确说是用什么近邻搜索算法,也没有更多的配置。但从设置距离计算公式的配置中的命名 "hnsw:space": "cosine"猜测是使用的 hnsw 算法。这是一种 Approximate Nearest Neighbor Search (ANNS) ,近似的最近邻搜索算法。但是我感觉还是chroma的实现有点问题,然后开始去对比其他向量数据库。

qdrant

快速看了一下其他向量数据库,发现 qdrant是少有几个做了准确率压测的,还支持 Quantization,可以在速度和准确率之间选择最适合自己的。详细见:https://qdrant.tech/documentation/guides/quantization/

我快速搭建了qdrant,把数据导入到qdrant后,在没有配置Quantization的情况下,可以通过 “为什么宗族商店贡献每天都会减少?”去搜索最近邻向量,返回了 “宗族商店贡献每天都会无故减少,这是什么原因?” ,详细如下:

[ScoredPoint(id=120000, version=508, score=0.9746094, payload={'a': 12, 'q': '宗族商店贡献每天都会无故减少,这是什么原因?'}, vector=None, shard_key=None)]

也是用cosine计算距离,这里的1 - score 就是距离,跟之前计算出来的 0.02539 对得上。所以即使都是hnsw算法,不同的实现出来的准确率还是不一样的。

hnsw 算法

关于hnsw 这种近似的最近邻搜索算法网上文章很多,大家感兴趣的去搜索一下即可。之前遇到这些算法我都会去细究,毕竟我也是打ACM过来的,但是现在实在没有时间。AI这块发展太快了,这么多年学习过来的感触是知识真的学不完,需要再学吧。

总结

网上很多介绍向量数据库的,基本都是浅浅带过,或者把文档中文翻译一下。很多东西还是得亲自去实践过后才知道很多细节。选择向量数据库还是得看下索引实现方式,是否支持量化索引,响应速度,准确率等等。

纸上得来终觉浅,绝知此事要躬行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值