前言
通过前面几节的介绍,你应该对Chroma的运作原理有相当透彻的理解。Chroma的设计正如之前描述的:
Chroma提供的工具:
存储文档数据和它们的元数据:store embeddings and their metadata
嵌入:embed documents and queries
搜索: search embeddings
Chroma在设计上优先考虑:
足够简单并且提升开发者效率:simplicity and developer productivity
搜索之上再分析:analysis on top of search
追求快(性能): it also happens to be very quick
它非常适合在属于自己的垂直LLM RAG库上运行。当你的应用主要集中在LLM领域,且要求最好能本地快速部署,又需要兼顾查询效率时,Chroma 绝对是你的local LLM RAG首选。但不得不说,任何事物都有他的限制。说直白点,还是应用场景。如果你的应用或存储信息维度超过了 文本,元数据,url 这些内容,逐步向图片,甚至影音过渡时,Chroma 就显得有些力不从心。我会从代码逻辑及整体思路上给出分析。但熟悉Chroma 的朋友都知道,他有user 交互模块并不断update,毕竟Chroma vector DB 的API 接口适配了目前所有vector DB 共同遵循的接口,未来根据适用场景,包含client 模式,server模式,local 模式,同样会衍生出其他功能的版本。只是当下判断,如果你的应用聚焦在图片或是影音应用,Chroma不是很好的选择。
Chroma场景及限制
机制层
LLM处理的核心,query的语义相似度查询。你如果非常熟悉我前面的几篇文章,Chroma采用了 暴力+HNSW 结合的方式,或者你说是KNN query 也对,进行query 分析。底层采用了 consine,l2,ip 丈量distance方式。
需要指出的是 cosine 方式并不适合做picture,甚至 audio,video 的相似度处理查询处理。提到检测相似度,你可能第一反应就是 cosine 比较,这本身没有问题,但问题是被比较的事物是否可以很好的被向量化,或者说在比较事物向量化的过程中,他们是否丢失了很多信息。LLM与audio , video 的最大不同,前者在于语义相关,后者在于大量信息的存储相关。语义相关的问题,被高维向量表达后,依然能保持其语义的基本特征。虽然这种特征是面向计算机的,就像LLM中的 encoder,attention,decoder 一样。但你如果把audio,video用高维向量进行编码压缩,丢失的信息可能太多,这也是为什么LLM model 与 pictures,audio,video model 中使用的手段不同的原因。在LLM中你很少看到大量 CNN 卷积网络被使用,而在视频相关领域,为了捕获图片,视频等信息,需要多个 filter对甚至一张 picture进行轮番迭代,以求计算机能很好的把握住他的特征。比如相关的yolo 识别物体的训练,无论是v几版本,你可以看到神经网络路径都比较长,且经过多步卷积,池化等操作。所以这也就能说明为什么Chroma 可能在图像方面并不合适的原因。毕竟实现原理及思路限制了他的用途,当然你也可以反过来说,压根我Chroma 就不是为图而生的,我的目标在LLM领域。但另一个vector db, milvus 似乎支持了图片,甚至是audio,video,有时间我再写写他们。但是这里依旧是聚焦在 chroma 上。
但从另一个维度讲,你可能想到了另一个思路,如果说我的embedding后,内容足够好,也是可以的。确实,如果只是做图片比较,的确可以通过使用ResNet-50 等model 对图片进行编码。最后形成类似2048 维的 dim 存到Chroma中。这是另一种可能的解决思路。
实现层
从实现层上来说,至少目前看也是这样。实现者的重心在 LLM,并不在图片上。我们可以看到下面的源码:
这是 collection的add 实现源码:
紧接着,你看到 images 被无情的抛弃了,是我哪里不好吗?你要抛弃我,其实不是,只是在后面 add 的时候,在 collection 的 add 上,就没有image 什么事情了,继续看源码:
很清楚,image 已经没有了。Chroma在底层处理时,虽然想到了image,从给出的sqlite3的数据库字段描述来说,还是有image 的容身之地,但是毕竟可能不太完整。
但尽管如此,chroma 在 LLM 的处理上,非常优秀,而且体积很小,只有7.5k,可以说是 目前 local RAG 最漂亮的实现。你读完了他的源码,内功一定会得到增强。今天就先写到这里。
如何应对图片及video的query
万事都有折中方案,虽然Chroma对image支持目前来说,不太好,但压根儿那就不是别人的强项,主赛道还是在LLM上。如果我硬要用Chroma 可不可以支持图片呢?答案是肯定的,前面我也提过,你可以在uris 做点文章,在 embedding 训练过程中做点文章也能很好支持。
只是说,如果就图片本身而言,你要很好的支持 query,需要采用 CNN 等大型卷积神经网络来处理,有兴趣的可以看看 Yolo,现在发展到YoloV10了,但最经典的我认为还是YoloV2,有时间我也会讲下Yolo 系列的算法。今天先写到这里