在 RAG(檢索增強生成)場景中,非結構化數據(文本、圖像等)的高效檢索是核心需求。傳統關系型數據庫難以勝任,而向量數據庫通過將數據轉化為向量、基于相似度快速匹配,成為 RAG 的關鍵支撐。本文聚焦主流向量數據庫 Chroma 與 Milvus,解析其在 RAG 中的實戰應用與底層原理。
一、Chroma 實戰與底層原理
1. Chroma 簡介
- 定位:輕量級、易于使用的開源向量數據庫。
- 特點:安裝便捷、API簡潔、支持多種編程語言,適合快速開發和原型驗證。
2. Chroma 安裝
- 對于Python開發者,通過pip命令即可輕松安裝:
pip install chromadb
3. Chroma 基本操作
3.1 初始化客戶端
- 內存模式(開發階段快速測試):
import chromadb
from chromadb.config import Settingsclient = chromadb.Client(Settings(persist_directory=None # 數據不會持久化
))
- 持久化模式(需指定目錄):
client = chromadb.Client(Settings(persist_directory="./chroma_data" # 數據持久化到該目錄
))
3.2 創建集合(類似關系型數據庫的表):
collection = client.create_collection(name="my_collection")
3.3 添加數據
- 需提供文檔(documents)、文檔ID(ids),向量(embeddings)可選(不提供則用默認嵌入模型生成)。
documents = ["Chroma is a vector database","It is easy to use","Vector databases are useful for AI applications"
]
ids = ["doc1", "doc2", "doc3"]collection.add(documents=documents, ids=ids)
3.4 查詢數據
- 不提供查詢向量時,默認嵌入模型為查詢文本生成向量。
- 結果包含相似文檔ID、內容及相似度分數。
query = "What is Chroma?"
results = collection.query(query_texts=[query],n_results=2 # 返回最相似的2個結果
)print(results)
4. Chroma 底層原理
4.1 加速技術
- 批量處理向量數據,減少磁盤I/O操作,提高讀寫效率。
- 合理分配內存資源,將頻繁訪問的向量數據緩存到內存,加快查詢響應。
4.2 支持的索引
- Flat索引:存儲原始向量,查詢時計算與所有向量的距離,精度高但數據量大時速度慢,適合小規模數據。
- HNSW(Hierarchical Navigable Small World)索引:基于圖的近似最近鄰搜索索引,構建多層導航圖,在保證一定精度的前提下顯著提高查詢速度,適用于中大規模數據。
二、Milvus 實戰與底層原理
1. Milvus 簡介
- 定位:高性能、高可用的開源向量數據庫,專為海量向量數據的存儲、檢索和分析設計。
- 特點:支持多種索引類型,能處理大規模向量數據,擴展性和容錯性良好,適用于生產環境。
2. Milvus 安裝
2.1 推薦使用Docker Compose,先安裝Docker和Docker Compose。
2.2 下載配置文件:
wget https://github.com/milvus-io/milvus/releases/download/v2.3.4/milvus-standalone-docker-compose.yml -O docker-compose.yml
2.3 啟動Milvus(服務在本地19530端口運行):
docker-compose up -d
3. Milvus 基本操作
3.1 安裝Python SDK:
pip install pymilvus
3.2 連接到Milvus:
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataTypeconnections.connect("default", host="localhost", port="19530")
3.3 創建集合
# 定義字段
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
content_field = FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=512)
vector_field = FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768) # 向量維度為768# 定義集合schema
schema = CollectionSchema(fields=[id_field, content_field, vector_field], description="My collection")# 創建集合
collection = Collection(name="my_collection", schema=schema)
3.4 創建索引(以IVF_FLAT為例):
index_params = {"index_type": "IVF_FLAT","metric_type": "L2", # 歐氏距離"params": {"nlist": 128} # 聚類數量
}collection.create_index(field_name="vector", index_params=index_params)
3.5 插入數據
import random# 生成示例數據
data = [{"content": "Milvus is a vector database", "vector": [random.random() for _ in range(768)]},{"content": "It is high performance", "vector": [random.random() for _ in range(768)]},{"content": "It is suitable for large - scale data", "vector": [random.random() for _ in range(768)]}
]# 轉換數據格式
contents = [d["content"] for d in data]
vectors = [d["vector"] for d in data]# 插入數據
mr = collection.insert([contents, vectors])
print("Inserted ids:", mr.primary_keys)
3.6 加載集合并查詢
collection.load()# 生成查詢向量
query_vector = [random.random() for _ in range(768)]# 查詢參數
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}# 執行查詢
results = collection.search(data=[query_vector],anns_field="vector",param=search_params,limit=2, # 返回最相似的2個結果output_fields=["content"] # 返回content字段
)for result in results[0]:print(f"ID: {result.id}, Distance: {result.distance}, Content: {result.entity.get('content')}")
4. Milvus 底層原理
4.1 加速技術
- 分布式架構:將數據分布到多個節點并行處理,提高處理和查詢效率。
- 向量量化技術:將高維向量映射到低維空間,減少存儲和計算開銷。
- 異步IO、預取等機制優化數據訪問,提升系統性能。
4.2 支持的索引
- IVF_FLAT:先聚類向量為多個簇,查詢時在相似簇中搜索,精度較高,性能較好,適用于中大規模數據。
- IVF_SQ8:在IVF_FLAT基礎上對簇內向量標量量化,減少存儲和計算開銷,精度有一定損失,適合對存儲和性能要求高的場景。
- IVF_PQ:采用乘積量化,大幅減少存儲和計算成本,精度較低,適用于大規模數據且對精度要求不高的場景。
- HNSW:構建多層導航圖,在查詢速度和精度間平衡,適用于對查詢速度要求高的場景。
- RNSG:基于神經網絡的索引結構,在高維向量場景下表現較好。
三、Chroma v.s. Milvus 對比
1. 易用性
- Chroma:安裝和使用簡單,API簡潔直觀,適合初學者和快速開發。
- Milvus:安裝復雜,配置和操作需更多專業知識。
2. 性能與 scalability
- Chroma:小規模數據場景性能不錯,大規模數據處理和高并發能力較弱。
- Milvus:能處理大規模向量數據,支持多種索引,水平擴展能力好,適合生產環境高并發、大數據量場景。
3. 功能豐富度
- Chroma:注重簡潔性,功能相對基礎。
- Milvus:功能豐富,支持多種索引、分區、數據備份與恢復等,滿足復雜場景需求。
4. 底層技術差異
- 加速技術:Chroma依賴批量處理和內存緩存;Milvus采用分布式架構、向量量化等更復雜高效的技術。
- 索引支持:Milvus支持索引類型更多,適應場景更廣;Chroma索引較簡單,滿足基礎檢索需求。
四、總結
Chroma和Milvus各有優勢。
若需快速開發原型、處理小規模數據或對易用性要求高,選Chroma;
若需處理大規模數據、要求高性能高可用性并用于生產環境,選Milvus。
實際應用中,可依業務需求選擇,同時關注兩者更新,以更好發揮其作用。