Chroma 是一个开源的向量数据库,专门为 AI 应用设计,用于存储和检索向量嵌入(embeddings)
1. Chroma 概述 #
Chroma 概述部分主要介绍 Chroma 的基本定位、核心优势和适用场景,帮助你快速了解这个向量数据库的特点。
Chroma是一个轻量级的向量数据库,主要特点包括:
- 简单易用:提供简洁的 API,易于集成到 AI 应用中
- 高性能:针对向量搜索进行了优化
- 开源:采用 Apache 2.0 许可证
- 内存优先:默认使用内存存储,也支持持久化
- 多语言支持:提供 Python 和 JavaScript 接口
2. 核心概念 #
本节介绍 Chroma 的基本数据结构和核心机制,包括集合、嵌入函数和查询方式,是理解后续用法的基础。
2.1 集合(Collection) #
集合是 Chroma 中的主要组织单位,类似于传统数据库中的表。每个集合包含:
- 向量嵌入
- 关联的元数据
- 可选的 ID
2.2 查询(Query) #
本节介绍 Chroma 支持的多种查询方式,包括相似性搜索和元数据过滤,帮助你高效检索所需数据。
Chroma 支持多种查询方式:
- 相似性搜索:查找与查询向量最相似的向量
- 过滤查询:基于元数据过滤结果
3. 安装与基本使用 #
本节讲解如何安装 Chroma,并通过简单的代码示例演示其基本用法,适合新手快速上手。
安装 #
pip install chromadb基本使用示例 #
# 导入 chromadb 库
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建一个名为 my_collection 的集合
collection = client.get_or_create_collection("my_collection")
# 向集合中添加文档、元数据和ID
collection.add(
documents=["这是第一个文档", "这是第二个文档"],
metadatas=[{"source": "doc1"}, {"source": "doc2"}],
ids=["id1", "id2"]
)
# 查询与输入文本最相关的文档,返回2条结果
results = collection.query(
query_texts=["查找相关文档"],
n_results=2
)
# 打印查询结果
print(results)4. 主要功能 #
本节详细介绍 Chroma 的核心功能,包括向量存储、检索、相似性搜索和元数据过滤等,帮助你掌握常用操作。
4.1 向量存储与检索 #
本节演示如何将向量数据存入 Chroma,并通过向量进行高效检索。
# 导入 chromadb 库
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建集合
collection = client.get_or_create_collection("my_collection")
# 添加带有预计算嵌入的数据(示例向量)
collection.add(
embeddings=[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], # 向量列表
documents=["doc1", "doc2"],
ids=["id1", "id2"]
)
# 用向量进行检索,返回最相近的1条结果
results = collection.query(
query_embeddings=[[0.1, 0.2, 0.3]],
n_results=1
)
# 打印检索结果
print(results)4.2 相似性搜索 #
本节介绍如何基于文本或向量进行相似性搜索,快速找到最相关的数据。
# 导入 chromadb 库
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建集合
collection = client.get_or_create_collection("my_collection")
# 添加文档和ID
collection.add(documents=["这是第一个文档", "这是第二个文档"], ids=["id1", "id2"])
# 基于文本进行相似性查询,返回2条结果
results = collection.query(query_texts=["查询文本"], n_results=2)
# 打印文本查询结果
print(results)
# 基于向量进行相似性查询,返回2条结果
# 假设你有一个384维的向量
query_vec = [[0.1] * 384]
results_vec = collection.query(query_embeddings=query_vec, n_results=2)
# 打印向量查询结果
print(results_vec)
4.3 元数据过滤 #
本节演示如何通过元数据过滤,实现更精细的数据检索。
# 导入 chromadb 库
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建集合
collection = client.get_or_create_collection("my_collection")
# 添加文档、元数据和ID
collection.add(
documents=["文档A", "文档B"],
metadatas=[{"type": "A"}, {"type": "B"}],
ids=["idA", "idB"]
)
# 基于元数据过滤查询,只返回type为A的文档
results = collection.query(
query_texts=["文档"],
n_results=2,
where={"type": {"$eq": "A"}}
)
# 打印过滤查询结果
print(results)5. 高级特性 #
本节介绍 Chroma 的进阶用法,包括自定义嵌入函数、持久化存储和多模态支持,适合有更高需求的开发者。
5.1 自定义嵌入函数 #
本节讲解如何使用自定义的嵌入模型,将文本等数据转为向量,满足不同场景需求。
pip install sentence_transformers# 导入 chromadb 库
import chromadb
# 导入嵌入函数工具
from chromadb.utils import embedding_functions
# 创建自定义嵌入函数,使用指定的模型
custom_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="paraphrase-MiniLM-L3-v2"
)
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建集合并指定嵌入函数
collection = client.get_or_create_collection(
"custom_embedding_collection",
embedding_function=custom_ef
)
# 添加文档和ID
collection.add(
documents=["自定义嵌入文档"],
ids=["custom_id"]
)
# 查询与输入文本最相关的文档
results = collection.query(
query_texts=["嵌入"],
n_results=1
)
# 打印查询结果
print(results)5.2 持久化存储 #
本节说明如何将数据持久化到本地磁盘,保证数据不会因程序关闭而丢失。
# 导入 chromadb 库
import chromadb
# 创建持久化客户端,数据保存在本地目录 ./chroma_data
persistent_client = chromadb.PersistentClient(path="./chroma_data")
# 获取或创建持久化集合
collection = persistent_client.get_or_create_collection("persistent_collection")
# 添加文档和ID
collection.add(
documents=["持久化文档"],
ids=["persist_id"]
)
# 查询与输入文本最相关的文档
results = collection.query(
query_texts=["持久化"],
n_results=1
)
# 打印查询结果
print(results)5.3 多模态支持 #
本节介绍如何在 Chroma 中存储和检索多种类型的数据(如文本、图片等),实现多模态应用。
pip install sentence_transformers pillow# 导入chromadb库,用于向量数据库操作
import chromadb
# 导入SentenceTransformer,用于加载多模态模型
from sentence_transformers import SentenceTransformer
# 导入PIL库中的Image模块,用于图片处理
from PIL import Image
# 加载CLIP模型(clip-ViT-B-32),支持图片和文本的embedding
model = SentenceTransformer("clip-ViT-B-32")
# 定义函数:读取图片并转为embedding向量
def get_image_embedding(image_path):
# 打开图片并转换为RGB格式
img = Image.open(image_path).convert("RGB")
# 使用模型对图片进行编码,得到embedding,返回numpy数组
emb = model.encode([img], convert_to_numpy=True)
# 取出第一个embedding并转为list,方便后续存储
return emb[0].tolist()
# 生成图片"dog1.jpeg"的embedding向量
img_embedding = get_image_embedding("dog1.jpeg")
# 创建Chroma数据库客户端
client = chromadb.Client()
# 获取或创建名为"multi_modal_collection"的集合
collection = client.get_or_create_collection("multi_modal_collection")
# 向集合中添加图片的embedding、描述文本和唯一ID
collection.add(embeddings=[img_embedding], documents=["图片内容描述"], ids=["img1"])
# 生成查询图片"dog1.jpeg"的embedding向量
query_embedding = get_image_embedding("dog1.jpeg")
# 在集合中检索与查询embedding最相似的1条数据
results = collection.query(query_embeddings=[query_embedding], n_results=1)
# 打印检索结果
print(results)
6. 性能优化 #
本节介绍提升 Chroma 性能的技巧,包括批量操作和索引优化,适合大规模数据场景。
6.1 批量操作 #
本节演示如何一次性批量添加和检索大量数据,提高处理效率。
# 导入 chromadb 库
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建集合
collection = client.get_or_create_collection("batch_collection")
# 批量添加10条文档和ID
collection.add(
documents=[f"文档{i}" for i in range(10)],
ids=[f"id{i}" for i in range(10)]
)
# 查询与输入文本最相关的3条文档
results = collection.query(
query_texts=["文档"],
n_results=3
)
# 打印查询结果
print(results)6.2 索引优化 #
本节讲解如何通过调整索引参数,提升大规模向量检索的速度和准确性。
# 导入 chromadb 库
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 获取或创建集合并指定HNSW索引的距离度量方式为cosine
collection = client.get_or_create_collection(
"optimized_collection",
metadata={"hnsw:space": "cosine"} # 距离度量方式
)
# 添加文档和ID
collection.add(
documents=["优化文档"],
ids=["opt_id"]
)
# 查询与输入文本最相关的文档
results = collection.query(
query_texts=["优化"],
n_results=1
)
# 打印查询结果
print(results)7. 应用场景 #
本节列举了 Chroma 在实际项目中的典型应用,包括语义搜索、问答系统、推荐、去重和聚类等。
- 语义搜索:构建基于语义而非关键词的搜索系统
- 问答系统:存储知识库并检索相关答案
- 推荐系统:基于内容相似性推荐项目
- 去重:识别相似或重复内容
- 聚类:对相似项目进行分组
8. 与其他向量数据库比较 #
本节对比了 Chroma 与其他主流向量数据库的异同,帮助你选择最适合自己需求的产品。
| 特性 | Chroma | Pinecone | Weaviate | Milvus |
|---|---|---|---|---|
| 开源 | 是 | 否 | 是 | 是 |
| 托管选项 | 无 | 有 | 有 | 有 |
| 本地运行 | 支持 | 不支持 | 支持 | 支持 |
| 多模态 | 支持 | 有限 | 支持 | 支持 |
| 语言支持 | Python/JS | 多语言 | 多语言 | 多语言 |
9. 最佳实践 #
本节总结了使用 Chroma 的一些实用建议,帮助你更高效、更安全地管理和检索数据。
- 预处理数据:在添加前清理和规范化数据
- 选择合适的嵌入模型:根据任务选择专用模型
- 合理使用元数据:便于后续过滤和检索
- 批量操作:减少频繁的小批量操作
- 监控性能:定期检查查询延迟和准确性
10. 限制与注意事项 #
本节提醒你 Chroma 在实际使用中的一些局限和注意事项,便于规避风险。
- 内存限制:默认内存存储,大数据集需考虑持久化
- 生产准备:相比商业方案,可能需要更多运维工作
- 高级功能:缺少一些企业级功能如细粒度访问控制
- 扩展性:大规模部署可能需要额外工作