简单学下chromaDB

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 方法支持强大的 wherewhere_document 参数,让你能根据元数据或文档内容进行精确过滤。例如,可以只查询 category"tech" 的文档。
  • 元数据的过滤操作符:ChromaDB支持丰富的元数据过滤操作符,如 $eq(等于)、$ne(不等于)、$gt(大于)等,方便你构建复杂的检索条件
相关推荐
江上鹤.1482 小时前
Day33类装饰器
开发语言·python
阿龙AI日记2 小时前
保姆级教程:Anaconda+Cuda+Torch+Pycharm配置指南
ide·pytorch·python·pycharm
测试人社区—小叶子2 小时前
边缘计算与AI:下一代智能应用的核心架构
运维·网络·人工智能·python·架构·边缘计算
二川bro2 小时前
性能分析指南:Python cProfile优化实战
开发语言·python
妮妮喔妮2 小时前
redis热点key拆分和读多副本
数据库·redis·缓存
忆~遂愿2 小时前
昇腾 Triton-Ascend 开源实战:架构解析、环境搭建与配置速查
人工智能·python·深度学习·机器学习·自然语言处理
测试人社区—小叶子2 小时前
金融系统迁移测试:历时半年的完整实践复盘
运维·网络·人工智能·python·测试工具·金融
雪球不会消失了2 小时前
MySQL(开发篇)
数据库·mysql·oracle
Q_Q5110082852 小时前
python+springboot+django/flask基于深度学习的音乐推荐系统
spring boot·python·django·flask·node.js·php