A. 配景介绍
ChromaDB 是一个较新的开源向量数据库,专为高效的嵌入存储和检索而筹划。与其他向量数据库相比,ChromaDB 更加专注于轻量化、简单性和与呆板学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量,特殊是与天生式 AI(如 GPT 系列)集成。
ChromaDB 的优点
- 简单易用:
- ChromaDB 提供了简单直观的 API,开发者可以快速上手。其轻量化筹划使得在开发情况中运行和集成变得非常便捷。
- 内置支持文本嵌入,特殊适合 NLP 项目,与诸如 OpenAI 的 GPT 模型结合使用效果显着。
- 轻量级:
- 相较于 Milvus 和 Vespa 等重量级体系,ChromaDB 是一种轻量级的选择,不必要复杂的配置和大规模根本设施支持。非常适合小型或中型项目。
- 内置存储和检索功能:
- 提供了嵌入的持久化和检索功能,能够方便地将计算出的嵌入存储在数据库中,并进行高效的相似度查询。
- 支持基于向量的近来邻搜刮,查询性能相对较好。
- 无缝集成呆板学习模型:
- ChromaDB 特殊夸大与各种天生式 AI 和嵌入模型的集成。可以轻松与 Hugging Face 等呆板学习库和模型结合使用,用于 NLP、图像嵌入等。
- 灵活的存储后端:
- 它可以当地运行,也可以连接到其他数据库或存储后端(例如 SQLite 或 PostgreSQL),从而提供了更多的灵活性。
- 社区支持:
- 固然相对较新,但 ChromaDB 的开发者活跃,社区在不断推动其更新与发展。
ChromaDB 的缺点
- 扩展性有限:
- ChromaDB 目前的扩展性不如 Milvus、Vespa 或 FAISS 等专为大规模向量处理筹划的数据库。它更适合中小规模的数据集,在大规模场景下可能面临性能瓶颈。
- 功能相对较少:
- 相比于 Milvus 和 Weaviate 提供的混合查询功能,ChromaDB 重要专注于嵌入和向量搜刮,不具备复杂的查询处理本领。
- 不具备一些高级功能(如 Weaviate 的分类器或 Vespa 的实时处理本领)。
- 集群支持不美满:
- 目前 ChromaDB 不支持多节点集群部署,无法像 Milvus 和 Vespa 那样轻松处理跨多个节点的大规模数据查询。
- 成熟度不敷:
- ChromaDB 相对较新,固然社区活跃,但在稳固性、文档美满性和企业级使用上与成熟的向量数据库如 FAISS、Milvus 另有肯定差距。
- 缺少一些企业级功能,比如事务管理、备份和恢复等。
- 缺少 GPU 加速:
- 与 FAISS 的 GPU 支持不同,ChromaDB 当前重要是 CPU 驱动的,没有内置的 GPU 加速选项,在处理大型向量数据集时性能会受到限制。
与其他向量数据库的比力
数据库优点缺点适用场景Milvus高可扩展性、支持多种向量索引、混合查询配置复杂、资源消耗较高大规模数据、复杂查询场景FAISS支持 GPU 加速、高效的相似性搜刮缺少数据库功能、没有持久化和集群支持高效向量搜刮、必要 GPU 加速的场景Weaviate支持混合查询、集成外部呆板学习模型大规模处理本领有限语义搜刮、知识图谱Pinecone托管服务、简单易用、实时查询非开源、灵活性较低快速开发、无需自建根本设施Vespa实时数据处理、复杂查询、呆板学习集成体系复杂、维护成本高大规模数据实时处理ChromaDB简单易用、轻量级、与天生式 AI 无缝集成、灵活存储选项扩展性有限、功能较少、缺少集群和 GPU 支持小中型项目、NLP 项目和嵌入管理 总结
ChromaDB 的优势在于轻量级、易于使用和与天生式 AI 的无缝集成,适合中小规模项目,尤其是必要处理嵌入和高维向量的 NLP 和图像嵌入任务。对于必要处理大规模数据、复杂查询、或 GPU 加速的应用,可能 Milvus 或 FAISS 会是更好的选择。如果你必要在快速开发情况中部署向量搜刮或嵌入管理,ChromaDB 是一个简单有用的选择。
B. 基本使用
ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用,存储和查询高维向量数据,通常用于大规模语义搜刮、推荐体系等领域。
以下是使用 ChromaDB 的步骤:
1. 安装 ChromaDB
你可以通过 pip 安装 ChromaDB:
2. 创建一个数据库并插入数据
你必要创建一个 Chroma 的实例,然后可以在这个实例中创建一个集归并添加向量数据。
- import chromadb
- # 创建 ChromaDB 客户端
- client = chromadb.Client()
- # 创建一个集合,用于存储向量数据
- collection = client.create_collection(name="my_collection")
- # 插入向量数据
- documents = ["Document 1", "Document 2", "Document 3"]
- embeddings = [
- [0.1, 0.2, 0.3], # 向量 1
- [0.4, 0.5, 0.6], # 向量 2
- [0.7, 0.8, 0.9], # 向量 3
- ]
- metadata = [{"source": "A"}, {"source": "B"}, {"source": "C"}]
- collection.add(
- documents=documents, # 文本
- embeddings=embeddings, # 对应的嵌入向量
- metadatas=metadata # 附加的元数据
- )
复制代码 3. 查询向量
你可以根据提供的查询向量进行相似性搜刮,查找与查询向量相似的文档。
- query_embedding = [0.2, 0.3, 0.4] # 你的查询向量
- # 搜索最相似的文档
- results = collection.query(
- query_embeddings=[query_embedding],
- n_results=2 # 返回最相似的 2 个文档
- )
- # 输出结果
- print(results)
复制代码 4. 更新与删除数据
你可以根据必要更新或删除某些向量或文档:
更新:
- collection.update(
- ids=["id_of_document"], # 要更新的文档的 id
- documents=["Updated document"],
- embeddings=[[0.9, 0.8, 0.7]], # 更新后的嵌入向量
- )
复制代码 删除:
- collection.delete(ids=["id_of_document"]) # 删除特定 ID 的文档
复制代码 5. 获取集合中的数据
如果你想获取某个集合中的全部数据,可以使用以下方法:
- all_docs = collection.get()
- print(all_docs)
复制代码 6. 使用 OpenAI 天生的嵌入向量
你还可以结合 OpenAI 等模型天生文本的嵌入向量,然后存储到 ChromaDB 中:
- import openai
- # 使用 OpenAI 模型生成嵌入
- response = openai.Embedding.create(
- model="text-embedding-ada-002",
- input="This is a sample document."
- )
- embedding = response['data'][0]['embedding']
复制代码 天生嵌入后,你可以将其插入到 ChromaDB 中,用于后续的查询和分析。
总结
ChromaDB 的重要功能包括:
- 存储和管理高维向量数据。
- 快速进行相似性搜刮。
- 结合嵌入模型,用于语义搜刮、推荐等应用。
如果你有更具体的需求或场景,可以进一步定制使用 ChromaDB 的操纵。
C. 持久化与增量更新
在 ChromaDB 中,要实现持久化和增量更新,可以利用以下机制:
1. 持久化存储
ChromaDB 默认使用内存中的数据库来存储数据,但它也支持将数据持久化到磁盘,以便在应用重启后仍旧保留数据。要实现持久化存储,你可以指定一个路径来保存数据。
- import chromadb
- # 创建持久化的 ChromaDB 客户端,指定存储路径
- client = chromadb.Client(persist_directory="./chromadb_data")
- # 创建或加载集合
- collection = client.create_collection(name="my_collection")
- # 插入文档和向量
- documents = ["Document 1", "Document 2"]
- embeddings = [
- [0.1, 0.2, 0.3],
- [0.4, 0.5, 0.6],
- ]
- metadata = [{"source": "A"}, {"source": "B"}]
- collection.add(
- documents=documents,
- embeddings=embeddings,
- metadatas=metadata
- )
- # 调用这个方法来保存数据到磁盘
- client.persist()
复制代码 每当你更新或插入数据后,可以调用 client.persist() 将数据写入磁盘,如许纵然步伐关闭后,数据依然存在。
2. 增量更新
增量更新指的是当有新数据时,不必重写整个数据库,而只对新数据进行添加或修改。
增量插入新数据
你可以使用 collection.add() 方法来增量添加新文档和嵌入向量:
- # 插入新的文档和嵌入
- new_documents = ["Document 3"]
- new_embeddings = [[0.7, 0.8, 0.9]]
- new_metadata = [{"source": "C"}]
- # 增量添加到现有的集合中
- collection.add(
- documents=new_documents,
- embeddings=new_embeddings,
- metadatas=new_metadata
- )
- # 持久化保存增量更新的数据
- client.persist()
复制代码 更新现有的数据
如果你必要更新现有的文档或向量,可以使用 collection.update():
- # 更新已有的文档,假设你要更新 ID 为 "doc_id_1" 的文档
- collection.update(
- ids=["doc_id_1"], # 更新文档的 ID
- documents=["Updated Document 1"], # 新的文档内容
- embeddings=[[0.3, 0.4, 0.5]] # 新的向量
- )
- # 持久化保存更新
- client.persist()
复制代码 删除文档
如果必要删除某些文档,可以使用 collection.delete() 方法:
- # 删除 ID 为 "doc_id_1" 的文档
- collection.delete(ids=["doc_id_1"])
- # 持久化保存更新
- client.persist()
复制代码 3. 加载已有数据
当你启动应用时,ChromaDB 可以从指定的持久化路径中加载已经保存的数据:
- # 创建持久化的 ChromaDB 客户端并加载数据
- client = chromadb.Client(persist_directory="./chromadb_data")
- # 加载已有的集合
- collection = client.get_collection(name="my_collection")
- # 现在你可以查询、更新或删除集合中的数据
复制代码 总结
- 持久化:通过指定 persist_directory 来保存数据到磁盘,并使用 client.persist() 确保更新写入磁盘。
- 增量更新:可以使用 collection.add() 插入新数据,collection.update() 更新现有数据,或 collection.delete() 删除数据,增量更新不会影响已有数据。
- 加载持久化数据:在应用启动时,通过指定路径加载已经保存的数据库集合。
这种方式确保数据的持久性,并且支持高效的增量更新。
D. 其它向量数据库
向量数据库是一种专门用于存储和查询高维向量数据的数据库,广泛用于自然语言处理、图像检索、推荐体系等场景。常见的开源向量数据库包括 Milvus、FAISS、Weaviate、Pinecone 和 Vespa。下面是这些数据库的优点和缺点比力:
1. Milvus
Milvus 是一种高度可扩展的开源向量数据库,专为海量非布局化数据管理而筹划,支持数十亿级别的向量数据管理。
- 优点:
- 支持多种向量搜刮算法(例如 IVF、HNSW 等),提供灵活的搜刮选项。
- 支持混合查询,可以对布局化和非布局化数据进行联合查询。
- 高可扩展性,能够处理大规模数据。
- 与其他大数据工具如 Spark 和 Kafka 集成精良。
- 提供了美满的社区支持和丰富的 API(Python、Java、Go 等)。
- 缺点:
- 资源消耗较高,部署和维护成本较大。
- 相对较新的项目,尽管发展敏捷,但某些高级功能可能还不如更成熟的体系稳固。
2. FAISS
FAISS 是 Facebook AI Research 团队开发的开源库,用于高效的相似性搜刮和麋集向量的聚类。
- 优点:
- 支持大规模、高维向量搜刮,并在 CPU 和 GPU 上都能高效运行。
- 在搜刮速率和精度上体现精良,尤其是在 GPU 加速下。
- 支持多种索引类型,能够根据不同的场景选择合适的索引布局。
- 缺点:
- 重要是一个库而非数据库,没有持久化存储机制,必要与其他存储体系结合使用。
- 缺乏内置的多节点集群支持,扩展性不如 Milvus 等数据库。
- 功能较单一,重要专注于向量相似度搜刮,不支持混合查询或其他高级数据库功能。
3. Weaviate
Weaviate 是一个基于 GraphQL 和 RESTful API 的开源向量数据库,筹划用于支持向量和布局化数据的混合查询。
- 优点:
- 提供了向量搜刮与布局化数据查询的强大结合,适合知识图谱和语义搜刮。
- 内置分类器,可以自动处理非布局化数据并天生向量表现。
- 拥有高度扩展的插件体系,能够轻松集成外部呆板学习模型或其他第三方工具。
- 缺点:
- 对大规模数据集的处理本领较为有限,性能不如 Milvus 和 FAISS 强大。
- 社区活跃度相对较低,功能更新速率和文档支持可能不敷。
4. Pinecone
Pinecone 是一个向量数据库,尽管不是完全开源,但仍旧在向量搜刮领域有着广泛应用。其目标是提供一个托管的、可扩展的向量搜刮平台。
- 优点:
- 提供托管服务,开发者无需担心底层根本设施的维护和管理。
- 高度可扩展,支持实时查询和批量插入大规模数据。
- 提供简单易用的 API 和集成工具。
- 缺点:
- 非完全开源,某些高级功能可能必要付费版本。
- 灵活性较低,因为它是托管服务,用户无法直接控制底层架构。
- 依赖于第三方服务,可能面临服务商锁定的风险。
5. Vespa
Vespa 是 Verizon Media 推出的一个开源的、大规模实时搜刮和推荐引擎,适合复杂的向量搜刮和大规模数据处理。
- 优点:
- 支持实时和批量数据的处理,适合实时性要求高的场景。
- 除了向量搜刮,还支持布局化查询、呆板学习模型推理等多种功能。
- 高度可扩展,适合处理数十亿级别的文档和查询。
- 缺点:
- 架构复杂,配置和维护成本较高。
- 相对较重的体系,适用于大规模工业应用,可能不适合较小的数据集或简单的应用场景。
总结:
- Milvus 适合大规模向量数据的处理,且支持混合查询,适合必要高可扩展性的场景。
- FAISS 适合必要在 CPU/GPU 上进行高效向量相似性搜刮的场景,但不具备数据库功能。
- Weaviate 适合处理向量和布局化数据的混合查询,且易于扩展和集成。
- Pinecone 适合必要托管服务并希望避免根本设施管理的用户,但它不是完全开源的。
- Vespa 适合大规模复杂查询和实时处理场景,功能强大但架构复杂。
根据你的应用场景和需求,选择合适的向量数据库可以帮助你更好地处理高维向量数据和优化查询性能。
E. 参考文献
- chroma-core/chroma: the AI-native open-source embedding database
- alejandro-ao/langchain-ask-pdf: An AI-app that allows you to upload a PDF and ask questions about it. It uses OpenAI’s LLMs to generate a response.
- VikParuchuri/marker: Convert PDF to markdown quickly with high accuracy
- 240922-Ollama使用Embedding实现RAG-CSDN博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |