Vector Database比較
想要實作RAG前,必須先選個Vector DB 來儲存你embedding的資料囉,下面這些筆者選了幾款
常見的來做介紹,最後會再推薦為何自己會選用哪一款來實作唷
![image](https://hackmd.io/_uploads/rk7RcEzOR.png)
Vector databases use special search techniques known as Approximate Nearest Neighbor (ANN) search, which includes methods like hashing and graph-based searches.
圖片來源
Chroma
主要用途:向量數據庫
部署選項:本地和雲端
核心技術:HNSW(Hierarchical Navigable Small World)
性能:高
可擴展性:高
集成選項:Python
優點:
- 簡單易用,支持多種部署
- 支持多種距離度量方式
- 開源,社區驅動
缺點:
- 社區支持相對較少,企業級支持有限
Milvus
主要用途:向量數據庫
部署選項:本地和雲端
核心技術:多種距離度量和ANN(Approximate Nearest Neighbor)算法,包括 HNSW、IVF_FLAT、IVF_SQ8、IVF_PQ、RNSG、ANNOY
性能:高
可擴展性:高
集成選項:Python, Java, Go, C++
優點:
- 強大的向量數據管理和靈活部署
- 支持多種算法和距離度量方式
- 社區活躍,有企業支持
缺點:
- 需要專業知識來設置和優化
PostgreSQL
主要用途:關係型數據庫,支持向量數據
部署選項:本地和雲端
核心技術:pgvector(PostgreSQL 的向量搜索擴展)
性能:中
可擴展性:中
集成選項:多種編程語言支持,包括 Python, Java, Go 等
優點:
- 關係型數據庫功能強大,支持向量數據
- 開源,廣泛使用和支持
- 支持複雜查詢和事務
缺點:
- 向量數據搜索性能有限,無法與專用向量數據庫相比
Pinecone
![image](https://hackmd.io/_uploads/BkWenEM_R.png)
圖片來源
主要用途:專為高性能向量搜索設計
部署選項:僅雲端託管
核心技術:近似最近鄰(ANN)搜索
性能:高
可擴展性:高
集成選項:TensorFlow, PyTorch
優點:
- 專為向量數據設計,高性能和可擴展性
- 雲原生,無需管理基礎設施
- 集成流行的機器學習框架
缺點:
- 僅雲端託管,無法本地部署
Elasticsearch
主要用途:多功能分佈式搜索和分析
部署選項:本地和雲端
核心技術:倒排索引, HNSW
性能:高
可擴展性:高
集成選項:多種插件和自定義選項
優點:
- 多功能,支持混合搜索和實時數據索引
- 高度可擴展,支持大規模數據處理
- 強大的社區和企業支持
缺點:
- 需要額外的設置和管理來實現最佳性能
Redis
主要用途:高性能內存數據庫,支持實時應用
部署選項:本地和雲端
核心技術:RedisAI, RedisGears
性能:高
可擴展性:中
集成選項:多種部署選項
優點:
- 速度快,適合實時應用
- 支持多種數據結構和操作
- 開源,廣泛使用和支持
缺點:
- 傳統上不是向量數據庫,需要模塊支持
Qdrant
-
主要用途:向量數據庫
-
部署選項:本地和雲端
-
核心技術:HNSW(Hierarchical Navigable Small World)
-
性能:高
-
可擴展性:高
-
集成選項:Python, REST API, gRPC
-
優點:
- 開源,支持多種部署
- 強大的社區支持
- 支持高性能向量搜索
- 靈活的集成選項,包括 REST API 和 gRPC
- 支持多種距離度量方式,適合各種應用場景
- 提供企業級支持和服務
缺點
- 相對較新的技術,可能需要一些學習和適應
- 部分功能和最佳實踐可能需要探索和實驗
MongoDB Atlas
主要用途:雲數據庫與搜索集成
部署選項:僅雲端託管
核心技術:HNSW
性能:中
可擴展性:中
集成選項:MongoDB生態系統
優點:
- 集成簡單,減少操作負擔
- 結合 MongoDB 的強大功能和 Lucene 搜索引擎
- 雲端託管,無需管理基礎設施
- 適合需要簡單集成和管理的應用
缺點:
- 對大規模向量搜索效果不佳
- 僅支持雲端託管,缺乏本地部署選項
- 搜索性能和可擴展性不如專用的向量數據庫
應用場景:
專用的向量數據庫如 Pinecone 或 Milvus 可能是最佳選擇。
Elasticsearch
筆者Vector DB選擇
筆者自己是選用Mongo DB Atlas來做為我存向量的DB,主要基於其靈活的資料結構(不局限於只儲存向量),還具備了高效的全文和向量檢索功能、擴展性、資料聚合能力,以及與最新技術的良好整合性(eg. LangChain、Python等都特別提供套件串接)。這些特點使得它能夠有效地支持複雜且大型的 RAG 系統,同時降低開發和運維的難度
選用 MongoDB Atlas 作為實作 Retrieval-Augmented Generation (RAG) 資料庫有以下幾個主要理由和解釋:
1. 文件導向資料結構
-
解釋: MongoDB 是一個文件導向的 NoSQL 資料庫,它以 BSON(類似 JSON)格式存儲資料。這使得它特別適合存儲和檢索非結構化或半結構化資料,如文本、元數據和嵌套文件結構,這些通常是 RAG 系統中的核心元素。
-
優勢: 文本資料(如文章、文件段落)可以自然地存儲在 MongoDB 中,並且能夠靈活地調整和查詢,而不需要提前定義嚴格的資料結構。
2. 強大的全文檢索能力
-
解釋: MongoDB Atlas 提供了強大的內建全文檢索功能,可以針對文本內容進行高效的檢索,這在 RAG 系統中至關重要。
-
優勢: 使用 MongoDB 的全文檢索功能,可以實現快速的文本檢索和匹配,進而提高資料檢索的速度和準確性,特別是在大型資料集上。
3. 支援向量搜尋功能
-
解釋: MongoDB Atlas 現在支援原生的向量搜尋功能,這對於 RAG 系統來說至關重要,因為 RAG 通常需要基於語義相似度來檢索相關資料。
-
優勢: 可以將文本資料轉換為嵌入向量,並使用 MongoDB 的向量搜尋來快速找到與用戶查詢最相似的資料,這大大提升了檢索的效果和效率。
4. 擴展性與高可用性
-
解釋: MongoDB Atlas 是一個完全管理的雲端資料庫服務,提供自動擴展和高可用性,能夠輕鬆處理大規模資料集和高並發查詢。
-
優勢: 在實作 RAG 系統時,資料量和查詢頻率可能會隨著應用的使用增長。MongoDB Atlas 能夠根據需求自動擴展並保證服務的穩定性,減少運維負擔。
5. 資料模型靈活性
-
解釋: MongoDB 提供了靈活的資料模型,允許資料結構隨著需求的變化而演進,這對於 RAG 系統的開發和維護非常有利。
-
優勢: 你可以根據不同的 RAG 應用場景來調整資料結構,如增強資料中的元數據、記錄用戶交互歷史等,這些變化不會影響系統的穩定性和性能。
6. 高效的資料聚合和分析
-
解釋: MongoDB 擁有強大的聚合框架,允許對資料進行複雜的查詢和分析,這在 RAG 系統中可能需要對檢索結果進行進一步處理和篩選。
-
優勢: 可以通過 MongoDB 的聚合框架來實現基於條件的檢索結果過濾、分組和排序,從而精確地提供符合用戶需求的資料。
7. 與其他工具的整合性
-
解釋: MongoDB Atlas 可以無縫整合到現有的技術棧中,支援與各種分析工具、機器學習框架和應用程式進行整合。
-
優勢: 在構建 RAG 系統時,可以輕鬆地與其他資料源、分析平台(如 Grafana、Elasticsearch)和機器學習工具(如 TensorFlow、PyTorch)進行整合,擴展系統功能。
MongoDB Atlas 搜索算法
![image](https://hackmd.io/_uploads/BkoSDSfdR.png)
圖片來源
使用 Apache Lucene 並在 Atlas 集群的每個節點上與 mongod process一起運行
- Atlas Search 的核心是 mongot (由API跟Apache Lucene組成,API主要用來跟mongod通訊),mongot 負責創建search index、監控文檔的變更流以及處理搜索查詢
- Mongod
負責數據庫的主要操作,包括數據存儲、數據處理和數據檢索。它處理來自客戶端的讀寫請求,執行數據庫操作,並確保數據的一致性和持久性
流程:
- User 先在 Atlas UI、API 或 CLI 中創建和配置索引規則(決定哪些字段需要被索引以及如何處理),在日後user進行search時,就會自動進行查找和過濾
- User可透過mongosh、Compass 或 Drivers 發送搜索查詢(如 $search)請求
- Mongod收到後,發送查詢請求給mongot進行處理
- mongot使用索引進行查找和過濾:使用 Lucene 搜索引擎來處理查詢。Lucene 會根據已建立的index rules快速查找和過濾出匹配的文檔
在於它已經預先對數據進行了分類和結構化,這樣在查詢時可以快速定位和檢索相關數據,而不需要掃描整個數據庫)
- mongot使用內部的 API 與 Mongod 進行交互,將查詢結果返回給 Mongod
- Mongod 將查詢結果返回給用戶,user可透過compass、mongosh、drivers去查看使用
下一回將詳細介紹一下MongoDB Atlas,
接下來就要開始實作RAG囉!