chroma 一步步使用
安裝
# 安裝chromadb
pip install chromadb,sentence_transformers# 不啟動服務會出現sock.connect(sa)TimeoutError: timed out
chroma run
服務啟動后,您將看到類似以下輸出:
建立連接
部署完成后,需要建立與Chroma服務的連接:
import chromadb# 創建了臨時客戶端。程序終止時,您提取的任何數據都會丟失
client = chromadb.Client()
創建向量集合
chroma連接若直接創建集合(“Collection”(集合)是存儲向量的基本單位,類似于關系型數據庫中的表),會使用內置的嵌入模型all-MiniLM-L6-v2
。
# 首先導入embedding模型
from chromadb.utils import embedding_functionscollection = chroma_client.create_collection(name="my_collection")
collection.add(documents=["關于深度學習技術的文檔","關于的愛情小說文檔"],ids=["id1", "id2"]
)
print(collection)
chroma默認使用歐氏距離計算向量相似度
查詢文檔
Chroma提供多種查詢方式,滿足不同場景需求:
1. 基于ID查詢
當你知道確切的文檔ID時,可以直接查詢:
# 根據ID獲取文檔
result = collection.get(ids=["id1"]
)
2. 語義向量檢索
RAG系統的核心功能是語義檢索,基于查詢與文檔的語義相似度:
# 語義檢索
# Chroma 默認會返回 10 條結果。這里我們只添加了 2 個文檔,因此我們設置n_results=2
results = collection.query(query_texts=["如何使用向量數據庫?"],n_results=2
)
print(results)
工程中優化
混合檢索
Chroma還支持將全文匹配與向量檢索結合:
# 全文匹配 + 向量檢索
results = collection.query(query_texts=["檢索技術的應用"],n_results=2,where_document={"$contains": "檢索"}, # 文檔必須包含"檢索"一詞include=["documents", "metadatas"]
)
Chroma支持將向量檢索與元數據過濾結合,實現更精準的查詢:
# 元數據過濾 + 向量檢索
results = collection.query(query_texts=["大語言模型的應用"],n_results=2,where={"topic": "llm"}, # 僅檢索topic為llm的文檔include=["documents", "metadatas"]
)
元數據過濾支持多種操作符:
- 相等:
{"field": value}
- 不等:
{"field": {"$ne": value}}
- 大于/小于:
{"field": {"$gt": value}}
或{"field": {"$lt": value}}
- 范圍:
{"field": {"$gte": min_value, "$lte": max_value}}
- 復合條件:
{"$and": [condition1, condition2]}
調參:索引與性能優化
Chroma默認使用HNSW(分層可導航小世界圖)作為向量索引算法,無需手動創建索引。但你可以通過元數據調整索引參數:
# 創建集合時設置HNSW參數
collection = client.create_collection(name="optimized_collection",embedding_function=embedding_func,metadata={"hnsw:space": "cosine", # 相似度度量方式"hnsw:M": 16, # 每個節點的最大連接數"hnsw:ef_construction": 200, # 構建索引時的搜索寬度"hnsw:ef": 100 # 查詢時的搜索寬度}
)
關鍵參數解釋:
M
:控制圖的連接度,值越大精度越高但內存消耗也越大ef_construction
:影響索引質量,值越大精度越高但構建速度越慢ef
:影響查詢精度和速度,值越大召回率越高但查詢速度越慢