首页 > 数据库 >向量数据库chroma

向量数据库chroma

时间:2024-06-04 20:59:38浏览次数:22  
标签:... embeddings 数据库 chroma ids collection client embedding 向量

概述

Chroma 是向量数据库,存向量用的。拥有针对向量的查询能力,根据向量的距离远近查询,这一点和传统数据库不一样。

安装与简单使用

pip install chromadb 命令安装。

为了创建数据库实例,先要创建一个 client。

import chromadb
chroma_client = chromadb.Client()

借助 client 创建一个 collection。这个 collection 就是实际的数据库对象了。

collection = chroma_client.create_collection(name="my_collection")

数据库的每项数据包含以下要素:

  • ids,独一无二的标识
  • documents,数据本体。通常是文本
  • metadatas(可选),数据的额外描述
  • embeddings(可选),
  • uris(可选),指向
  • data(可选)

可以这样向 collection 添加内容:

collection.add(
    documents=["This is a document about pineapple", "This is a document about oranges"],
    ids=["id1", "id2"],
)

查询:

results = collection.query(
    query_texts=["This is a query document about hawaii"],  # Chroma will embed this for you
    n_results=2,  # how many results to return
)

results 会是一个字典:

{
  'documents': [[
      'This is a document about pineapple',
      'This is a document about oranges'
  ]],
  'ids': [['id1', 'id2']],
  'distances': [[1.0404009819030762, 1.243080496788025]],
  'uris': None,
  'data': None,
  'metadatas': [[None, None]],
  'embeddings': None,
}

数据库实例化

import chromadb

client

为了创建数据库实例,先要创建一个 client。

chroma_client = chromadb.Client()

除了 Client(),也可以用 PersistentClient() 创建一个指定了持久化存储位置的 client。指定位置已有文件时 client 会自动从其加载。

client = chromadb.PersistentClient(path="/path/to/save/to")

创建好 client 后,可以用其自带的方法:

client.heartbeat() # 返回纳秒 heartbeat。用于确认 client 的连接状态
client.reset() # 清空并重置。不可逆

以上是直接创建 client 的方法。还有 server mode,可以让数据库服务独立于 python 脚本运行。以下的第一条命令在终端中运行。

chroma run --path /db_path
import chromadb
chroma_client = chromadb.HttpClient(host='localhost', port=8000)

若某个机器上只运行 server 而不涉及用 chromadb 开发,那台机器可以只安装 chromadb-client 包。

chromadb-client 没有默认的 embedding 生成方法。必须手动传入。

collection

collection 的实例化

借助 client 创建一个 collection。这个 collection 就是实际的数据库对象了。

collection = chroma_client.create_collection(name="my_collection")

由于 chroma 会用 name 生成 url,这个 name 有以下限制:

  • 长度 3 到 63 个字符
  • 开头和结尾只能是小写字母或数字
  • 不能包含两个连续的点
  • 不能是有效的 IP 地址

毕竟是向量数据库,在创建 collection 时可以指定自己的 embedding 方法。若不指定,默认使用 all-minilm-l6-v2 模型。

client.create_collection(name="my_collection")

可额外传入 embedding_function 指定自己的 embedding 方法,若不指定则会使用默认的 all-minilm-l6-v2 模型。获取已有 collection 时必须传入与创建时相同的 embedding_function。也可以不用管这个 embedding_function,在存数据时把 embedding 一并传入就行。

可额外传入 metadata 参数指定其他设置。需要传入一个字典,

  • "hnsw:space",这个键可自定义 embedding 距离的计算方法。例如 "cosine" 指定为余弦相似度,默认的 "L2" 是欧氏距离

client 里与 collection 相关的方法:

  • create_collection(name),创建新 collection,并返回对象
  • get_collection(name),获取已有的 collection,并返回对象
  • get_or_create_collection(name),有则获取,没有则创建,并返回对象
  • delete_collection(name),删除已有的 collection

collection 的方法:

  • peek(),返回该 collection 中头 10 个数据。通常用于预览 collection 内容
  • count(),返回 collection 的数据条目数
  • modify(name),重命名

collection 添加数据

collection.add(
    ids=["id1", "id2", "id3", ...]
    documents=["doc1", "doc2", "doc3", ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
)
  • ids,必须传入的、独一无二标识。若出现重复,会导致新数据不被存入
  • documents,数据本体。若没提供 embeddings 则会自动用 documents 生成
  • metadatas,给一条数据标记一个字典,可以用于条件过滤
  • embeddings,手动传入的 embedding

可以选择不传入 documents,而是传入 ids metadatas embeddings 这样的组合。

collection 查询数据

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

collection.get(
    ids=["id1", "id2", "id3", ...],
    where={"style": "style1"}
)
  • query_embeddings,用于查询的 embedding。可以一次查询多个 embedding
  • n_results,对每个查询 embedding 返回多少个查询结果
  • where 通过 metadatas 限制查询,where_document 通过 documents 限制查询
  • ids,通过独一无二的 id 获取数据

也可以不传入 query_embeddings 而是传入 query_texts 进行查询。Chroma 会用预先设定的方法将字符串转换为 embedding。

对于 collection.get(),若没有传入 ids 参数,就会只根据 where 进行查询。

返回值会是一个字典:

{
  'documents': [[
      'This is a document about pineapple',
      'This is a document about oranges'
  ]],
  'ids': [['id1', 'id2']],
  'distances': [[1.0404009819030762, 1.243080496788025]],
  'uris': None,
  'data': None,
  'metadatas': [[None, None]],
  'embeddings': None,
}

若只想要其中的一部分,可以在查询时传入 include 参数。

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    include=["documents"]
)

collection 更新数据

collection.update(
    ids=["id1", "id2", "id3", ...],
    documents=["doc1", "doc2", "doc3", ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
)

使用 update() 更新不存在的 id 时会发生错误。可以用 upsert() 在 id 不存在时就插入新数据:

collection.upsert(
    ids=["id1", "id2", "id3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

collection 删除数据

collection.delete(
    ids=["id1", "id2", "id3",...],
    where={"chapter": "20"}
)

可以仅传入 where 而不传入 ids

标签:...,embeddings,数据库,chroma,ids,collection,client,embedding,向量
From: https://www.cnblogs.com/chirp/p/18231671

相关文章

  • 使用Python连接到MySQL数据库并执行查询
    在当今数字化时代,数据是企业和组织中至关重要的资产之一。数据库是存储和管理数据的核心工具之一,而MySQL则是其中一种流行的关系型数据库管理系统。如何使用Python编程语言连接到MySQL数据库,并执行查询以检索所需的数据。首先,需要安装pymysql库:pipinstallpymysql下......
  • 实验10 数据库索引创建与管理操作
    1、使用MySQL Navicat图形工具创建、管理索引在JXGL数据库中进行以下操作:创建索引。为students表的sname字段创建索引ix_sname。CREATEINDEXix_snameonstudents(sname)在students表的class和sdept字段上创建名为ix_cs的组合索引。CREATEINDEXix_csonstud......
  • 在线考试|基于Springboot的在线考试管理系统设计与实现(源码+数据库+文档)
    在线考试管理系统目录目录基于Springboot的在线考试管理系统设计与实现一、前言二、系统设计三、系统功能设计 1、前台:2、后台管理员功能四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,......
  • 健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)
    健身管理小程序目录基于微信开发健身管理小程序设计与实现一、前言二、系统设计三、系统功能设计 小程序端:后台四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专......
  • 电影交流|基于SprinBoot+vue的电影交流平台小程序系统(源码+数据库+文档)
     电影交流平台目录目录基于SprinBoot+vue的电影交流平台小程序系统 一、前言 二、系统设计三、系统功能设计 1用户信息管理2电影信息管理3公告信息管理4论坛信息管理四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:......
  • 数据库知识点和一些命令以及使用步骤
     一、基本命令:(1)连接本地数据库服务:mysql-uroot-p(2)连接其它电脑上的数据库服务:mysql-hip地址-uroot-p(3)在连接数据库服务时直接选择库:mysql-D库名-uroot-p(4)退出数据库服务:exit或quit或\q二、使用步骤:1、链接数据库服务2、创建一个数据库—>选择库3、设......
  • 公安视频图像信息数据库及GA/T 1400视图库视频监控系统的使用场景
    随着科技的快速发展,大数据、人工智能等新技术不断融入各行各业,为各行各业带来了前所未有的变革。在公安领域,GA/T1400协议公安视频图像信息数据库的应用为视频监控场景提供了强有力的支持,极大地提升了公安工作的效率和准确性。一、公安视频图像信息数据库组成1、公安视频图像......
  • 接口与数据库
    第一,到数据库确认是哪个环境第二,到Charles抓包拿token把token放在接口文档的Authorize里,刷新或F5去你想工作接口(如订单结束接口)调试,然后去数据库拿id(订单结束id),把id放在orderid,点击发送结束订单 ......
  • .Net项目快速生成数据库的实体类
    MySQL数据库在NuGet包管理中安装以下包,选择符合项目.Net版本的包Microsoft.EntityFrameworkCore.ToolsMicrosoft.EntityFrameworkCore.DesignMySql.EntityFrameworkCore 在程序包控制管理台执行以下命令Scaffold-DbContext"DataSource=localhost;InitialCatalog=mydb;......
  • 数据库·简述
    数据库DB一、数据库系统概论基本概念数据库的四个基本概念:数据、数据库、数据库管理系统、数据库系统数据DATA:描述事物的符号记录,数据的含义称为数据的语义,数据与其语义不可分数据库DB:长期存储在计算机内、有组织的、可共享的大量数据的集合,数据库中的数据按一定数据模型组......