当前位置: 首页 > news >正文

向量数据库ChromaDB的使用

ChromaDB 是一个开源的嵌入式向量数据库,专用于AI设计,好处这里就不多写了,这里做一个学习的记录。当前环境是Window,Python版本3.10

安装

执行命令,即可安装,注意提前准备Python环境

pip install chromadb

安装的时候注意Python版本,在我使用Python3.9版本时,执行代码一直报错The onnxruntime python package is not installed. Please install it with pip install onnxruntime in add. 因为这个错纠结三四天,一直以为是环境的问题,直到最后发现换下版本就好

使用

创建客户端

服务器上的数据库,使用Http的方式读取

import chromadbchroma_client = chromadb.HttpClient(host="localhost", port=8000)

服务端的话需要使用命令启动

chroma run --path "文档上传地址" --host 0.0.0.0 --port 8000

本地安装的话,使用PersistentClient,注意地址中间不要使用中文

import chromadbclient = chromadb.PersistentClient(path="文档上传地址")

集合

collection 集合,用于存储数据的地方,类似于table

# 获取一个存在的Collection对象
collection = client.get_collection("testname")# 如果不存在就创建collection对象,一般用这个更多一点
collection = client.get_or_create_collection("testname")

数据操作

添加

# documents 文档
# metadatas 元数据,文档的一些备注
# ids 对应ID,ID唯一
# embeddings 嵌入向量
collection.add(documents=["This is a document about cat", "This is a document about car", "This is a document about bike"],metadatas=[{"category": "animal"}, {"category": "vehicle"}, {"category": "vehicle"}],ids=["id1", "id2", "id3"]
)

添加完成后,会根据数据创建相关文档,文档中有多个属性

属性类型作用示例
idString文档的唯一标识符"doc_001"
embeddingList[float]文档的向量表示[0.12, -0.34, ..., 0.78]
documentString原始文本内容"ChromaDB 是一个开源的向量数据库..."
metadataDict文档的附加描述信息{"author": "John", "category": "AI"}
urisList[String]外部资源链接["https://example.com/doc.pdf"]
dataAny自定义二进制数据图像、音频等非文本数据

修改

upsert函数如果没有该数据则添加,有的话修改

    # documents 文档# metadatas 元数据,文档的一些备注# ids 对应ID,ID唯一# embeddings 嵌入向量collection.upsert(documents=["一个关于狗的文档", "关于猫的文档", "一个关于自行车的文档"],metadatas=[{"category": "animal"}, {"category": "vehicle"}, {"category": "vehicle"}],ids=["id1", "id2", "id3"])

查询

查询时主要使用query函数和get函数,查询结果除了文档数据之外还会有distances属性数据,该数据表示查询向量与结果向量之间的相似程度, ChromaDB 默认使用余弦距离作为距离函数

距离值越小, 相似度越高,距离值越大 , 相似度越低

    print("查询列表>>>")print(collection.peek())# print(collection.get())print("相似性查询>>>")result = collection.query(query_texts=["自行车"],n_results=1)print(result)print("按照条件查询>>>")result = collection.query(query_texts=["自行车"],n_results=1,where={"category": "animal"})print(result)print("运算符过滤>>>")result = collection.query(query_texts=["关于"],n_results=2,where={"$or": [{"category": "animal"}, {"category": "vehicle"}]},)print(result)print("运算符过滤>>>")result = collection.query(query_texts=["关于"],n_results=2,where={"$or": [{"category": "animal"}, {"category": "vehicle"}]},)print(result)# print("按照向量查>>>")# query_embeddings = ...# result = collection.query(#     query_embeddings=query_embeddings,#     n_results=2# )print("按照 ID 查>>>")result = collection.get(ids=["id2"])print(result)print("分页查询 >>>")result = collection.get(where={"category": "animal"},limit=2,offset=1)print(result)

完整全部代码

import chromadb
from chromadb.api.models import Collection# 获得 collection 列表
def list_collection(client: chromadb.PersistentClient):print(client.list_collections())# 添加数据
def add(collection: Collection):# documents 文档# metadatas 元数据,文档的一些备注# ids 对应ID,ID唯一# embeddings 嵌入向量collection.add(documents=["This is a document about cat", "This is a document about car", "This is a document about bike"],metadatas=[{"category": "animal"}, {"category": "vehicle"}, {"category": "vehicle"}],ids=["id1", "id2", "id3"])# 修改数据
def edit(collection: Collection):# documents 文档# metadatas 元数据,文档的一些备注# ids 对应ID,ID唯一# embeddings 嵌入向量collection.upsert(documents=["一个关于狗的文档", "关于猫的文档", "一个关于自行车的文档"],metadatas=[{"category": "animal"}, {"category": "vehicle"}, {"category": "vehicle"}],ids=["id1", "id2", "id3"])def search(collection: Collection):print("查询列表>>>")print(collection.peek())# print(collection.get())print("相似性查询>>>")result = collection.query(query_texts=["自行车"],n_results=1)print(result)print("按照条件查询>>>")result = collection.query(query_texts=["自行车"],n_results=1,where={"category": "animal"})print(result)print("运算符过滤>>>")result = collection.query(query_texts=["关于"],n_results=2,where={"$or": [{"category": "animal"}, {"category": "vehicle"}]},)print(result)print("运算符过滤>>>")result = collection.query(query_texts=["关于"],n_results=2,where={"$or": [{"category": "animal"}, {"category": "vehicle"}]},)print(result)# print("按照向量查>>>")# query_embeddings = ...# result = collection.query(#     query_embeddings=query_embeddings,#     n_results=2# )print("按照 ID 查>>>")result = collection.get(ids=["id2"])print(result)print("分页查询 >>>")result = collection.get(where={"category": "animal"},limit=2,offset=1)print(result)if __name__ == '__main__':client = chromadb.PersistentClient(path="D:\\uploadTemplate\\chromadb")collection = client.get_or_create_collection(name="my-collection")search(collection)
http://www.xdnf.cn/news/966367.html

相关文章:

  • Vim 复制/剪切/粘贴命令完整学习笔记
  • java Condition类
  • Alerting中配置多个OpsGenie时,如何匹配同一个条件匹配多个opsgenie的contact points
  • 【WiFi帧结构】
  • python/java环境配置
  • Django的HelloWorld程序
  • 1.4 超级终端
  • vue3 hooks的结构和作用和具体场景例子
  • 业财融合怎么做?如何把握业务与财务的边界?
  • @Configuration原理与实战
  • 【Kafka】消息队列Kafka知识总结
  • iview组件库:关于分页组件的使用与注意点
  • 什么是数据转换?数据转换有哪些方式?
  • 2025年06月10日Github流行趋势
  • Java SE - 数组
  • A 找倍数 (线段树)
  • 凤凰双展翅之七七一五八九五隔位六二五
  • LeetCode 146.LRU缓存
  • Web应用压力测试详解
  • 力扣LFU460
  • FR4 中的色散如何真正影响传播延迟?
  • VSCode主题设计大赛
  • Deepin 25 安装字体
  • 若依使用RedisCache需要注意的事项
  • idea大量爆红问题解决
  • OpenGL学习20250610
  • Docker重启流程解析
  • MySQL中的CONVERT_TZ() 函数
  • C++ 智能指针实现原理
  • [一生一芯] 如何基于iSTA 分析时序