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

news2025/1/22 15:31:03

安装部署

官方有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 chromadb

client = 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_functions

openai_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.coloradmin.cn/o/2280435.html

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

相关文章

电阻电位器可调电阻信号隔离变送器典型应用

电阻电位器可调电阻信号隔离变送器典型应用 产品描述: 深圳鑫永硕科技的XYS-5587系列是一进一出线性电子尺(电阻/电位计信号及位移)信号隔离变送器,是将输入电阻,线性电子尺,角度位移传感器信号进行采集,隔离,放大并转换成模拟量信号的小型仪表设备,并以…

[创业之路-259]:《向流程设计要效率》-1-让成功成熟业务交给流程进行复制, 把创新产品新业务新客户交给精英和牛人进行探索与创造

标题:成功与创新的双轨并行:以流程复制成熟,以精英驱动新知 在当今这个日新月异的商业环境中,企业要想持续繁荣发展,就必须在稳定与创新之间找到完美的平衡点。一方面,成熟业务的稳定运营是企业生存和发展的…

模拟飞行入坑(五) P3D 多通道视角配置 viewgroup

背景: P3D进行多个屏幕显示的时候,如果使用英伟达自带的屏幕融合成一个屏,或者使用P3D单独拉伸窗口,会使得P3D的画面被整体拉伸,又或者,当使用Multichannel进行多个设备联动时,视角同步组合需要配置&#…

Java中的错误与异常详解

Java中的错误与异常详解 Java提供了一种机制来捕获和处理程序中的异常和错误。异常和错误都继承自 Throwable 类,但它们有着不同的用途和处理方式。 1. Error(错误) Error 是程序无法处理的严重问题,通常由 JVM(Java…

免费开源的三维建模软件Blender

软件介绍 Blender是一款功能强大且免费开源的三维建模、动画制作和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化、教育及艺术创作等多个领域。 核心功能 Blender是一款全能型3D软件,涵盖了从建模、动画到渲染、后期合成的完整工作流程。 1、建…

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中,默认情况下,查询结果是根据 相关度 评分(score)进行排序的。我们之前已经了解过,相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中,网络请求是常见且致其重要的功能之一。从获取资料到上传数据,出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架,提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

面向对象编程——对象实例化

在python中,对象实例化是根据类的定义创建具体对象的过程。也就是将类当成模板,从而定义了对象的结构和行为,而实例化则是根据这个模板创建具体的对象实例。每个实例都有自己独立的状态,但是却共享类的结构和方法。 代码&#xff…

阿里云-银行核心系统转型之业务建模与技术建模

业务领域建模包括业务建模和技术建模,整体建模流程图如下: 业务建模包括业务流程建模和业务对象建模 业务流程建模:通过对业务流程现状分析,结合目标核心系统建设能力要求,参考行业建 模成果,形成结构化的…

Unreal Engine 5 C++ Advanced Action RPG 九章笔记

第九章 Hero Special Abilities 2-Challenges Ahead(前方的挑战) 本次章节主要解决三件问题 怒气能力特殊武器能力治疗石怒气能力 对于这个能力我们需要处理它的激活和持械状态,当没有怒气时应该取消该能力当这个能力激活时,我希望角色是进入无敌状态的,不会受到伤害怒气状…

cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】

前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…

【FPGA】MIPS 12条整数指令【1】

目录 修改后的仿真结果 修改后的完整代码 实现bgtz、bltz、jalr 仿真结果(有问题) bltz------并未跳转,jCe? 原因是该条跳转语句判断的寄存器r7,在该时刻并未被赋值 代码(InstMem修改前) i…

洛谷题目:P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包 题解 (本题较难)

题目传送门:P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 另:由于一些文章的疏忽,导致一些错别字,代码错误,公式错误导致大家的理解和误导,…

多线程之旅:线程安全问题

之前说到了多线程的创建和一些属性等等,接下来,就来讲讲多线程安全问题。 小编引入这段代码讲解下: public class Demo13 {public static int count0;public static void main(String[] args) throws InterruptedException {Thread t1new…

html学习笔记(3)

一、文本格式标签 效果标签&#xff08;旧版&#xff09;标签&#xff08;语义化&#xff0c;强调&#xff09;加粗<b><strong>倾斜<i><em>下划线<u><ins>删除线<s><del> 前面的标签 b 、 i 、 u 、 s 就仅仅是实现加粗、倾…

Postgresql源码(141)JIT系列分析汇总

JIT的东西比较零散&#xff0c;本篇对之前的一些列分析做个汇总、整理。 涉及&#xff1a; 《Postgresql源码&#xff08;113&#xff09;表达式JIT计算简单分析》 《Postgresql源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 《Postgresql源码&#xff08…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法&#xff0c;分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发&#xff0c;测试&#xff0c;生产等编译部署环境&#xff08;每一个环境…

SDL2基本使用

前言 在这里记录SDL的环境基本搭建和使用&#xff0c;方便回忆。使用该图形库也是为了方便在没有单片机和显示模块的使用&#xff0c;也能对简单验证些关于图形构建或界面管理的猜想和测试&#xff0c;所以下述不会探讨过于深入的东西。当然&#xff0c;也可以通过SDL官网查看介…

【Linux系统编程】—— 从零开始实现一个简单的自定义Shell

文章目录 什么是自主shell命令行解释器&#xff1f;实现shell的基础认识全局变量的配置初始化环境变量实现内置命令&#xff08;如 cd 和 echo&#xff09;cd命令&#xff1a;echo命令&#xff1a; 构建命令行提示符获取并解析用户输入的命令执行内置命令与外部命令Shell的主循…

认识BOM

BOM 弹出层 可视窗口尺寸 屏幕宽高 浏览器内核和其操作系统的版本 剪贴板 是否允许使用cookie 语言 是否在线