头图

向量数据库固然很好,它让我们可以根据相似性快速地检索向量。但向量数据库考虑的是向量,而我们要考虑的是数据,当数据很简单时,这两者几乎是等价的,每个向量代表一个数据点,而每个数据点都与一个向量相关。但是,现实世界的数据往往都是复杂的,多层级的,各式各样的...往往嵌套的数据结构才能更好地表达数据内容和层级关系。无需担心,DocArray 在手,天下我有!

作者介绍

Jina AI 机器学习工程师 Johannes Messner
作者注本文的知识点推荐和 Colab 笔记本一起搭配食用https://colab.research.google...
任务:商品搜索在本笔记本中,我们将完成一个商品搜索的 demo:数据库是一个线上商店的商品列表,每个列表又包含多个图像和一个商品描述。
首先我们要让这些数据都是可搜索的,此外,我们还希望用户能使用不同的模态(文本、图像或两者同时)作为查询输入,以准确搜索到对应的商品。为了解决这两个问题,我们只需要一个工具 DocArray具体来说,我们将用到 3 个 DocArray 的功能:
1. Dataclass[1],对数据进行建模
2. Subindex(子索引)[2],使数据点及数据点的嵌套信息可搜索
3. Document Store[3],将我们的数据存储在磁盘上,并对它做检索

此外,我们还将使用 CLIP-as-service 编码文本和图像数据,生成对应的 embedding。数据索引在索引数据之前,让我们看看我们的数据必须是什么样子,才能完成上述任务。
• 想要搜索图像,需要为每个图像提供 embedding
• 想要搜索描述,需要表示其描述的语义 embedding
• 想要搜索整个列表,每个列表都需要一个能代表整个列表的 embedding
图片
如果你把 embedding 存储在向量数据库,那么你通常无法保留这种嵌套数据结构。但如果你使用 DocArray,Subindices 就能轻松解决这一问题。

什么是子索引

在介绍什么是子索引之前,我们需要先了解 DocArray 的两个基本概念。在 DocArray 中,数据以 Document 的形式存储,DocumentArray 是用于保存多个 Document 的列表。默认情况下,DocumentArray 是一个内存数据结构,但它也原生支持 Document Store,例如 Weaviate, Elasticsearch 等。它支持将 Document 存放在(向量)数据库里,以在磁盘上持久化数据,并获得更快的检索速度。
每个 DocumentArray 代表一个搜索索引,因此对于每一个查询,我们可以找到其中包含的元素。一旦找到匹配的 Document,就可以将它们加载到内存中。
子索引使得这种模式能够扩展到嵌套数据。每个子索引代表父 DocumentArray 的一个嵌套层次,比如图片或描述文本。只要启用了子索引,就可以直接在该层执行搜索,就不需要像使用根级别索引一样,先将所有数据加载到内存中。子索引是先在数据库里查询,查询到的结果再加载到 Document 里面。
在底层,每个子索引都会创建一个单独的数据库索引,独立于其他子索引或根索引来存储相关数据。
[1] Dataclass: https://docarray.jina.ai/fund...
[2] Subindex: https://docarray.jina.ai/fund...
[3] Document Stores: https://docarray.jina.ai/adva...


JinaAI
21 声望12 粉丝

Jina AI 的愿景是铺设通往多模态 AI 的未来之路,我们是您通往多模态人工智能的最佳通道!