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

背景

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

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

入库问题

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

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

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

向量计算问题

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

chroma 的近邻查找算法

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

qdrant

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

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

python 复制代码
[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这块发展太快了,这么多年学习过来的感触是知识真的学不完,需要再学吧。

总结

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

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

相关推荐
冬奇Lab2 小时前
每日一个开源项目(第140篇):AgentScope 2.0 - 阿里开源的生产级 Agent 框架
人工智能·开源·agent
冬奇Lab2 小时前
Skill 系列(04):Skill 指标体系——L1/L2/L3 三层监控,让质量下降有据可查
人工智能·开源·llm
IT_陈寒4 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
玩转AI不是事4 小时前
用IndexedDB做AI对话离线缓存实战
人工智能
Asize5 小时前
多模态生图:从 Vite 工程化到前端调用 Qwen Image
javascript·人工智能·后端
MobotStone5 小时前
AI项目越多,为什么越容易失控
人工智能·aigc
十有八七5 小时前
AI时代的置身X内
前端·人工智能
Lkstar5 小时前
A2A协议深度解析|Agent2Agent通信标准,智能体互联网的"HTTP"
人工智能·llm
百度Geek说5 小时前
当代码越来越便宜,什么在变贵?
人工智能
橘子星5 小时前
LLM 无状态架构实践:从原理到代码落地
前端·javascript·人工智能