ChromaDB是一个轻量级的向量苏巨款,能够高校的存储和检索文本、图像等数据的向量化表示。它的存储单元是集合(类似关系型数据库中的表的存在),集合中存储着不同的数据向量。
一、直接在本地配置环境中使用chroma
这种方式是直接连接到与python程序同一进程的数据库中,创建客户端的时候使用 PersistentClient ,数据保存位置可自行指定到本地某些位置。
在向数据库增加文本数据的时候,ChromaDB会调用默认的嵌入模型,为这些文本生成向量并进行存储。
python
import chromadb
# 1. 创建客户端(这里使用本地持久化模式,数据会保存在`./chroma_db`目录)
client = chromadb.PersistentClient(path="./chroma_db")[citation:8]
# 2. 创建一个集合,命名为"my_knowledge_base"
collection = client.create_collection(name="my_knowledge_base")[citation:4]
# 准备一些示例文档
documents = [
"熊猫是中国的国宝,主要生活在四川山区。",
"Python是一种广泛使用的高级编程语言,以简洁易读著称。",
"太阳系有八大行星,按照离太阳从近到远依次是水星、金星、地球、火星、木星、土星、天王星和海王星。"
]
# 将文档添加到集合中,并指定唯一的ID和可选的元数据
collection.add(
documents=documents,
ids=["doc1", "doc2", "doc3"], # 为每个文档分配唯一ID
metadatas=[{"category": "animal"}, {"category": "tech"}, {"category": "science"}] # 可选的元数据,用于过滤
)[citation:4]
将数据存储到数据库中后就可以自让语言进行查询了,ChromaDB会将你的查询文本也转换成向量,并找出库中最相似的几个文档。
python
# 进行查询,寻找与"编程语言"意思最接近的文档
results = collection.query(
query_texts=["关于编程语言"], # 查询文本
n_results=2 # 返回最相似的2个结果
)[citation:4]
# 打印查询结果
print("最相关的文档:", results['documents'])
print("对应的ID:", results['ids'])
print("相似度距离(越小越相似):", results['distances'])
二、ChromaDB作为服务器使用
这种方式是连接到chromaDB服务器中,使用 HttpClient 进行连接,数据存储在服务器配置的路径中。
1、启动ChromaDB服务器
如果该服务器安装在本地,那么在启动的时候可以指定路径来进行持久化存储数据,默认在8000端口启动。
bash
# 安装客户端库
pip install chromadb
# 启动服务器,数据将保存在 `/your/data/path` 目录
chroma run --path /your/data/path
如果服务器是通过docker进行安装的,那么可以使用docker启动服务器,注意端口映射问题。
bash
docker run -d --name chroma -p 8000:8000 -e IS_PERSISTENT=TRUE -e PERSIST_DIRECTORY=/chroma/chroma chromadb/chroma
2、客户端连接服务器
采用这种方式连接服务器之后,对集合的操作和第一种方式对集合的操作相似。
python
import chromadb
# 1. 创建客户端,连接到远程服务器
# 如果服务器在本地,通常使用 localhost 和 8000 端口[citation:1]
client = chromadb.HttpClient(host='localhost', port=8000)
# 如果连接远程服务器,例如:client = chromadb.HttpClient(host='your.server.ip', port=8000)
# 2. 创建或获取一个集合(Collection)
# 集合是存储和组织数据的基本单元,类似于数据库中的表[citation:9]
collection = client.get_or_create_collection(name="my_knowledge_base")
# 3. 向集合中添加文档(支持自动生成向量)
collection.add(
documents=[
"熊猫是中国的国宝,主要生活在四川山区。",
"Python是一种广泛使用的高级编程语言,以简洁易读著称。",
"太阳系有八大行星。"
],
metadatas=[
{"category": "animal"},
{"category": "tech"},
{"category": "science"}
],
ids=["doc1", "doc2", "doc3"]
)
# 4. 进行相似性查询
results = collection.query(
query_texts=["编程语言"], # 查询文本
n_results=2 # 返回最相似的2个结果
)
print("最相关的文档:", results['documents'][0])
print("对应的ID:", results['ids'][0])
3、chroma与langchain的结合
langchain_chroma.Chroma 是LangChain框架中定义的向量存储标准接口,使用这个Chroma返回的向量存储实例能够具有调用chromadb底层API的作用
-
add_documents(documents):添加文档并自动向量化 -
similarity_search(query, k):直接语义搜索最相似的k个文档 -
similarity_search_with_score(query, k):直接搜索并返回相似度分数 -
as_retriever():转换为检索器再进行搜索,用于RAG系统- search_type参数指定搜索类型,主要有similarity相似度搜索(余弦相似度或内积,但有冗余风险)、mmr最大边际相关性(降低冗余风险,但可能会排除相似度高的文档来增加多样性)、similarity_score_threshold带阈值的相似度搜索
维度 similarity mmr similarity_score_threshold 核心目标 最大相关性 相关性 + 多样性 质量保证(阈值过滤) 搜索参数 search_kwargs={ "k": 4 "filter": {"category": "science", "year": {"$gte": 2020}} } search_kwargs={ "k": 5, # 返回结果数量 "fetch_k": 20, # 从向量库中获取的初始候选数量 "lambda_mult": 0.7 # 多样性权重 (0-1),值越高多样性越强 } search_kwargs={ "score_threshold": 0.8, # 相似度阈值,只返回高于此阈值的结果 "k": 10 # 最大返回数量 }返回数量 固定 k 个 固定 k 个 0 到 k 个(动态) 结果特点 可能冗余 多样、覆盖广 均质高质 计算成本 最低 中等(需文档间比较) 低(但需调参) 参数敏感度 低(只需 k) 中(k, fetch_k, λ) 高(阈值需精细调整) 主要风险 信息冗余 可能遗漏高相关文档 可能返回空结果 典型应用 常规检索、快速原型 RAG 生成、摘要、推荐 高精度问答、安全关键应用
三、两种方法的对比和对服务器的功能的深入使用
1、两种使用方法的对比
| 特性 | 本地直接连接模式 | 客户端-服务器模式 |
| 运行方式 | 数据库库与你的Python程序在同一进程中 | ChromaDB作为一个独立服务运行,你的程序通过网络API连接它 |
| 适用场景 | 快速原型开发、测试、单机脚本。 | 生产环境、团队协作、需要高可用或微服务架构。 |
| 数据持久化 | 程序管理路径,数据保存在本地目录 | 由服务器管理,数据存储在服务器配置的路径或卷中。 |
| 创建客户端 | client = chromadb.PersistentClient(path="./chroma_db") | client = chromadb.HttpClient(host='localhost', port=8000) |
| 启动服务 | 不需要 | 通过 chroma run 命令或 Docker 启动 |
|---|
2、对服务器功能的深入使用
- 嵌入模型的调用:默认情况下,服务器会使用内置模型(如
all-MiniLM-L6-v2)为文本生成向量。在生产环境中,你可以在创建集合时指定更强大的自定义或第三方嵌入模型(如OpenAI的text-embedding-ada-002),来提升语义理解的精度。 - 复杂查询和过滤:
collection.query方法支持强大的where和where_document参数,让你能根据元数据或文档内容进行精确过滤。例如,可以只查询category为"tech"的文档。 - 元数据的过滤操作符:ChromaDB支持丰富的元数据过滤操作符,如
$eq(等于)、$ne(不等于)、$gt(大于)等,方便你构建复杂的检索条件