python之chroma向量數(shù)據(jù)庫安裝方式
更新時間:2026年01月22日 08:36:47 作者:像風(fēng)一樣的男人@
Chroma支持四種距離函數(shù)配置,包括歐氏距離、余弦距離、內(nèi)積和曼哈頓距離,在人臉比對場景中,余弦距離是最優(yōu)選擇
環(huán)境
# python3.10.3 chromadb==1.0.4
服務(wù)方式啟動
# 直接使用 chroma 命令啟動(推薦,因?yàn)榄h(huán)境變量已包含 bin 目錄) chroma run --host 0.0.0.0 --port 8000 --path ./chroma_data # 或使用完整路徑啟動(適用于未激活環(huán)境時) /home/your_username/miniconda3/envs/chroma-env/bin/chroma run --host 0.0.0.0 --port 8000
連接本地文件模式(無需啟動服務(wù)器)
import chromadb
from chromadb.config import Settings
# 1. 初始化本地文件模式的 Chroma 客戶端
# 數(shù)據(jù)會存儲在 ./chroma_local_data 目錄
client = chromadb.Client(
Settings(
persist_directory="./chroma_local_data", # 本地?cái)?shù)據(jù)存儲路徑
anonymized_telemetry=False # 關(guān)閉匿名統(tǒng)計(jì)
)
)
# 2. 創(chuàng)建或獲取一個集合(Collection)
# 集合是 Chroma 中存儲向量的容器
collection = client.get_or_create_collection(
name="local_demo_collection",
metadata={"description": "本地文件模式測試集合"} # 可選:添加集合描述
)
# 3. 向集合中添加數(shù)據(jù)
# 包含:文檔(原始文本)、元數(shù)據(jù)(附加信息)、唯一ID、向量(可選,不提供則自動生成)
collection.add(
documents=[
"Python 是一種解釋型編程語言",
"Chroma 是一個輕量級向量數(shù)據(jù)庫",
"向量數(shù)據(jù)庫常用于存儲和檢索嵌入向量"
],
metadatas=[
{"category": "programming"},
{"category": "database"},
{"category": "ai"}
],
ids=["doc1", "doc2", "doc3"] # 每個文檔的唯一ID
)
# 4. 持久化數(shù)據(jù)(本地模式需要手動觸發(fā),確保數(shù)據(jù)寫入磁盤)
client.persist()
# 5. 檢索相似內(nèi)容
# 用查詢文本檢索最相似的2個文檔(Chroma 會自動生成查詢文本的向量)
results = collection.query(
query_texts=["什么是向量數(shù)據(jù)庫?"], # 查詢文本
n_results=2 # 返回Top 2相似結(jié)果
)
# 打印檢索結(jié)果
print("本地文件模式檢索結(jié)果:")
for i, doc in enumerate(results["documents"][0]):
print(f"\n相似文檔 {i+1}:{doc}")
print(f"相似度分?jǐn)?shù):{results['distances'][0][i]}") # 分?jǐn)?shù)越低越相似
print(f"元數(shù)據(jù):{results['metadatas'][0][i]}")
通過端口連接(客戶端 - 服務(wù)器模式)
import chromadb
from chromadb.config import Settings
# 1. 連接到遠(yuǎn)程/本地服務(wù)器
client = chromadb.HttpClient(
host="localhost", # 服務(wù)器IP(本地為localhost,遠(yuǎn)程填服務(wù)器IP)
port=8000, # 服務(wù)器端口(與啟動時一致)
settings=Settings(
anonymized_telemetry=False
)
)
# 2. 創(chuàng)建或獲取集合(與本地模式API一致)
collection = client.get_or_create_collection(
name="server_demo_collection",
metadata={"description": "服務(wù)器模式測試集合"}
)
# 3. 添加數(shù)據(jù)(API與本地模式一致)
collection.add(
documents=[
"北京是中國的首都",
"巴黎是法國的首都",
"東京是日本的首都"
],
metadatas=[
{"country": "中國"},
{"country": "法國"},
{"country": "日本"}
],
ids=["city1", "city2", "city3"]
)
# 4. 檢索相似內(nèi)容
results = collection.query(
query_texts=["哪些城市是國家首都?"],
n_results=3
)
# 打印檢索結(jié)果
print("\n服務(wù)器模式檢索結(jié)果:")
for i, doc in enumerate(results["documents"][0]):
print(f"\n相似文檔 {i+1}:{doc}")
print(f"相似度分?jǐn)?shù):{results['distances'][0][i]}")
print(f"元數(shù)據(jù):{results['metadatas'][0][i]}")

創(chuàng)建連接
chroma_client = chromadb.HttpClient( # 創(chuàng)建連接
host=CHROMA_HOST, # IP
port=CHROMA_PORT, # 端口
settings=Settings(
anonymized_telemetry=False # 關(guān)閉自動上報
)
)
face_collection = chroma_client.get_or_create_collection(
name=FACE_TABEL_NAME, # 庫名
metadata={"description": "人臉向量和id", # 庫的描述
"hnsw:space": "cosine"} # 指定距離函數(shù)為余弦距離
) # 指向人臉庫

調(diào)用 query 方法時,distances 字段的含義和范圍因距離函數(shù)而異:
- “
l2”:返回歐氏距離,范圍 [0, +∞),值越小越相似。 - “
cosine”:返回余弦距離,范圍 [0, 2],值越小越相似(0 代表完全匹配)。 - “
ip”:返回內(nèi)積,范圍 [-1, 1](未歸一化)或 [0, 1](歸一化后),值越大越相似。 - “
l1”:返回曼哈頓距離,范圍 [0, +∞),值越小越相似。
總結(jié):
- Chroma 支持 4 種距離函數(shù)配置,核心通過
hnsw:space指定。 - 人臉比對場景,“
cosine” 是最優(yōu)選擇,其次是 “ip”(歸一化后等價),避免使用默認(rèn)的 “l2”(歐氏距離)或 “l1”(曼哈頓距離)。
新增數(shù)據(jù)(修改數(shù)據(jù))
face_vector = face.embedding.tolist() # 人臉向量數(shù)據(jù)
metadata = {
"face_id": face_id, # id
"people_type": people_type, # 人員類別
}
try:
face_collection.add(
ids=[face_id], # 用傳入的 face_id 作為唯一標(biāo)識
embeddings=[face_vector], # 新向量(存在則覆蓋)
metadatas=[metadata] # 新元數(shù)據(jù)(存在則覆蓋)
)
except Exception as e:
pass
根據(jù)id查數(shù)據(jù)
face_collection.get(ids=['21121'], include=["embeddings", 'metadatas']) # 不指定不返回向量數(shù)據(jù) # all_data = r.face_collection.get() 不指定就是查詢?nèi)?

根據(jù)id刪除數(shù)據(jù)
all_data = r.face_collection.get(include=[]) # include=[] 表示只返回 ids 查全部數(shù)據(jù) all_ids = all_data["ids"] r.face_collection.delete(ids=all_ids)
刪除庫(集合)
r.chroma_client.delete_collection(name='face')
查詢?nèi)考?/h2>
collections = r.chroma_client.list_collections()
for coll in collections:
print(f'集合名:{coll.name}')
print(f'描述(元數(shù)據(jù)):{coll.metadata} ')
r.chroma_client.get_collection('face').metadata #查詢單個集合
collections = r.chroma_client.list_collections()
for coll in collections:
print(f'集合名:{coll.name}')
print(f'描述(元數(shù)據(jù)):{coll.metadata} ')
r.chroma_client.get_collection('face').metadata #查詢單個集合
元數(shù)據(jù)查詢
# 1. 查詢元數(shù)據(jù)中 people_type=0(訪客)的所有記錄
result = face_collection.get(
where={"people_type": 0}, # 元數(shù)據(jù)過濾條件
include=["ids", "metadatas", "embeddings"] # 指定返回的內(nèi)容(可選)
)
# 返回結(jié)果解析
print("符合條件的ID:", result["ids"]) # 子ID列表,如["1_aug0", "2_front"]
print("符合條件的元數(shù)據(jù):", result["metadatas"]) # 對應(yīng)的元數(shù)據(jù)列表
print("符合條件的向量:", result["embeddings"]) # 對應(yīng)的向量列表(若include包含)
where 參數(shù)支持多種條件,滿足復(fù)雜查詢需求:
- 等于(==):
# 查詢 main_face_id="user_001" 的所有記錄
face_collection.get(where={"main_face_id": "user_001"})
- 不等于(!=):
# 查詢 people_type 不是員工(!=1)的記錄
face_collection.get(where={"people_type": {"$ne": 1}})
- 范圍查詢(>/</>=/<=):
# 查詢自定義數(shù)值型元數(shù)據(jù)(如 score)大于0.8的記錄
face_collection.get(where={"score": {"$gt": 0.8}})
- 包含(in):
# 查詢 pose_type 是正面或側(cè)面的記錄
face_collection.get(where={"pose_type": {"$in": ["front", "left_side"]}})
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何獲取響應(yīng)體response body
在Python中,我們可以使用多個庫來發(fā)送HTTP請求并獲取響應(yīng)體(response body),其中requests就是最常用的庫之一,下面我們就來看看如何利用requests發(fā)送HTTP GET請求,并獲取響應(yīng)體吧2024-11-11
Python3按一定數(shù)據(jù)位數(shù)格式處理bin文件的方法
今天小編就為大家分享一篇Python3按一定數(shù)據(jù)位數(shù)格式處理bin文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python數(shù)據(jù)分析之雙色球統(tǒng)計(jì)兩個紅和藍(lán)球哪組合比例高的方法
這篇文章主要介紹了Python數(shù)據(jù)分析之雙色球統(tǒng)計(jì)兩個紅和藍(lán)球哪組合比例高的方法,涉及Python數(shù)值運(yùn)算及圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
pygame實(shí)現(xiàn)俄羅斯方塊游戲(AI篇2)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)俄羅斯方塊游戲AI的第2篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10

