ChromaDB 向量库优化技巧实战

chroma 一步步使用

安装

bash 复制代码
# 安装chromadb
pip install chromadb,sentence_transformers

# 不启动服务会出现sock.connect(sa)TimeoutError: timed out
chroma run

服务启动后,您将看到类似以下输出:

建立连接

部署完成后,需要建立与Chroma服务的连接:

python 复制代码
import chromadb

# 创建了临时客户端。程序终止时,您提取的任何数据都会丢失
client = chromadb.Client()

创建向量集合

chroma连接若直接创建集合("Collection"(集合)是存储向量的基本单位,类似于关系型数据库中的表),会使用内置的嵌入模型all-MiniLM-L6-v2。

python 复制代码
# 首先导入embedding模型
from chromadb.utils import embedding_functions



collection = chroma_client.create_collection(name="my_collection")
collection.add(
    documents=[
        "关于深度学习技术的文档",
        "关于的爱情小说文档"
    ],
    ids=["id1", "id2"]
)
print(collection)

chroma默认使用欧氏距离计算向量相似度

查询文档

Chroma提供多种查询方式,满足不同场景需求:

1. 基于ID查询

当你知道确切的文档ID时,可以直接查询:

python 复制代码
# 根据ID获取文档
result = collection.get(
    ids=["id1"]
)
2. 语义向量检索

RAG系统的核心功能是语义检索,基于查询与文档的语义相似度:

python 复制代码
# 语义检索
# Chroma 默认会返回 10 条结果。这里我们只添加了 2 个文档,因此我们设置n_results=2
results = collection.query(
    query_texts=["如何使用向量数据库?"],
    n_results=2
)
print(results)

工程中优化

混合检索

Chroma还支持将全文匹配与向量检索结合:

python 复制代码
# 全文匹配 + 向量检索
results = collection.query(
    query_texts=["检索技术的应用"],
    n_results=2,
    where_document={"$contains": "检索"},  # 文档必须包含"检索"一词
    include=["documents", "metadatas"]
)

Chroma支持将向量检索与元数据过滤结合,实现更精准的查询:

python 复制代码
# 元数据过滤 + 向量检索
results = collection.query(
    query_texts=["大语言模型的应用"],
    n_results=2,
    where={"topic": "llm"},  # 仅检索topic为llm的文档
    include=["documents", "metadatas"]
)

元数据过滤支持多种操作符:

  • 相等:{"field": value}
  • 不等:{"field": {"$ne": value}}
  • 大于/小于:{"field": {"$gt": value}} 或 {"field": {"$lt": value}}
  • 范围:{"field": {"$gte": min_value, "$lte": max_value}}
  • 复合条件:{"$and": [condition1, condition2]}
调参:索引与性能优化

Chroma默认使用HNSW(分层可导航小世界图)作为向量索引算法,无需手动创建索引。但你可以通过元数据调整索引参数:

python 复制代码
# 创建集合时设置HNSW参数
collection = client.create_collection(
    name="optimized_collection",
    embedding_function=embedding_func,
    metadata={
        "hnsw:space": "cosine",       # 相似度度量方式
        "hnsw:M": 16,                 # 每个节点的最大连接数
        "hnsw:ef_construction": 200,  # 构建索引时的搜索宽度
        "hnsw:ef": 100                # 查询时的搜索宽度
    }
)

关键参数解释:

  • M:控制图的连接度,值越大精度越高但内存消耗也越大
  • ef_construction:影响索引质量,值越大精度越高但构建速度越慢
  • ef:影响查询精度和速度,值越大召回率越高但查询速度越慢
相关推荐
xsd202411185 小时前
3D双目相机 vs 面阵激光雷达:机器人的“眼睛“到底怎么选?
人工智能
2601_965619696 小时前
把开源项目Changelog自动做成更新视频,AI工作流
人工智能·开源·音视频
Json____7 小时前
PHP 突发严重安全漏洞,AI 开始改变网络安全的攻防方式
人工智能·web安全·php·it学习·wwwoop.com
fxss7 小时前
我用AI给娃写了个拼音闯关大冒险
人工智能
驭渊的小故事9 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
北京中科新远科技9 小时前
高速光链路健康检查实战:DOM、FEC、误码与压力回归
人工智能·数据挖掘·回归
火山引擎和TA的超级拍档们9 小时前
超级拍档・光影新生|火山引擎 AIGC 主题峰会回顾
人工智能
冬奇Lab9 小时前
一天一个开源项目(第245篇):Raven —— ‘Harness 的 Harness‘,把 Claude Code、Codex 等智能体编排起来并让它递归自我改进
人工智能·开源·资讯
工业视觉老A9 小时前
攻克牙膏朝向人工分拣痛点,AI 视觉检测保障包装工序稳定
人工智能·计算机视觉·视觉检测