前言
通過前面幾節的介紹,你應該對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 上。
實現層
從實現層上來說,至少目前看也是這樣。實現者的重心在 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 做點文章也能很好支持。
只是說,如果就圖片本身而言,你要很好的支持 query,需要采用 CNN 等大型卷積神經網絡來處理,有興趣的可以看看 Yolo,現在發展到YoloV10了,但最經典的我認為還是YoloV2,有時間我也會講下Yolo 系列的算法。今天先寫到這里