跳转到主要内容
多模态支持目前仅在 Python 中可用。Javascript/Typescript 支持即将推出!
您可以创建多模态 Chroma 集合;这些集合可以存储多种模态的数据,并支持通过多种模态的数据进行查询。 在 Colab 中尝试

多模态嵌入函数

Chroma 支持多模态嵌入函数,这些函数可用于将多种模态的数据嵌入到单个嵌入空间中。 Chroma 内置了支持文本和图像的 OpenCLIP 嵌入函数。
from chromadb.utils.embedding_functions import OpenCLIPEmbeddingFunction
embedding_function = OpenCLIPEmbeddingFunction()

添加多模态数据和数据加载器

您可以直接将文本以外模态的嵌入数据添加到 Chroma。目前支持图像。
collection.add(
    ids=['id1', 'id2', 'id3'],
    images=[[1.0, 1.1, 2.1, ...], ...] # A list of numpy arrays representing images
)
与存储在 Chroma 中的文本不同,我们不会存储您的原始图像或其他模态的数据。相反,对于每条多模态记录,您可以指定一个存储原始格式数据的 URI 以及一个数据加载器 (data loader)。对于您添加的每个 URI,Chroma 将使用数据加载器检索原始数据,对其进行嵌入,并存储嵌入向量。 例如,Chroma 附带了一个数据加载器 ImageLoader,用于从本地文件系统加载图像。我们可以创建一个配置了 ImageLoader 的集合:
import chromadb
from chromadb.utils.data_loaders import ImageLoader
from chromadb.utils.embedding_functions import OpenCLIPEmbeddingFunction

client = chromadb.Client()

data_loader = ImageLoader()
embedding_function = OpenCLIPEmbeddingFunction()

collection = client.create_collection(
    name='multimodal_collection',
    embedding_function=embedding_function,
    data_loader=data_loader
)
现在,我们可以使用 .add 方法向该集合添加记录。集合的数据加载器将使用 URI 获取图像,使用 OpenCLIPEmbeddingFunction 对其进行嵌入,并将嵌入向量存储在 Chroma 中。
collection.add(
    ids=["id1", "id2"],
    uris=["path/to/file/1", "path/to/file/2"]
)
如果您使用的嵌入函数是多模态的(如 OpenCLIPEmbeddingFunction),您还可以向同一个集合添加文本
collection.add(
    ids=["id3", "id4"],
    documents=["This is a document", "This is another document"]
)

查询

您可以使用多模态集合支持的任何模态来查询它。例如,您可以使用图像进行查询
results = collection.query(
    query_images=[...] # A list of numpy arrays representing images
)
或者使用文本
results = collection.query(
    query_texts=["This is a query document", "This is another query document"]
)
如果为集合设置了数据加载器,您还可以使用指向存储在别处的受支持模态数据的 URI 进行查询
results = collection.query(
    query_uris=[...] # A list of strings representing URIs to data
)
此外,如果为集合设置了数据加载器并且提供了 URI,您可以在结果中包含原始数据
results = collection.query(
    query_images=[...], # # list of numpy arrays representing images
    include=['data']
)
这将自动为任何可用的 URI 调用数据加载器,并在结果中包含数据。uris 也可以作为一个 include 字段使用。

更新

您可以通过指定数据模态来更新多模态集合,方式与 add 相同。目前支持图像
collection.update(
    ids=['id1', 'id2', 'id3'],
    images=[...] # A list of numpy arrays representing images
)
请注意,具有特定 ID 的给定条目一次只能关联一种模态。更新将覆盖现有模态,例如,原本具有对应文本的条目,在通过图像进行更新后,将不再包含该文本。