【RAG落地利器】向量数据库Chroma入门教程

安装部署

官方有pip安装的方式,为了落地使用,我们还是采用Docker部署的方式,参考链接来自官方部署:

https://cookbook.chromadb.dev/running/running-chroma/#docker-compose-cloned-repo

我们在命令终端运行:

docker run -d --rm --name chromadb -p 8001:8000 -v H:/Projects/chroma/volumes/index_data:/chroma/chroma -e IS_PERSISTENT=TRUE -e ANONYMIZED_TELEMETRY=TRUE chromadb/chroma:0.6.4.dev19

其中-v H:/Projects/chroma/volumes/index_data:/chroma/chroma代表将本地的目录映射到容器的数据存储目录。容器启动日志如下:

通过浏览器访问http://localhost:8000/docs,如果能看到ChromaDB的文档页面,说明ChromaDB已经成功安装并运行。

Chroma简介

高效管理文本嵌入与相似度搜索的向量数据库

随着大型语言模型(LLM)的广泛应用,向量数据库逐渐成为处理文本嵌入和相似度搜索的关键工具。Chroma 是一个开源的向量数据库,专门设计用于存储和检索文本嵌入,帮助开发者更高效地构建基于大模型的应用。本文将带你了解Chroma的核心功能、设计理念以及如何使用它进行文本嵌入管理和相似度搜索。

什么是向量数据库?

向量数据库是一种专门用于存储和检索高维向量数据的数据库。与传统的关系型数据库不同,向量数据库针对非结构化数据(如文本、图像等)的嵌入表示进行了优化。通过将文本转换为向量嵌入,计算机能够以数字形式理解文本内容,从而支持语义搜索、个性化推荐等高级功能。

在大模型应用中,向量数据库的作用尤为重要。用户输入的文本会被转换为向量嵌入,随后通过相似度搜索算法在数据库中查找相关文档,最终生成个性化的响应。这种机制不仅提高了大模型的响应速度,还降低了计算成本。

Chroma的核心特点

Chroma 是一个开源的向量数据库,专注于简化文本嵌入的存储和检索过程。它的主要特点包括:

  1. 支持多种存储后端:Chroma支持多种底层存储选项,如DuckDB(适用于独立应用)和ClickHouse(适用于大规模扩展)。
  2. 多语言支持:Chroma提供了Python和JavaScript/TypeScript的SDK,方便开发者快速集成。
  3. 简单易用:Chroma的设计理念是“简单至上”,旨在提升开发者的效率。
  4. 高性能:Chroma不仅支持快速的相似度搜索,还提供了对搜索结果的分析功能。

Chroma的工作原理

Chroma的工作流程可以分为以下几个步骤:

  1. 创建集合(Collection):集合类似于关系数据库中的表,用于存储文档及其嵌入。默认情况下,Chroma使用all-MiniLM-L6-v2模型将文本转换为嵌入,但开发者可以根据需求选择其他嵌入模型。
  2. 添加文档:将文本文档及其元数据添加到集合中。Chroma会自动将文本转换为嵌入并存储。
  3. 查询与搜索:通过文本或嵌入查询集合,Chroma会返回与查询内容相似的文档。开发者还可以根据元数据对结果进行过滤。

Chroma的设计理念

Chroma的设计目标是为开发者提供一种简单、高效的工具,帮助他们将现实世界中的知识、事实和技能整合到大模型中。其设计理念包括:

  1. 简单性与开发效率:Chroma的API设计简洁,开发者可以快速上手并集成到现有应用中。
  2. 搜索与分析并重:除了支持高效的相似度搜索,Chroma还提供了对搜索结果的分析功能,帮助开发者更好地理解数据。
  3. 高性能:Chroma在保证功能丰富的同时,也追求极致的性能表现。

在 ChromaDB 中,条件查询是一个非常强大的功能,允许你根据元数据(metadata)或文档内容(document content)来过滤查询结果。以下是如何在 ChromaDB 中进行条件查询的详细说明和示例代码。


ChromaDB 入门教程

ChromaDB 是一个开源的向量数据库,专门用于存储和查询向量嵌入。它非常适合用于自然语言处理(NLP)任务,如文本相似性搜索、推荐系统等。本教程将带你从零开始,学习如何使用 Python 操作 ChromaDB。

1. 安装 ChromaDB

首先,你需要安装 ChromaDB 和 OpenAI 的嵌入模型库。确保你已经设置了 OpenAI API 密钥。

pip install chromadb openai

2. 创建 ChromaDB 客户端

ChromaDB 支持内存模式和持久化模式。内存模式适合临时数据存储,而持久化模式会将数据保存在磁盘上。

import chromadb
from chromadb.config import Settings# 创建持久化客户端,数据将保存在 "db/" 目录中
client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet",persist_directory="db/"
))

如果是docker部署的话,需要改成

import chromadbclient = chromadb.HttpClient(host="127.0.0.1",port=8000,settings=chromadb.Settings(chroma_client_auth_provider="chromadb.auth.token_authn.TokenAuthClientProvider",chroma_client_auth_credentials="your_token"))

3. 创建集合(Collection)

集合类似于传统数据库中的表。你可以通过 create_collection 方法创建一个新的集合。

collection = client.create_collection(name="Students")

4. 添加数据到集合

你可以将文本数据添加到集合中,ChromaDB 会自动将文本转换为向量嵌入并存储。

student_info = """
Alexandra Thompson, a 19-year-old computer science sophomore with a 3.7 GPA,
is a member of the programming and chess clubs who enjoys pizza, swimming, and hiking
in her free time in hopes of working at a tech company after graduating from the University of Washington.
"""club_info = """
The university chess club provides an outlet for students to come together and enjoy playing
the classic strategy game of chess. Members of all skill levels are welcome, from beginners learning
the rules to experienced tournament players. The club typically meets a few times per week to play casual games,
participate in tournaments, analyze famous chess matches, and improve members' skills.
"""university_info = """
The University of Washington, founded in 1861 in Seattle, is a public research university
with over 45,000 students across three campuses in Seattle, Tacoma, and Bothell.
As the flagship institution of the six public universities in Washington state,
UW encompasses over 500 buildings and 20 million square feet of space,
including one of the largest library systems in the world.
"""# 添加数据到集合
collection.add(documents=[student_info, club_info, university_info],metadatas=[{"source": "student info"}, {"source": "club info"}, {"source": "university info"}],ids=["id1", "id2", "id3"]
)

5. 查询数据

你可以使用 query 方法进行相似性搜索。ChromaDB 会将查询文本转换为向量,并使用相似性算法返回最相关的结果。

results = collection.query(query_texts=["What is the student name?"],n_results=2
)print(results)

6. 使用其他嵌入模型

ChromaDB 默认使用 all-MiniLM-L6-v2 模型进行嵌入。你也可以使用其他模型,如 OpenAI 的 text-embedding-ada-002

from chromadb.utils import embedding_functionsopenai_ef = embedding_functions.OpenAIEmbeddingFunction(model_name="text-embedding-ada-002"
)students_embeddings = openai_ef([student_info, club_info, university_info])
print(students_embeddings)

7. 更新和删除数据

你可以更新或删除集合中的数据。

更新数据

collection.update(ids=["id1"],documents=["Kristiane Carina, a 19-year-old computer science sophomore with a 3.7 GPA"],metadatas=[{"source": "student info"}]
)

删除数据

collection.delete(ids=["id1"])# 查询以验证删除
results = collection.query(query_texts=["What is the student name?"],n_results=2
)print(results)

8. 其他操作

获取集合列表

collections = client.list_collections()
print(collections)

获取集合中的数据

collection = client.get_collection(name="Students")
data = collection.peek()  # 获取集合中的前10条数据
print(data)

删除集合

client.delete_collection(name="Students")

9. 数据持久化

如果你希望数据持久化存储,可以使用 PersistentClient

client = chromadb.PersistentClient(path="./chroma_db")

10. 条件查询

你可以根据元数据或文档内容进行过滤查询。

results = collection.query(query_texts=["What is the student name?"],n_results=2,where={"source": "student info"},where_document={"$contains": "computer science"}
)print(results)

11. 更新文档

你可以通过 update 方法更新集合中的文档。

collection.update(ids=["id1"],documents=["Updated student info"],metadatas=[{"source": "updated student info"}]
)

12. 删除文档

你可以通过 delete 方法删除集合中的文档。

collection.delete(ids=["id1"])

Chroma条件查询教程

1. 按元数据过滤(where 参数)

你可以使用 where 参数来根据元数据字段进行过滤。元数据是你在添加数据时提供的附加信息。

支持的运算符

  • $eq:等于
  • $ne:不等于
  • $gt:大于
  • $gte:大于或等于
  • $lt:小于
  • $lte:小于或等于
  • $in:在列表中
  • $nin:不在列表中

示例代码

假设我们有以下数据:

collection.add(documents=["Document about AI", "Document about food", "Document about travel"],metadatas=[{"category": "technology", "year": 2022},{"category": "lifestyle", "year": 2021},{"category": "travel", "year": 2023}],ids=["id1", "id2", "id3"]
)
查询 categorytechnology 的文档
results = collection.query(query_texts=["AI"],n_results=2,where={"category": {"$eq": "technology"}}  # 过滤条件
)print(results)
查询 year 大于 2021 的文档
results = collection.query(query_texts=["technology"],n_results=2,where={"year": {"$gt": 2021}}  # 过滤条件
)print(results)
查询 category["technology", "travel"] 中的文档
results = collection.query(query_texts=["AI"],n_results=2,where={"category": {"$in": ["technology", "travel"]}}  # 过滤条件
)print(results)

2. 按文档内容过滤(where_document 参数)

你可以使用 where_document 参数来根据文档内容进行过滤。支持的操作符是 $contains,用于检查文档中是否包含指定的字符串。

示例代码

查询文档中包含 AI 的文档
results = collection.query(query_texts=["technology"],n_results=2,where_document={"$contains": "AI"}  # 过滤条件
)print(results)
查询文档中包含 food 的文档
results = collection.query(query_texts=["lifestyle"],n_results=2,where_document={"$contains": "food"}  # 过滤条件
)print(results)

3. 组合条件查询

你可以将 wherewhere_document 结合使用,进行更复杂的查询。

示例代码

查询 categorytechnology 且文档中包含 AI 的文档
results = collection.query(query_texts=["AI"],n_results=2,where={"category": {"$eq": "technology"}},  # 元数据过滤where_document={"$contains": "AI"}  # 文档内容过滤
)print(results)
查询 year 大于 2021 且文档中包含 travel 的文档
results = collection.query(query_texts=["travel"],n_results=2,where={"year": {"$gt": 2021}},  # 元数据过滤where_document={"$contains": "travel"}  # 文档内容过滤
)print(results)

4. 逻辑运算符($and$or

你可以使用逻辑运算符 $and$or 来组合多个条件。

示例代码

查询 categorytechnologyyear 大于 2021 的文档
results = collection.query(query_texts=["AI"],n_results=2,where={"$or": [{"category": {"$eq": "technology"}},{"year": {"$gt": 2021}}]}
)print(results)
查询 categorytechnologyyear 大于 2021 的文档
results = collection.query(query_texts=["AI"],n_results=2,where={"$and": [{"category": {"$eq": "technology"}},{"year": {"$gt": 2021}}]}
)print(results)

5. 完整条件查询示例代码

以下是一个完整的示例,展示了如何添加数据并进行条件查询:

import chromadb
from chromadb.config import Settings# 创建客户端
client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet",persist_directory="db/"
))# 创建集合
collection = client.create_collection(name="Documents")# 添加数据
collection.add(documents=["Document about AI", "Document about food", "Document about travel"],metadatas=[{"category": "technology", "year": 2022},{"category": "lifestyle", "year": 2021},{"category": "travel", "year": 2023}],ids=["id1", "id2", "id3"]
)# 条件查询:category 为 technology 且文档中包含 AI
results = collection.query(query_texts=["AI"],n_results=2,where={"category": {"$eq": "technology"}},where_document={"$contains": "AI"}
)print("查询结果:", results)

参考资料

  • 向量检索Chroma使用和服务端docker部署
  • ChromaDB教程
  • Chroma向量数据库完全手册
  • 向量数据库Chroma极简教程
  • Python Chromadb 向量数据库快速入门
  • Chroma向量数据库使用教程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python django的音乐用户偏好分析及可视化系统设计与实现

1.1 论文背景 随着信息技术的快速发展,在线音乐服务已成为日常生活的重要组成部分。QQ音乐,凭借其创新的音乐推荐算法和独特的社交特性,成功在竞争激烈的市场中获得一席之地。该平台的歌单文化和评论文化不仅满足了用户自尊和自我实现的需求…

以Python构建ONE FACE管理界面:从基础至进阶的实战探索

一、引言 1.1 研究背景与意义 在人工智能技术蓬勃发展的当下,面部识别技术凭借其独特优势,于安防、金融、智能终端等众多领域广泛应用。在安防领域,可助力监控系统精准识别潜在威胁人员,提升公共安全保障水平;金融行业中,实现刷脸支付、远程开户等便捷服务,优化用户体…

以单用户模式启动 Linux 的方法

注:本文为 “Linux 启动单用户模式” 相关文章合辑。 未整理去重。 以单用户模式启动 linux 的三种方法 作者: Magesh Maruthamuthu 译者: LCTT Xiaobin.Liu 2020-05-03 23:01 单用户模式,也被称为维护模式,超级用户…

【C++】size_t全面解析与深入拓展

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯一、什么是size_t?为什么需要size_t? 💯二、size_t的特性与用途1. size_t是无符号类型示例: 2. size_t的跨平台适应性示例对…

YOLOv9改进,YOLOv9检测头融合RFAConv卷积,适合目标检测、分割任务

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…

Mysql触发器(学习自用)

一、介绍 二、触发器语法 注意:拿取新的数据时用new,旧数据用old。

即现软著工具 - 让软著申请更高效

在软件著作权申请的过程中,开发者常常会遇到代码整理、统计和生成证明文件等繁琐且复杂的任务。为了解决这些问题,提高申请效率和成功率,给大家介绍一款工具:即现软著工具。 即现软著工具,能够快速整理软著申请的程序鉴…

Java Web开发高级——单元测试与集成测试

测试是软件开发的重要环节,确保代码质量和功能的正确性。在Spring Boot项目中,单元测试和集成测试是常用的两种测试类型: 单元测试:测试单个模块(如类或方法)是否按预期工作。集成测试:测试多个…

路径规划之启发式算法之二十八:候鸟优化算法(Migrating Birds Optimization, MBO)

候鸟优化算法(Migrating Birds Optimization, MBO)是一种基于群体智能的元启发式优化算法,其灵感来源于候鸟迁徙时的“V”字形飞行队列。这种队列结构能够有效减少能量消耗,同时提高飞行效率。MBO算法通过模拟候鸟的迁徙行为,利用群体间的协作和信息共享来优化问题的解。 …

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者:来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间,我遇到了数百名客户,他们最常问的问题之一是:“我的数据在 Elastic 中;我该如何利用它获得最大优势?”。 如果这适用于你,那么本…

C# 委托和事件思维导图

思维导图 下载链接腾讯云盘 https://share.weiyun.com/fxBH9ESl

2024.ailx10的年终总结

已经工作7年啦,今年网络安全行业愈发寒冷,几乎所有友商都在做安全GPT,说实话,AI确实颠覆了传统的网络安全运营,以前需要安服处置告警,以后可能就不需要了,大家日子都不好过,越是简单…

机器学习(5):支持向量机

1 介绍 支持向量机(Support Vector Machine,简称 SVM)是一种监督学习算法,主要用于分类和回归问题。SVM 的核心思想是找到一个最优的超平面,将不同类别的数据分开。这个超平面不仅要能够正确分类数据,还要使…

AI需要的基础数学知识

AI(人工智能)涉及多个数学领域,以下是主要的基础数学知识: 1. 线性代数 矩阵与向量:用于表示数据和模型参数。矩阵乘法:用于神经网络的前向传播。特征值与特征向量:用于降维和主成分分析&…

flutter跨端UI框架简介

flutter跨端UI框架简介 简介 Flutter是由Google开发的开源应用开发框架,主要用于构建高性能、跨平台的移动、Web和桌面应用程序。Flutter使用Dart语言,提供了一套丰富的Widgets,使开发者能够快速创建美观的用户界面。其最大特点是热重载功能…

找不到mfc140u,具体原因分析

mfc140u.dll 是 Microsoft Foundation Classes (MFC) 库的一部分,通常与使用 MFC 构建的应用程序一起分发。当应用程序尝试运行但找不到 mfc140u.dll 时,可能的原因包括但不限于以下几点: 1.文件缺失: •可能是在安装或更新过程中…

StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级

自 StarRocks 3.0 起,社区明确了以 Lakehouse 为核心的发展方向。Lakehouse 的价值在于融合数据湖与数据仓库的优势,能有效应对大数据量增长带来的存储成本压力,做到 single source of truth 的同时继续拥有极速的查询性能,同时也…

[答疑]这个消息名是写发送数据还是接收数据

睡鱼(61***11) 16:08:29 睡鱼(61***11) 16:08:58 他们说这个图有问题 UML菜鸟(1***22) 16:10:55 有点暗 睡鱼(61***11) 16:27:50 顺序图里面的箭头代表消息还是职责 睡鱼(61***11) 16:28:08 比如 a往b发送数据 睡鱼(61***11) 16:28:36 这个消息名是写发送数据还是接收数据 睡…

WPS按双字段拆分工作表到独立工作簿-Excel易用宝

我们老板真是事多,他说要把这个工作表以月份和支付方式的维度,以这两个字段进行拆分工作表,而且拆分出来的表格要保存一个新的工作簿。 啥事都交给我,他还以为我有三头六臂呢,还好我有易用宝,可以轻松拆分…

Linux——信号量和(环形队列消费者模型)

Linux——线程条件变量(同步)-CSDN博客 文章目录 目录 文章目录 前言 一、信号量是什么? 二、信号量 1、主要类型 2、操作 3、应用场景 三、信号量函数 1、sem_init 函数 2、sem_wait 函数 3、sem_post 函数 4、sem_destroy 函数 ​​​​​​…