240922-chromadb的基本使用

news2024/9/23 7:04:47

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程】数据流图和数据字典

一、数据流图 3.符号 分析结果 二、数据字典 例题 选择题

使用build_chain.sh离线搭建匹配的区块链,并通过命令配置各群组节点的MySQL数据库

【任务】 登陆Linux服务器,以MySQL分布式存储方式安装并部署如图所示的三群组、四机构、 七节点的星形组网拓扑区块链系统。其中,三群组名称分别为group1、group2和group3, 四个机构名称为agencyA、agencyB、agencyC、agencyD。p2p_port、cha…

Python | Leetcode Python题解之第429题N叉树的层序遍历

题目: 题解: class Solution:def levelOrder(self, root: Node) -> List[List[int]]:if not root:return []ans list()q deque([root])while q:cnt len(q)level list()for _ in range(cnt):cur q.popleft()level.append(cur.val)for child in c…

爬虫过程 | 蜘蛛程序爬取数据流程(初学者适用)

蜘蛛程序(也称网络爬虫,是搜索引擎的重要组成部分) 主要功能:遍历互联网,抓取网站信息并建立索引,便于用户在搜索引擎中检索到最新的网页内容工作原理:从初始网站页面的URL开始,发送…

qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType

qt-C笔记之Q_DECLARE_METATYPE和qRegisterMetaType code review! 文章目录 qt-C笔记之Q_DECLARE_METATYPE和qRegisterMetaType一.Q_DECLARE_METATYPE使用方法应用场景 二.为什么需要注册类型?三.使用 Q_DECLARE_METATYPE 处理自定义类型的简短示例3.1.自定义类型定…

《独孤九剑》游戏源码(客户端+服务端+数据库+游戏全套源码)大小2.38G

《独孤九剑》游戏源码(客户端服务端数据库游戏全套源码)大小2.38G ​ 下载地址: 通过网盘分享的文件:【源码】《独孤九剑》游戏源码(客户端服务端数据库游戏全套源码)大小2.38G 链接: https://pan.baidu.co…

生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队指导设计、解读实验结果。

查看原文>>>生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队免费指导设计、解读实验结果、一台服务器解决您所有的分析困扰!

VLDB 2024 圆桌会议回顾:展望物联网与 AI 时代的时序数据库

回顾我们在 VLDB 2024 8 月 26 日至 8 月 30 日,数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 最新研发成果的三篇论文被本次大会录用(详见:IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与…

6.7泊松噪声

基础概念 在OpenCV联合C中给一张图片添加泊松噪声(Poisson Noise)可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。泊松噪声是一种统计分布服从泊松分布的噪声,通常用于模拟光子计数等场景。 使用泊松噪声的场景 泊松噪声通…

【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案

人话说在前:这篇的内容是2022年5月写的,当时碰到了要批量处理数据的情况,但是又不知道数据为啥一直报错报错报错,说不允许我操作,最终发现是因为存在隐藏的列或行,于是就很无语地写了博客,但内容…

Codeforces Round 972 (Div. 2) E2. Subtangle Game (Hard Version)(博弈+双指针 sg函数思想)

题目 思路来源 稲葉廻代码 题解 这个题比easy version的数据范围大了比较多, 不能再直接dp[i][j][k]表示数组a的第i个做开始局面时,位置(j,k)为起点时的获胜情况了 当然你把第一维压到bitset里,然后前缀和优化一下,还是可以通…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展:回归与回溯 中序遍历图解 首先看下中序遍历的代码,其接受一个根结点root作为参数,判断根节点是否为nil,不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …

Tomcat中间件常见漏洞复现

#1.CVE-2017-12615 -----Tomcat put方法任意文件写入漏洞 1.打开靶场 cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d docker ps 2.访问8080端口,来到靶场 3.首页进抓包,Tomcat允许适⽤put⽅法上传任意⽂件类型,但不允许jsp后缀…

redisson 延迟队列实现任务过期监听

一、需求: 任务超过一个小时以后,如果还为待执行状态,则自动转为结束状态。 二、实现: 创建延迟队列的监听任务RedisDelayedQueueListener,消费延迟队列;创建新增延迟队列的类,用于创建延迟队列&#xf…

LeetCode 热题 100 回顾17

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

HTML翻牌器:用CSS和HTML元素创造动态数字展示

HTML翻牌器:用CSS和HTML元素创造动态数字展示 前言 翻牌器是一种数字动态展示形式,在生活中常见的例如翻牌计分、翻牌时钟等。 之所以以翻牌的形式是因为其物理设计的原因使其只能滚动翻牌展示数字,在电子显示设备不普及时,使用…

PMBOK® 第六版 估算活动持续时间

目录 读后感—PMBOK第六版 目录 在项目管理中,尤其是在软件开发这样的复杂项目中,工作内容是多种多样的。从需求分析、设计、编码到测试和部署,每个阶段都有其独特的挑战和不确定性。 没有人能独自完成所有估算工作并做到绝对精准。估算涉及…

【Unity Shader】Special Effects(九)Vortex 旋涡(UI)

源码:[点我获取源码] 索引 Vortex 旋涡思路分析旋涡中心旋涡旋转旋涡强度旋涡动画Vortex 旋涡 旋涡效果可以将一张图像以指定点作为旋涡中心,呈顺时针旋涡动画效果,使用动画播放器: 思路分析 首先,旋涡特效的核心也即是旋转(特别是uv坐标的旋转); 在此基础上,旋涡中…

Vue(15)——组合式API②

生命周期函数 选项式组合式beforeCreate/createdsetupbeforeMountonBeforeMount mountedonMounedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmounted 父子通信 父传子基本思想: 父组件中给子组件绑定属性…

Vue Devtools -----一条龙安装教程 + 解决安装使用过程的一些问题

一条龙安装教程(首次 安装看这里) 点击下方网址 进入下载页面 安装 |Vue 开发工具 (vuejs.org)https://devtools-v6.vuejs.org/guide/installation.html 选择适合自己浏览器的版本 以Edge为例,点击下载即可 我以为已经下载过了,…