240922-chromadb的基本使用

在这里插入图片描述

A. 背景介绍

ChromaDB 是一个较新的开源向量数据库,专为高效的嵌入存储和检索而设计。与其他向量数据库相比,ChromaDB 更加专注于轻量化、简单性和与机器学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量,特别是与生成式 AI(如 GPT 系列)集成。

ChromaDB 的优点

  1. 简单易用

    • ChromaDB 提供了简单直观的 API,开发者可以快速上手。其轻量化设计使得在开发环境中运行和集成变得非常便捷。
    • 内置支持文本嵌入,特别适合 NLP 项目,与诸如 OpenAI 的 GPT 模型结合使用效果显著。
  2. 轻量级

    • 相较于 Milvus 和 Vespa 等重量级系统,ChromaDB 是一种轻量级的选择,不需要复杂的配置和大规模基础设施支持。非常适合小型或中型项目。
  3. 内置存储和检索功能

    • 提供了嵌入的持久化和检索功能,能够方便地将计算出的嵌入存储在数据库中,并进行高效的相似度查询。
    • 支持基于向量的最近邻搜索,查询性能相对较好。
  4. 无缝集成机器学习模型

    • ChromaDB 特别强调与各种生成式 AI 和嵌入模型的集成。可以轻松与 Hugging Face 等机器学习库和模型结合使用,用于 NLP、图像嵌入等。
  5. 灵活的存储后端

    • 它可以本地运行,也可以连接到其他数据库或存储后端(例如 SQLite 或 PostgreSQL),从而提供了更多的灵活性。
  6. 社区支持

    • 虽然相对较新,但 ChromaDB 的开发者活跃,社区在不断推动其更新与发展。

ChromaDB 的缺点

  1. 扩展性有限

    • ChromaDB 目前的扩展性不如 Milvus、Vespa 或 FAISS 等专为大规模向量处理设计的数据库。它更适合中小规模的数据集,在大规模场景下可能面临性能瓶颈。
  2. 功能相对较少

    • 相比于 Milvus 和 Weaviate 提供的混合查询功能,ChromaDB 主要专注于嵌入和向量搜索,不具备复杂的查询处理能力。
    • 不具备一些高级功能(如 Weaviate 的分类器或 Vespa 的实时处理能力)。
  3. 集群支持不完善

    • 目前 ChromaDB 不支持多节点集群部署,无法像 Milvus 和 Vespa 那样轻松处理跨多个节点的大规模数据查询。
  4. 成熟度不足

    • ChromaDB 相对较新,虽然社区活跃,但在稳定性、文档完善性和企业级使用上与成熟的向量数据库如 FAISS、Milvus 还有一定差距。
    • 缺少一些企业级功能,比如事务管理、备份和恢复等。
  5. 缺少 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:

pip install 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")

# 现在你可以查询、更新或删除集合中的数据

总结

  1. 持久化:通过指定 persist_directory 来保存数据到磁盘,并使用 client.persist() 确保更新写入磁盘。
  2. 增量更新:可以使用 collection.add() 插入新数据,collection.update() 更新现有数据,或 collection.delete() 删除数据,增量更新不会影响已有数据。
  3. 加载持久化数据:在应用启动时,通过指定路径加载已经保存的数据库集合。

这种方式确保数据的持久性,并且支持高效的增量更新。

D. 其它向量数据库

向量数据库是一种专门用于存储和查询高维向量数据的数据库,广泛用于自然语言处理、图像检索、推荐系统等场景。常见的开源向量数据库包括 MilvusFAISSWeaviatePineconeVespa。下面是这些数据库的优点和缺点比较:

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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/882055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络 - 基础问题】每日 3 题(十八)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

通信工程学习:什么是NFV网络功能虚拟化

NFV:网络功能虚拟化 NFV(Network Function Virtualization),即网络功能虚拟化,是一种通过虚拟化技术实现网络功能的技术手段。它借鉴了x86服务器的架构,将传统的网络硬件设备如路由器、交换机、防火墙、负载…

华为eNSP使用详解

eNSP(Enterprise Network Simulation Platform)是华为提供的一款网络仿真平台,它允许用户在没有真实设备的情况下进行网络实验和学习网络技术。eNSP可以模拟各种网络设备,如交换机、路由器、防火墙等,并支持创建多种网…

【python】【绘制小程序】动态爱心绘制

背景介绍 参考链接:https://blog.csdn.net/Python_HUHU/article/details/139703289点的背景颜色在开始修改;文字的颜色在最后修改。文字内容可以修改。 python 代码 import tkinter as tk import random from math import sin, cos, pi, log from PIL…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u3-sysin/,查看最新版…

数字IC设计\FPGA 职位经典笔试面试整理--基础篇1

注: 资料都是基于网上一些博客分享和自己学习整理而成的 1:什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序 逻辑电路的特点:各触发器的时钟端全部连接在一…

基于机器学习的注意力缺陷/多动障碍 (ADHD)(python论文+代码)HYPERAKTIV

简述 医疗保健领域的机器学习研究往往缺乏完全可重复性和可比性所需的公共数据。由于患者相关数据附带的隐私问题和法律要求,数据集往往受到限制。因此,许多算法和模型发表在同一主题上,没有一个标准的基准。因此,本文提出了一个公…

【STM32】TIM定时器定时中断与定时器外部时钟的使用

TIM定时器定时中断与定时器外部时钟的使用 一、TIM定时器简介1、TIM(Timer)定时器2、定时器类型3、高级定时器4、通用定时器5、基本定时器6、定时中断基本结构代码编写:定时中断/外部时钟定时中断 7、预分频器时序8、计数器时序9、计数器无预…

Arthas dashboard(当前系统的实时数据面板)

文章目录 二、命令列表2.1 jvm相关命令2.1.1 dashboard(当前系统的实时数据面板) 二、命令列表 2.1 jvm相关命令 2.1.1 dashboard(当前系统的实时数据面板) 使用场景: 在 Arthas 中,dashboard 命令用于提…

旋转机械故障诊断 震动故障分析与诊断

旋转机械故障诊断 机理资料整理 电气故障,机械故障(不平衡,不对中,松动,轴承,共振,流体振动,皮带松动),低速与高速机器故障诊断等 旋转机械故障诊断:机理资料整理 目录…

音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击:移动硬盘为何需格式化才能访问? 在数字化时代,移动硬盘作为数据存储与传输的重要工具,其稳定性与可靠性直接关系到用户数据的安全。然而,不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

Stable Diffusion 优秀博客转载

初版论文地址:https://arxiv.org/pdf/2112.10752 主要流程图: Latent Diffusion Models(LDMs) DDPM是"Denoising Diffusion Probabilistic Models"的缩写, 去噪扩散概率模型 博客: 【论文阅读…

【LeetCode】146. LRU缓存

1.题目 2.思想 3.代码 3.1 代码1 下面这是一版错误的代码。错误的原因在于逻辑不正确导致最后的代码也是不正确的。 class LRUCache:def __init__(self, capacity: int):self.time 0 # 用于全局记录访问的时间self.num2time {} # 数字到时间的映射self.key2val {} # 数字…

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在灰度图像中使用霍夫变换查找圆形。 该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。 例子&#xff1a; #include <opencv2/imgp…

对抗攻击的详细解析:原理、方法与挑战

对抗攻击的详细解析&#xff1a;原理、方法与挑战 对抗攻击&#xff08;Adversarial Attack&#xff09;是现代机器学习模型&#xff0c;尤其是深度学习模型中的一个关键安全问题。其本质在于&#xff0c;通过对输入数据添加精微的扰动&#xff0c;人类难以察觉这些扰动&#…

计算机网络:概述 --- 体系结构

目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…

前端组件库Element UI 的使用

一、准备工作 1.确保安装了开发软件 VS Code&#xff08;此处可查阅安装 VS Code教程&#xff09;&#xff0c;确保相关插件安装成功 2.安装Node.js 和创建Vue项目&#xff08;此处可查阅安装创建教程&#xff09; 3.成功在VS Code运行一个Vue项目&#xff08;此处可查阅运行…

Pybullet 安装过程

Pybullet 安装过程&#xff08;windows&#xff09; 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件&#xff0c;直接装之前检查下&#xff0c;要不会报缺少某版本MVSC的error&#xff0c;最好的方式是直接下载visual studio&#xff0c;直接按默认…

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要&#xff0c;它们不仅反映了网络安全领域的最新发展趋势&#xff0c;也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对&#xff1a; 目标&#xff1a;建立多层次、全方位的网络安全防…