Chroma 是一款輕量級、開源的向量數據庫,專為 AI Agent、RAG(檢索增強生成)等場景設計,以“極簡易用、無需複雜運維、原生支持嵌入(Embedding)”為核心特點,是 AI Agent 記憶系統中實現長期記憶存儲的首選工具之一。本教程基於 Chroma 官方文檔(v0.5.x)整理,從環境搭建到實戰應用,覆蓋新手入門的全核心流程,所有代碼均可直接運行。
一、Chroma 核心定位與優勢(官方定義)
Chroma 官方對自身的定位是:“The AI-native open-source embedding database”(原生適配 AI 的開源嵌入數據庫),核心優勢:
- 極簡部署:支持本地 Python 庫、Docker 容器、雲服務三種部署方式,新手5分鐘即可啓動;
- 原生嵌入支持:內置輕量級嵌入模型(無需依賴外部 API),也可無縫集成 OpenAI、HuggingFace 等第三方嵌入模型;
- 面向開發者友好:API 設計簡潔,無需數據庫運維經驗,專注於“存儲向量、檢索向量”核心需求;
- 適配 AI Agent:支持按元數據過濾(如用户 ID、記憶類型)、動態更新向量,完美匹配記憶系統的“寫入-檢索-更新-遺忘”全流程。
二、環境搭建(官方推薦兩種方式)
方式1:本地 Python 安裝(推薦新手)
Chroma 支持 Python 3.8+,通過 pip 一鍵安裝:
# 基礎安裝(含核心功能)
pip install chromadb
# 完整安裝(含內置嵌入模型、可視化工具)
pip install "chromadb[all]"
驗證安裝成功:
import chromadb
print(f"Chroma 版本:{chromadb.__version__}") # 輸出版本號即成功
方式2:Docker 部署(適合生產/多環境共享)
官方提供預構建鏡像,無需配置 Python 環境:
# 拉取官方鏡像
docker pull chromadb/chroma:latest
# 啓動容器(默認端口8000,數據持久化到本地./chroma_data)
docker run -p 8000:8000 -v ./chroma_data:/chroma/chroma_data chromadb/chroma:latest
驗證容器啓動成功:訪問 http://localhost:8000/api/v1/heartbeat,返回 {"heartbeat": "string"} 即成功。
三、Chroma 核心概念(官方術語)
在使用前需理解 4 個核心概念,對應 AI Agent 記憶系統的存儲邏輯:
| 概念 | 官方定義 | AI Agent 記憶系統映射 |
|---|---|---|
| Collection | 向量數據的“容器”,類似數據庫的“表”,可按業務邏輯劃分(如按用户/記憶類型分) | 一個 Collection 對應一個 Agent 的所有長期記憶 |
| Document | 原始文本數據(如“用户喜歡印象派藝術”),Chroma 會自動/手動轉為向量 | 記憶系統中的“記憶條目內容” |
| Embedding | Document 對應的高維向量(默認 384 維),是語義檢索的核心 | 記憶條目的“語義身份證” |
| Metadata | 文檔的附加屬性(鍵值對),如 {"user_id": "user123", "memory_type": "preference"} |
記憶的“標籤”,用於過濾檢索(如僅查某用户的記憶) |
四、基礎操作(官方核心 API)
以下示例基於本地 Python 客户端,所有操作均為 Chroma 官方推薦用法。
1. 初始化客户端
Chroma 支持兩種客户端模式:
import chromadb
# 模式1:內存模式(數據僅存於內存,程序退出丟失,適合測試)
client = chromadb.Client()
# 模式2:持久化模式(數據保存到本地文件,適合生產)
client = chromadb.PersistentClient(path="./chroma_persist") # path 為數據存儲路徑
# 模式3:遠程客户端(連接 Docker 部署的 Chroma 服務)
client = chromadb.HttpClient(host="localhost", port=8000)
2. 創建/獲取 Collection
Collection 是操作的核心載體,創建時可指定嵌入模型(默認用內置的 all-MiniLM-L6-v2):
# 創建 Collection(若已存在則自動獲取)
collection = client.create_collection(
name="agent_memory", # Collection 名稱
metadata={"description": "AI Agent 長期記憶存儲"}, # 可選描述
get_or_create=True # 關鍵:避免重複創建
)
# 查看所有 Collection
print("所有 Collection:", client.list_collections())
# 獲取指定 Collection
collection = client.get_collection(name="agent_memory")
3. 添加記憶數據(寫入長期記憶)
Chroma 支持兩種添加方式:自動生成向量(內置模型)、手動傳入向量(如 OpenAI 嵌入)。
方式1:自動生成向量(新手首選)
# 準備數據:文檔+元數據+唯一ID(ID 可選,Chroma 會自動生成)
documents = [
"用户喜歡印象派藝術,計劃2025年7月去巴黎旅行",
"用户對咖啡因敏感,不喝含咖啡的飲料",
"用户的生日是3月5日,偏好收到實用型禮物"
]
metadatas = [
{"user_id": "user123", "memory_type": "preference", "timestamp": "2025-01-07"},
{"user_id": "user123", "memory_type": "preference", "timestamp": "2025-01-07"},
{"user_id": "user123", "memory_type": "basic_info", "timestamp": "2025-01-07"}
]
ids = ["mem1", "mem2", "mem3"] # 自定義唯一ID,便於後續更新/刪除
# 添加到 Collection
collection.add(
documents=documents,
metadatas=metadatas,
ids=ids
)
# 查看 Collection 統計信息
print("記憶條目數量:", collection.count()) # 輸出 3
方式2:手動傳入向量(適配第三方嵌入模型)
若需用 OpenAI 等高精度嵌入模型,可手動生成向量後傳入:
from openai import OpenAI
# 初始化 OpenAI 客户端
openai_client = OpenAI(api_key="your-openai-api-key")
# 生成嵌入向量
def get_openai_embeddings(texts):
response = openai_client.embeddings.create(
input=texts,
model="text-embedding-3-small"
)
return [item.embedding for item in response.data]
# 生成向量
embeddings = get_openai_embeddings(documents)
# 手動傳入向量添加數據
collection.add(
documents=documents,
metadatas=metadatas,
ids=ids,
embeddings=embeddings # 手動指定向量
)
4. 檢索相關記憶(核心:語義相似性搜索)
檢索是 AI Agent 記憶系統的核心操作,Chroma 支持“純語義檢索”“元數據過濾+語義檢索”兩種方式。
方式1:純語義檢索(按相似度召回)
# 檢索與“巴黎旅行推薦”相關的記憶(Top 2)
results = collection.query(
query_texts=["巴黎旅行推薦"], # 查詢文本(可傳多個)
n_results=2 # 返回最相似的2條
)
# 解析結果
print("檢索到的記憶ID:", results["ids"]) # 輸出 ["mem1", ...]
print("記憶內容:", results["documents"]) # 輸出對應的文本
print("相似度評分:", results["distances"]) # 距離越小,相似度越高(Chroma 默認用 L2 距離)
方式2:元數據過濾+語義檢索(精準定位)
AI Agent 中需確保“僅檢索當前用户的記憶”,可通過元數據過濾實現:
# 檢索 user123 的、與“巴黎旅行”相關的偏好類記憶
results = collection.query(
query_texts=["巴黎旅行"],
n_results=1,
where={ # 元數據過濾條件(支持 ==、!=、>、<、contains 等)
"user_id": "user123",
"memory_type": "preference"
}
)
print("過濾後的記憶內容:", results["documents"]) # 僅輸出 mem1
5. 更新記憶(修正錯誤/過期記憶)
當用户偏好變更時,需更新已有記憶:
# 更新 mem1 的內容(用户旅行時間改為8月)
collection.update(
id="mem1",
document="用户喜歡印象派藝術,計劃2025年8月去巴黎旅行",
metadata={"user_id": "user123", "memory_type": "preference", "timestamp": "2025-01-08"}
)
# 驗證更新結果
updated = collection.get(ids=["mem1"])
print("更新後的記憶:", updated["documents"]) # 輸出修改後的內容
6. 刪除記憶(遺忘無效/敏感記憶)
支持按 ID、元數據過濾刪除:
# 方式1:按 ID 刪除
collection.delete(ids=["mem3"]) # 刪除生日相關記憶
print("刪除後條目數:", collection.count()) # 輸出 2
# 方式2:按元數據過濾刪除(刪除所有偏好類記憶)
collection.delete(
where={"memory_type": "preference"}
)
print("過濾刪除後條目數:", collection.count()) # 輸出 0
7. 批量獲取記憶(全量/過濾查詢)
# 獲取所有記憶
all_memories = collection.get()
print("全量記憶:", all_memories["documents"])
# 按元數據過濾獲取
filtered_memories = collection.get(
where={"user_id": "user123"}
)
print("過濾後的記憶:", filtered_memories["documents"])
五、實戰案例:Chroma 集成到 AI Agent 記憶系統
以下是官方推薦的“Chroma + OpenAI”構建極簡 AI Agent 記憶系統的示例,完整實現“記住用户偏好→跨會話複用”:
import chromadb
from openai import OpenAI
# 1. 初始化組件
chroma_client = chromadb.PersistentClient(path="./agent_memory_db")
openai_client = OpenAI(api_key="your-openai-api-key")
# 2. 創建/獲取記憶 Collection
memory_collection = chroma_client.get_or_create_collection(
name="travel_agent_memory",
metadata={"description": "旅行Agent長期記憶"}
)
# 3. 核心函數:寫入記憶
def save_agent_memory(user_id, content, memory_type="preference"):
# 生成唯一ID(用户ID+時間戳)
import time
mem_id = f"{user_id}_{int(time.time())}"
# 生成OpenAI嵌入向量
embedding = openai_client.embeddings.create(
input=[content],
model="text-embedding-3-small"
).data[0].embedding
# 寫入Chroma
memory_collection.add(
documents=[content],
metadatas=[{"user_id": user_id, "memory_type": memory_type}],
ids=[mem_id],
embeddings=[embedding]
)
print(f"記憶寫入成功,ID:{mem_id}")
# 4. 核心函數:檢索記憶
def retrieve_agent_memory(user_id, query, n_results=3):
# 生成查詢向量
query_embedding = openai_client.embeddings.create(
input=[query],
model="text-embedding-3-small"
).data[0].embedding
# 檢索(僅當前用户)
results = memory_collection.query(
query_embeddings=[query_embedding], # 手動傳入查詢向量
n_results=n_results,
where={"user_id": user_id}
)
# 格式化結果
return "\n".join([f"- {doc}" for doc in results["documents"][0]]) if results["documents"][0] else "無相關記憶"
# 5. 核心函數:Agent 響應生成
def agent_respond(user_id, query):
# 檢索相關記憶
relevant_memories = retrieve_agent_memory(user_id, query)
# 構建Prompt(融入記憶)
prompt = f"""
你是一個旅行助手Agent,需結合用户的長期記憶回答問題。
用户長期記憶:
{relevant_memories}
用户當前問題:{query}
要求:基於記憶回答,無記憶時直接回答,不編造信息。
"""
# 生成響應
response = openai_client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
).choices[0].message.content
# 若查詢包含偏好/計劃,自動寫入記憶
if any(keyword in query for keyword in ["喜歡", "計劃", "偏好", "想去"]):
save_agent_memory(user_id, query)
return response
# 6. 測試交互
USER_ID = "user123"
# 第一輪對話:用户告知偏好(自動寫入記憶)
query1 = "我喜歡印象派藝術,計劃2025年8月去巴黎旅行"
response1 = agent_respond(USER_ID, query1)
print(f"Agent響應1:{response1}")
# 第二輪對話:跨會話複用記憶
query2 = "推薦巴黎適合我的景點"
response2 = agent_respond(USER_ID, query2)
print(f"Agent響應2:{response2}") # 會推薦奧賽博物館等印象派相關景點
六、Chroma 官方進階資源與常見問題
1. 官方核心資源
- 官方文檔:https://docs.trychroma.com/(最權威,含API全解析、高級功能);
- GitHub 倉庫:https://github.com/chroma-core/chroma(源碼、示例、問題反饋);
- 官方教程視頻:https://www.youtube.com/@ChromaDB(英文,實操演示);
- 可視化工具:Chroma 內置
chroma ui命令,啓動後可通過網頁查看/管理 Collection(需安裝chromadb[all])。
2. 新手常見問題(官方解答)
| 問題 | 官方解決方案 |
|---|---|
| 檢索結果不準確 | 1. 更換更高精度嵌入模型(如 OpenAI text-embedding-3-large);2. 調整 n_results 數量;3. 增加元數據過濾條件 |
| 數據持久化失敗 | 使用 PersistentClient 而非默認的內存客户端,確保 path 路徑有讀寫權限 |
| Docker 容器啓動失敗 | 檢查端口8000是否被佔用,或添加 --network host 參數 |
| 嵌入模型加載失敗 | 安裝完整依賴:pip install "chromadb[all]",或手動指定嵌入模型路徑 |
總結
核心關鍵點回顧
- Chroma 核心價值:輕量級、易部署,專為 AI 場景設計,是 Agent 記憶系統長期記憶存儲的首選工具;
- 核心操作流程:創建 Collection → 添加文檔/向量/元數據 → 按語義+元數據檢索 → 更新/刪除記憶;
- 實戰關鍵:通過元數據過濾(如 user_id)確保記憶隔離,結合第三方嵌入模型提升檢索精度。
掌握以上內容,即可基於 Chroma 快速搭建 AI Agent 的長期記憶系統,後續可進一步學習 Chroma 的高級功能(如批量操作、索引優化、多模態支持),適配更復雜的 Agent 場景。