🧪 使用指南

启动一个持久的Chroma客户端#

python

您可以配置Chroma以从本地计算机保存和加载数据库。数据将自动持久化并在启动时加载(如果存在)。

python

path是Chroma将在磁盘上存储其数据库文件的位置,并在启动时加载它们。

客户端对象有一些有用的便捷方法。

python

在客户端-服务器模式下运行Chroma#

Chroma也可以配置为在客户端/服务器模式下运行。在这种模式下,Chroma客户端连接到一个在单独进程中运行的Chroma服务器。

要在本地启动Chroma服务器,请运行以下命令:

Command Line

然后使用Chroma HTTP客户端连接到服务器:

python

就是这样!只需进行此更改,Chroma的API就会在客户端-服务器模式下运行。


Chroma还提供了一个异步HTTP客户端。其行为和方法签名与同步客户端相同,但所有会阻塞的方法现在都是异步的。要使用它,请调用AsyncHttpClient

python

使用Python HTTP-only客户端#

如果您在客户端-服务器模式下运行Chroma,您可能不需要完整的Chroma库。相反,您可以使用轻量级的仅客户端库。 在这种情况下,您可以安装chromadb-client包。此包是一个轻量级的服务器HTTP客户端,具有最小的依赖关系。

python

python

请注意,chromadb-client包是完整Chroma库的一个子集,不包括所有依赖项。如果您想使用完整的Chroma库,可以安装chromadb包。 最重要的是,没有默认的嵌入函数。如果你在没有嵌入的情况下添加文档,你必须手动指定一个嵌入函数并安装其依赖项。

使用集合#

Chroma允许你使用collection原语管理嵌入集合。

创建、检查和删除集合#

Chroma在URL中使用集合名称,因此对命名有一些限制:

  • 名称长度必须在3到63个字符之间。
  • 名称必须以小写字母或数字开头和结尾,中间可以包含点、破折号和下划线。
  • 名称不能包含两个连续的点。
  • 名称不能是有效的IP地址。

Chroma集合通过名称和可选的嵌入函数创建。如果你提供了一个嵌入函数,每次获取集合时都必须提供它。

python

嵌入函数接受文本作为输入,并执行分词和嵌入。如果没有提供嵌入函数,Chroma将使用sentence transformer作为默认值。

你可以了解更多关于🧬 嵌入函数的信息,以及如何创建你自己的嵌入函数。

可以通过名称使用.get_collection检索现有集合,并使用.delete_collection删除集合。你也可以使用.get_or_create_collection来获取集合(如果存在),或者如果不存在则创建它。

python

集合有一些有用的便捷方法。

python

更改距离函数#

create_collection 还接受一个可选的 metadata 参数,可以通过设置 hnsw:space 的值来自定义嵌入空间的距离方法。

python

hnsw:space 的有效选项是 "l2"、"ip" 或 "cosine"。默认值是 "l2",即平方 L2 范数。

距离参数公式
平方 L2l2
内积ip
余弦相似度cosine

向集合中添加数据#

使用 .add 向 Chroma 添加数据。

原始文档:

python

如果 Chroma 接收到一个 documents 列表,它将自动使用集合的嵌入函数(如果没有在集合创建时提供,则使用默认值)对其进行分词和嵌入。Chroma 还会存储 documents 本身。如果文档太大,无法使用所选的嵌入函数进行嵌入,则会引发异常。

每个文档必须有一个唯一的关联 id。尝试两次 .add 相同的 ID 将导致仅存储初始值。可以为每个文档提供一个可选的 metadata 字典列表,以存储额外信息并启用过滤。

或者,您可以直接提供与文档关联的 embeddings 列表,Chroma 将存储关联的文档而不自行嵌入它们。

python

如果提供的 embeddings 与集合的维度不一致,则会引发异常。

您还可以将文档存储在其他地方,只向 Chroma 提供 embeddingsmetadata 列表。您可以使用 ids 将嵌入与存储在其他地方的文档关联起来。

python

查询集合#

你可以通过一组 query_embeddings 进行查询。

Chroma 集合可以通过 .query 方法以多种方式进行查询。

python

查询将返回每个 query_embedding 最接近的 n_results 个匹配项,按顺序排列。 可以提供一个可选的 where 过滤字典来根据每个文档关联的 metadata 进行过滤。 此外,可以提供一个可选的 where_document 过滤字典来根据文档内容进行过滤。

如果提供的 query_embeddings 的维度与集合不同,将引发异常。

你也可以通过一组 query_texts 进行查询。Chroma 将首先使用集合的嵌入函数嵌入每个 query_text,然后使用生成的嵌入进行查询。

python

你也可以通过 .get 使用 id 从集合中检索项目。

python

.get 也支持 wherewhere_document 过滤器。如果没有提供 ids,它将返回所有匹配 wherewhere_document 过滤器的集合中的项目。

选择返回的数据#

在使用 get 或 query 时,你可以使用 include 参数来指定你想要返回的数据——可以是 embeddingsdocumentsmetadatas,对于 query,还可以是 distances。默认情况下,Chroma 将返回 documentsmetadatas,并且在 query 的情况下,返回结果的 distancesembeddings 默认不返回以提高性能,ids 总是返回。你可以通过将包含的字段名称数组传递给 query 或 get 方法的 includes 参数来指定你想要返回的字段。请注意,embeddings 将在 .get 中作为二维 numpy 数组返回,在 .query 中作为二维 numpy 数组的 Python 列表返回。

python

使用 Where 过滤器#

Chroma 支持通过 metadatadocument 内容进行查询过滤。where 过滤器用于通过 metadata 进行过滤,where_document 过滤器用于通过 document 内容进行过滤。

通过 metadata 过滤#

为了通过 metadata 进行过滤,你必须向查询提供一个 where 过滤字典。该字典必须具有以下结构:

python

过滤 metadata 支持以下操作符:

  • $eq - 等于(字符串、整数、浮点数)
  • $ne - 不等于(字符串、整数、浮点数)
  • $gt - 大于(整数、浮点数)
  • $gte - 大于或等于(整数、浮点数)
  • $lt - 小于(整数、浮点数)
  • $lte - 小于或等于(整数,浮点数)

使用 $eq 运算符相当于使用 where 过滤器。

python

按文档内容过滤#

为了按文档内容过滤,你必须向查询提供一个 where_document 过滤器字典。我们支持两个过滤键:$contains$not_contains。字典必须具有以下结构:

python

python

使用逻辑运算符#

你还可以使用逻辑运算符 $and$or 来组合多个过滤器。

$and 运算符将返回匹配列表中所有过滤器的结果。

python

$or 运算符将返回匹配列表中任意过滤器的结果。

python

使用包含运算符($in$nin#

支持以下包含运算符:

  • $in - 值在预定义列表中(字符串,整数,浮点数,布尔值)
  • $nin - 值不在预定义列表中(字符串,整数,浮点数,布尔值)

$in 运算符将返回元数据属性是提供列表中一部分的结果:

json

$nin 运算符将返回元数据属性不是提供列表中一部分的结果:

json

更新集合中的数据#

可以使用 .update 更新集合中记录的任何属性。

python

如果集合中找不到 id,将记录错误并忽略更新。如果提供了 documents 而没有相应的 embeddings,将使用集合的嵌入函数重新计算嵌入。

如果提供的 embeddings 与集合的维度不一致,将引发异常。

Chroma 还支持 upsert 操作,该操作更新现有项目,或在项目尚不存在时添加它们。

python

如果集合中不存在某个 id,则将根据 add 创建相应的项目。具有现有 id 的项目将根据 update 进行更新。

从集合中删除数据#

Chroma 支持通过 .delete 使用 id 从集合中删除项目。与每个项目关联的嵌入、文档和元数据将被删除。 ⚠️ 自然地,这是一个破坏性操作,且无法撤销。

python

.delete 还支持 where 过滤器。如果没有提供 ids,它将删除集合中所有匹配 where 过滤器的项目。