背景
最近开始测试一个游戏客户的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的实现有点

文章讲述了作者在测试游戏客户RAG模块时,遇到向量数据库Chroma的近邻搜索算法问题。通过实例发现Chroma在处理特定文本查询时效果不佳,进而尝试QDRANT并发现其在准确率上有显著改善。作者强调实践中了解索引实现和参数的重要性。

3266

被折叠的 条评论
为什么被折叠?



