Chroma
Chroma 是開源的嵌入資料庫,目標是「在自己的機器上幾分鐘就能查」。預設會幫你跑 embedding,所以最小範例常常看不到向量本身。適合課程作業、RAG 原型,以及先驗證切塊策略再搬去託管服務。
教學影片見 Chroma 影音。
什麼時候選它
- 本機開發,不想先申請雲端 API。
- 跟著 LangChain、LlamaIndex 的入門範例走。
- 資料量還在筆電記憶體/磁碟可負擔的範圍。
資料要上正式叢集、要多租戶與嚴格 SLA 時,再評估 Qdrant、Milvus 或 Pinecone。
核心物件
| 名稱 | 作用 |
|---|---|
| Client | 連到記憶體、本機目錄或 Chroma server。 |
| Collection | 類似資料表;文件、embedding、metadata 都放這裡。 |
| Document | 你傳入的原文。若沒自己給向量,Chroma 會用預設 embedding 函式算出來。 |
三種連法差在資料會不會在行程結束後消失:
chromadb.Client():行程內,重啟就沒了。chromadb.PersistentClient(path="./chroma"):寫到目錄,適合本機專案。- 先
chroma run或 Docker 起 server,再用HttpClient:多個程式共用同一個庫。
最小流程
import chromadb
client = chromadb.PersistentClient(path="./chroma")
collection = client.get_or_create_collection(name="docs")
collection.add(
ids=["1", "2"],
documents=[
"退貨請於七日內提出申請。",
"運費依重量與地區計算。",
],
metadatas=[{"topic": "refund"}, {"topic": "shipping"}],
)
hits = collection.query(
query_texts=["怎麼把商品寄回去?"],
n_results=2,
where={"topic": "refund"},
)
print(hits["documents"], hits["distances"])
query_texts 會走跟寫入時相同的 embedding 函式。若你已經有向量,改傳 embeddings= 與 query_embeddings=,並在建立 collection 時指定對應的 embedding function,避免混用兩個模型。
實務注意
- 預設模型多半是 Sentence Transformer 小模型,品質與 OpenAI 大模型不同;要比產品時先固定同一套 embedding。
where是 metadata 過濾。條件太嚴會得到空結果,這是正常行為。- Chroma Cloud 與本機 API 持續演進,複製範例前先看 Getting Started。
官方學習資源
官方文件與頻道
Chroma 文件 Getting Started 是目前最準的 API 來源。官方 YouTube @trychroma 以概念與研究分享為主,逐步操作多在社群教學。內嵌見 Chroma 影音。
官方 YouTube
創辦人 Jeff Huber 的 Context Engineering for Engineers 說明檢索品質如何影響 LLM context,適合做完 Hello World 之後看。