Chroma 是一个开源的嵌入数据库(Embedding Database),定位为面向 AI 应用的数据库,宣传语为“为构建带记忆的 LLM 应用而生的 AI 原生数据库”。项目采用 Apache 2.0 许可证,官方资料给出的版本为 v1.3.3(稳定版,每周发布),GitHub 星标 24,300+,fork 1,900+。
一、用途与适用场景 官方资料说明,以下情况适合使用 Chroma:构建 RAG(检索增强生成)应用;需要本地或自托管的向量数据库;希望使用开源方案(Apache 2.0);在 Notebook 中进行原型验证;对文档做语义搜索;存储带元数据的嵌入向量。 资料同时列出了可考虑的替代方案及其定位:Pinecone 为托管云服务、自动扩缩容;FAISS 为纯相似度搜索、不支持元数据;Weaviate 为面向生产的 ML 原生数据库;Qdrant 为基于 Rust 的高性能方案。
二、安装 Python:pip install chromadb JavaScript/TypeScript:npm install chromadb @chroma-core/default-embed
三、基本使用(Python) 基本流程为:创建客户端、创建集合、添加文档、查询。示例代码中通过 chromadb.Client() 创建客户端,使用 client.create_collection(name="my_collection") 创建集合,使用 collection.add() 添加文档、元数据和 id,使用 collection.query() 以 query_texts 查询并指定 n_results 返回条数,最后打印结果。
四、核心操作
- 集合管理:可用 client.create_collection("my_docs") 创建简单集合;也可传入自定义嵌入函数(如 OpenAIEmbeddingFunction)创建集合;使用 client.get_collection() 获取已有集合;使用 client.delete_collection() 删除集合。
- 添加文档:可用 collection.add() 添加 documents、metadatas 与 ids;也可直接传入自定义 embeddings、documents 与 ids。
- 查询(相似度搜索):使用 collection.query(),可指定 query_texts、n_results;支持元数据过滤 where;支持组合条件(如 $and 组合 category 与 difficulty 条件)。查询结果包含 results["documents"]、results["metadatas"]、results["distances"]、results["ids"]。
- 获取文档:使用 collection.get(),可按 ids 获取、按 where 过滤并配合 limit 获取,或不带参数获取全部。
- 更新文档:使用 collection.update() 更新 ids 对应的 documents 与 metadatas。
- 删除文档:使用 collection.delete(),可按 ids 删除,也可按 where 过滤删除。
五、持久化存储 使用 chromadb.PersistentClient(path="./chroma_db") 将数据持久化到磁盘,添加数据后会自动持久化;之后用相同路径重新创建 PersistentClient 并 get_collection 即可重新加载。
六、嵌入函数 默认使用 Sentence Transformers,默认模型为 all-MiniLM-L6-v2。可替换为 OpenAI 嵌入函数(OpenAIEmbeddingFunction,指定 api_key 与 model_name,如 text-embedding-3-small),也可使用 HuggingFaceEmbeddingFunction(指定 api_key 与 model_name,如 sentence-transformers/all-mpnet-base-v2)。还支持自定义嵌入函数:继承 chromadb 的 EmbeddingFunction 并实现 call,返回 Embeddings。
七、元数据过滤 支持精确匹配(如 {"category": "tutorial"});比较运算符 $gt、$gte、$lt、$lte、$ne(如 {"page": {"$gt": 10}});逻辑运算符 $and、$or;以及包含判断 $in(如 {"tags": {"$in": ["python", "ml"]}})。
八、框架集成 LangChain:从 langchain_chroma 导入 Chroma,使用 RecursiveCharacterTextSplitter 切分文档,通过 Chroma.from_documents() 创建向量存储并指定 persist_directory,使用 similarity_search 查询,或用 as_retriever 转为检索器(可设置 search_kwargs={"k": 5})。 LlamaIndex:从 llama_index.vector_stores.chroma 导入 ChromaVectorStore,使用 PersistentClient 与 get_or_create_collection 初始化,结合 StorageContext 与 VectorStoreIndex.from_documents() 创建索引,再用 as_query_engine() 查询。
九、服务端模式 可通过命令行运行 Chroma 服务:chroma run --path ./chroma_db --port 8000。客户端使用 chromadb.HttpClient(host="localhost", port=8000, settings=Settings(anonymized_telemetry=False)) 连接,之后可像本地一样使用 get_or_create_collection 等操作。
十、最佳实践 官方列出的建议包括:使用持久化客户端以免重启丢失数据;添加元数据以便过滤与追踪;批量添加文档;选择合适的嵌入模型以平衡速度与质量;使用过滤器缩小搜索范围;使用唯一 ID 避免冲突;定期备份(复制 chroma_db 目录);监控集合规模以便扩展;测试嵌入函数质量;生产环境使用服务端模式以更好支持多用户。
十一、性能 官方给出的参考数据:添加 100 个文档约 1-3 秒(含嵌入计算);查询(top 10)约 50-200 毫秒(取决于集合规模);元数据过滤约 10-50 毫秒(在适当索引下较快)。
十二、资源 GitHub:https://github.com/chroma-core/chroma(星标 24,300+);文档:https://docs.trychroma.com;Discord:https://discord.gg/MMeYNTmh3x;版本 1.3.3+;许可证 Apache 2.0。
以上内容均来自所提供的资料;资料未涉及的具体功能、收费、价格、平台或效果等事实,暂未提供。