当前位置: 首页 > news >正文

ChromaDB 向量库优化技巧实战

chroma 一步步使用

安装

# 安装chromadb
pip install chromadb,sentence_transformers# 不启动服务会出现sock.connect(sa)TimeoutError: timed out
chroma run

服务启动后,您将看到类似以下输出:
在这里插入图片描述

建立连接

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

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

创建向量集合

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

# 首先导入embedding模型
from chromadb.utils import embedding_functionscollection = chroma_client.create_collection(name="my_collection")
collection.add(documents=["关于深度学习技术的文档","关于的爱情小说文档"],ids=["id1", "id2"]
)
print(collection)

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

查询文档

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

1. 基于ID查询

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

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

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

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

工程中优化

混合检索

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

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

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

# 元数据过滤 + 向量检索
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(分层可导航小世界图)作为向量索引算法,无需手动创建索引。但你可以通过元数据调整索引参数:

# 创建集合时设置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:影响查询精度和速度,值越大召回率越高但查询速度越慢

相关文章:

  • SymPy | 使用SymPy求解多元非线性方程组
  • 合并两个有序数组的高效算法详解
  • 1.1 认识编程与C++
  • 黑马k8s(七)
  • 腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~
  • 麒麟v10 部署 MySQL 5.6.10 完整步骤
  • javaSE.迭代器
  • AI Agent开发第67课-彻底消除RAG知识库幻觉-文档分块全技巧(1)
  • 密码学刷题小记录
  • QML学习01(设置宽度、高度、坐标点、标题,信号与槽,键盘事件)
  • 网页渲染的两条赛道
  • 【高斯拟合】不用库手写高斯拟合算法:从最小二乘到拟合参数推导
  • 牛客网NC22012:判断闰年问题详解
  • [c语言日寄]数据结构:栈
  • RAGFlow 中的 Rerank 和 Recall 解释
  • 大数据架构选型全景指南:核心架构对比与实战案例 解析
  • 吊舱热敏传感器抗干扰技术分析!
  • mysqlbinlog用法详解
  • AI数字人融合VR全景:从技术突破到可信场景落地
  • LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点
  • 英德宣布开发射程超2000公里导弹,以防务合作加强安全、促进经济
  • 日本一季度实际GDP环比下降0.2%
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 刘永明|在从普及到提高中发展新大众文艺
  • 特朗普开启第二任期首次外访:中东行主打做生意,不去以色列
  • 董军同法国国防部长举行会谈