向量数据库:Chroma

一:向量数据库简介

将数据(如文本、图像、音频等)通过嵌入模型(Embedding Model) 转换为向量形式存储到向量数据库中,并通过高效的索引和搜索算法实现快速检索。

嵌入模型会将各种数据 (例如文本、图像、图表和视频) 转换为数值向量,以便捕捉其在多维向量空间中的含义和细微差别。嵌入技术的选择取决于应用需求,同时要兼顾语义深度、计算效率、要编码的数据的类型、维度等因素。

向量数据库用于相似性搜索:即通过计算向量之间的距离(如欧几里得距离、余弦相似度等)来找到与目标向量最相似的其他向量。它特别适合处理非结构化数据,支持语义搜索、内容推荐等场景。

数据不同,使用的嵌入模型不同,文本数据使用处理文本的嵌入模型,图片数据使用处理图片的嵌入模型。

存储

向量数据库将嵌入向量存储为高维空间中的点,并为每个向量分配唯一标识符(ID),同时支持存储元数据。

检索

通过近似最近邻(ANN)算法(如PQ等)对向量进行索引和快速搜索。

二、Chorma简介

Chroma(https://docs.trychroma.com/docs/overview/introduction) 是一款开源的向量数据库,专为高效存储和检索高维向量数据设计。其核心能力在于语义相似性搜索,支持文本、图像等嵌入向量的快速匹配,广泛应用于大模型上下文增强(RAG)、推荐系统、多模态检索等场景。与传统数据库不同,Chroma 基于向量距离(如余弦相似度、欧氏距离)衡量数据关联性,而非关键词匹配。

核心优势:

  • 轻量易用:以 Python/JS 包形式嵌入代码,无需独立部署,适合快速原型开发。

  • 灵活集成:支持自定义嵌入模型(如 OpenAI、HuggingFace),兼容 LangChain 等框架。

  • 高性能检索:采用 HNSW 算法优化索引,支持百万级向量毫秒级响应。

  • 多模式存储:内存模式用于开发调试,持久化模式支持生产环境数据落地。

python 复制代码
# 安装chromadb
pip install chromadb

# 导入
import chromadb

三、增删改查

3.0 初始化客户端

python 复制代码
# 内存模式,一般不推荐使用
client = chromadb.Client()

# 持久化模式(常用)
client = chromadb.PersistentClient(path="./data/chromadb")

3.1 创建集合Collection

集合(Collection)是 Chroma 中管理数据的基本单元,类似关系数据库的表。在创建集合的时候需要指定嵌入函数。

python 复制代码
import os
import chromadb
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction
​
​
# 持久化模式
client = chromadb.PersistentClient(path="../db/chroma")
​
# 创建一个集合,这里的集合名字必须在Chromadb中唯一
# get_or_create_collection
my_collection = client.create_collection(
    name="my_collection",
    embedding_function=OpenAIEmbeddingFunction(
	    api_key=os.getenv("OPENAI_API_KEY"), 
	    api_base="https://xxx",  
	    model_name="text-embedding-3-small"
	)
)
python 复制代码
# 删除集合
client.delete_collection(name='my_collection')

3.2 获取集合

python 复制代码
my_collection = client.get_collection(name="my_collection")​

3.3 添加数据

方式一:使用Chroma指定的嵌入函数将文本生成向量。

python 复制代码
my_collection.add(
    documents=["RAG是一种检索增强生成技术", "向量数据库存储文档的嵌入表示",
               "在机器学习领域,智能体(Agent)通常指能够感知环境、做出决策并采取行动以实现特定目标的实体"],
    metadatas=[{"source": "RAG"}, {"source": "向量数据库"}, {"source": "Agent"}],
    ids=["id1", "id2", "id3"]
)
​
print('添加数据后peek ==>', knowledge_collection.peek())
print('添加数据后count ==>', knowledge_collection.count())
​
# 获取所有文档
result = knowledge_collection.get()
print('所有文档:', result)

方式二:自己去调用模型获取向量然后再存储

python 复制代码
# 方式二:手动传入预计算向量,
knowledge_collection.add(
    embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    documents=["This is a document", "This is another document"],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)

3.4 查询

根据条件查询

python 复制代码
r = my_collection.get(
    where={"source": 'Agent'}, # 通过metadatas 中的字段来查询记录
    where_document={'$contains': 'Agent'} # 在集合中的文档中去检索包含Agent字符串的记录 可选
)
print(r)

根据条件分页查询,通过limit限制每页条数,offset表示开始下标

python 复制代码
r = my_collection.get(
    ids=['id1', 'id2', 'id3'],
    limit=1,
    offset=2
)
print(r)

传入的query_texts 会使用集合的embedding function来转化为向量,然后通过余弦相似度与集合中的文档来检索相似关系

python 复制代码
r = my_collection.query(
    query_texts='Agent是什么',
    n_results=1  # 返回的结果个数
)
print(r)
python 复制代码
r = my_collection.query(
    query_embeddings=[[0.5, 0.6, ...]],
    n_results=2
)

3.5 更新

python 复制代码
# 修改文档
knowledge_collection.update(
    ids=['id3'],
    documents=['在机器学习领域,Agent通常指能够感知环境、做出决策并采取行动以实现特定目标的实体,只需给出目标,然后自动执行任务达成目标']
)

3.5 删除

python 复制代码
knowledge_collection.delete(ids=["id3"])

四、示例

python 复制代码
import os
import json
from dotenv import load_dotenv; load_dotenv()
import chromadb
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction

# 初始化客户端
client = chromadb.PersistentClient(path="./db/chroma")

my_collection = client.get_or_create_collection(
    name="my_collection",
    embedding_function=OpenAIEmbeddingFunction(
        api_key=os.getenv("OPENAI_API_KEY"),
        api_base=os.getenv("OPENAI_BASE_URL"),
        model_name="azure_openai/text-embedding-3-small"
    )
)

# 获取集合
my_collection = client.get_collection(name="my_collection")

# 添加向量
my_collection.add(
    documents=["向量数据库是一种组织有序的向量嵌入集合,整合了可以随时创建、读取、更新和删除的向量嵌入。向量嵌入将数据块 (例如文本或图像) 表示为数值。",
               "将数据(如文本、图像、音频等)通过嵌入模型(Embedding Model) 转换为向量形式存储到向量数据库中,并通过高效的索引和搜索算法实现快速检索",
               "嵌入模型会将各种数据 (例如文本、图像、图表和视频) 转换为数值向量,以便捕捉其在多维向量空间中的含义和细微差别。嵌入技术的选择取决于应用需求,同时要兼顾语义深度、计算效率、要编码的数据的类型、维度等因素。"
               ],
    metadatas=[{"source": "RAG"}, {"source": "向量数据库"}, {"source": "Agent"}],
    ids=["id1", "id2", "id3"]
)

# 查询
results = my_collection.query(
    query_texts='向量数据库是什么?',
    n_results=2  # 返回的结果个数
)
print(json.dumps(results))
json 复制代码
{
    "ids": [["id1","id2"]],
    "embeddings": null,
    "documents": [
        [
            "向量数据库是一种组织有序的向量嵌入集合,整合了可以随时创建、读取、更新和删除的向量嵌入。向量嵌入将数据块 (例如文本或图像) 表示为数值。",
            "将数据(如文本、图像、音频等)通过嵌入模型(Embedding Model) 转换为向量形式存储到向量数据库中,并通过高效的索引和搜索算法实现快速检索"
        ]
    ],
    "uris": null,
    "included": ["metadatas","documents","distances"],
    "data": null,
    "metadatas": [
        [{"source": "RAG"},{"source": "向量数据库"}]
    ],
    "distances": [
        [
            0.15911930799484253,
            0.42112505435943604
        ]
    ]
}



四、Client-Server Mode

4.1 服务端

在生产环境中也可以使用Client-Server Mode,类似我们使用关系型数据库,在服务器上部署一个mysql Server,然后通过Client进行链接使用。

shell 复制代码
# uv安装
uv tool install chromadb

# pip安装
python3 -m pip install --upgrade chromadb
shell 复制代码
# --path:表示存储数据的文件目录
# --port:表示监听的端口号,默认端口:8000
chroma run [--port 8000] --path /db_path

4.2 客户端

python 复制代码
import chromadb
​
chroma_client = chromadb.HttpClient(host='localhost', port=8000)
相关推荐
qq_372906931 小时前
CSS怎么在flex布局中实现项目均分间距_设置justify-content space-evenly
jvm·数据库·python
2401_882273722 小时前
CSS 背景色无法撑满父容器?解决浮动导致的高度塌陷问题
jvm·数据库·python
weixin_381288182 小时前
jsoup如何读取html
jvm·数据库·python
逆境不可逃2 小时前
一篇速通Redis 从原理到Java实战(含缓存问题解决方案+集群配置)
数据库·redis·缓存
小卓(friendhan2005)2 小时前
基于Qt的音乐播放器项目
数据库·c++·qt
2401_882273722 小时前
golang如何处理zip压缩包_golang zip压缩包处理思路
jvm·数据库·python
猫的玖月2 小时前
SQL语法简介
数据库·sql·oracle
tjc199010052 小时前
Golang怎么实现分布式定时任务_Golang如何保证集群中定时任务不重复执行【进阶】
jvm·数据库·python
2301_773553622 小时前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python