当前位置: 首页 > 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)

相关文章:

  • mongledb数据库应用
  • 【VBA】使用脚本把doc/docx转换为pdf格式
  • 风中低语:Linux 信号处理的艺术与实践
  • 亚远景-ASPICE评估标准解析:汽车软件开发的过程能力模型
  • 金融科技的数字底座
  • 从离散控制到集成管理:Modbus TCP转CANopen网关重构烟丝膨胀生产线
  • 智能守护者:新能源汽车充电桩安全识别技术的创新实践
  • CentOS下的分布式内存计算Spark环境部署
  • 破局与重构:人工智能深度赋能基础教育变革研究
  • QML问题记录
  • v-bind 与 v-model 的区别与联系详解
  • 【Docke基础】Docker简介与快速入门:从概念到核心优势
  • ArkUI-X跨平台Bridge最佳实践
  • Nuclei PoC 编写详解:从入门到实践
  • 【完整源码】白泽题库系统:基于PyQt5的智能刷题与考试平台开发全解析
  • 【threejs】每天一个小案例讲解:常见几何体
  • FastAPI 教程:从入门到实践
  • 主键(PRIMARY KEY)与唯一键(UNIQUE KEY)的区别详解
  • React Native 导航系统实战(React Navigation)
  • OOM模拟排查过程记录
  • 做地产网站/seo关键词排名在线查询
  • seo网站做推广价格/百度seo排名主要看啥
  • 开源镜像网站怎么做/湘潭网页设计
  • 一个人做网站难吗/实时热榜
  • 昆明网站建设服务/百度手机助手官网下载
  • 成都网站设计推荐柚米/免费二级域名分发