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

总结

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

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

相关推荐
阿童木写作14 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
冬奇Lab15 小时前
代码库知识库系列(06):把调用图编码进 Embedding——结构增强有效,但不够
人工智能
冬奇Lab15 小时前
开源项目第175期:Buzz — Jack Dorsey 的 Block 用 Nostr 重新定义团队协作,AI Agent 拥有自己的加密身份
人工智能·开源·资讯
AI分享猿15 小时前
游戏原画与建筑灵感:AI图像生成如何服务前期设计
人工智能·游戏
字节跳动视频云技术团队16 小时前
为什么 AI 视频,需要“懂生成”的画质增强
人工智能
后端小肥肠16 小时前
我做了个能一键搭建个人工作台的 Skill,已开源
人工智能·aigc·agent
码云之上16 小时前
AI Agent 工程化总览篇:从 Prompt 到 Harness
前端·人工智能
2501_9269783316 小时前
以说明书 DNA 为模板——完整 AGI 的结构图景
前端·人工智能·经验分享·笔记·ai写作
IT_陈寒16 小时前
Vite静态资源引用这个坑我踩得有点疼
前端·人工智能·后端