Chroma:开源嵌入式向量数据库

FreeGuideOnline 最新 2026-07-02

bash pip install chromadb


如果希望使用 Cohere、HuggingFace 等提供的嵌入模型,可额外安装:

```bash
pip install chromadb[all]

核心概念速览

在使用 Chroma 之前,需要理解几个关键组件:

  • Collection(集合):类似关系数据库中的“表”,用于组织和隔离向量数据。
  • Document(文档):原始文本或数据内容,会被自动转换为向量。
  • Embedding(嵌入):将文档映射到高维向量空间的表示,Chroma 内置多种嵌入函数。
  • Metadata(元数据):附加在文档上的结构化信息,用于过滤搜索。
  • Query(查询):输入文本或向量,返回语义最相似的文档。

五分钟上手:基本操作

下面的代码演示了 Chroma 的核心工作流。

创建客户端并获取或新建集合

import chromadb

# 创建持久化客户端(数据保存到磁盘)
client = chromadb.PersistentClient(path="./chroma_db")
# 或使用内存模式(数据在程序结束后丢失)
# client = chromadb.EphemeralClient()

# 获取或创建集合
collection = client.get_or_create_collection(name="my_docs")

添加文档

add 方法接受文档、元数据和唯一标识。未提供嵌入时,Chroma 会使用默认的 all-MiniLM-L6-v2 模型自动生成。

collection.add(
    documents=[
        "Redis 是一种高性能键值数据库",
        "Chroma 是轻量级向量数据库",
        "PostgreSQL 支持 JSON 查询",
    ],
    metadatas=[
        {"source": "redis"},
        {"source": "chroma"},
        {"source": "postgres"},
    ],
    ids=["doc1", "doc2", "doc3"],
)

查询语义相似文档

results = collection.query(
    query_texts=["适合缓存和会话存储的数据库"],
    n_results=2,
)

print(results["documents"])
# 可能输出:[['Redis 是一种高性能键值数据库', 'Chroma 是轻量级向量数据库']]

更新与删除

collection.update(
    ids=["doc1"],
    documents=["Redis 是超快的内存数据库,常用于缓存"],
)

collection.delete(ids=["doc3"])

深入掌握:高级功能详解

自定义嵌入函数

你可以指定自己的嵌入模型,例如使用 huggingfaceopenai

from chromadb.utils import embedding_functions

# 使用 HuggingFace 模型
huggingface_ef = embedding_functions.HuggingFaceEmbeddingFunction(
    model_name="sentence-transformers/all-mpnet-base-v2"
)

collection = client.get_or_create_collection(
    name="custom_embeddings",
    embedding_function=huggingface_ef
)

对于 OpenAI 嵌入,需要先设置 API 密钥:

openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="sk-...",
    model_name="text-embedding-ada-002"
)

元数据过滤

查询时可以通过 where 条件精确筛选。

results = collection.query(
    query_texts=["数据库"],
    n_results=5,
    where={"source": "chroma"}  # 仅返回 source 为 chroma 的文档
)

更复杂的过滤,如数值比较:

collection.add(
    documents=["产品 A", "产品 B"],
    metadatas=[{"price": 99}, {"price": 150}],
    ids=["p1", "p2"],
)

results = collection.query(
    query_texts=["便宜商品"],
    where={"price": {"$lt": 120}}  # 价格小于 120
)

直接使用向量

除了通过文本自动生成向量,也可以直接添加预先计算好的向量。

import numpy as np

embeddings = np.random.rand(3, 384).tolist()  # 384 维向量

collection.add(
    embeddings=embeddings,
    documents=["doc A", "doc B", "doc C"],
    ids=["va1", "va2", "va3"]
)

获取集合信息与数据

# 查看集合中的文档数量
print(collection.count())

# 获取指定 ID 的文档
data = collection.get(ids=["doc1", "doc2"])
print(data["documents"])

实战场景:构建文档问答系统

下面演示如何用 Chroma 作为语义记忆,让 LLM 基于私有文档回答问题。

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter

# 假设 documents 是读取的长文本列表
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.create_documents(documents)

# 创建 embedding 模型
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

# 将文档存入 Chroma
db = Chroma.from_documents(docs, embeddings, persist_directory="./chroma_db")

# 搜索相关上下文
retriever = db.as_retriever(search_kwargs={"k": 3})
context_docs = retriever.get_relevant_documents("如何使用 Chroma 过滤元数据?")

# 将 context_docs 作为提示词的一部分交给 LLM 生成答案