从破布到富有 (Cóng pòbù dào fùyǒu)

从破旧到华丽 (Cóng pòjiù dào huálì)

了解您的数据和模型的10个矢量搜索应用

艺术渲染的矢量搜索用于数据探索。图片由DALLE-3生成。

随着大型语言模型(LM)的兴起,矢量搜索引擎也开始蓬勃发展。矢量数据库构成了LM的长期记忆系统的基础。

通过高效地找到相关信息作为上下文传递给语言模型,矢量搜索引擎可以提供超过训练截止日期的最新信息,并在不进行微调的情况下提高模型输出的质量。这个过程通常被称为检索增强生成(RAG),已经将曾经晦涩的近似最近邻算法(ANN)搜索问题推到了人们的视野中!

在所有这些骚动中,人们可能会认为矢量搜索引擎与大型语言模型密不可分。但事实上,矢量搜索有着更多强大的应用,远远超出了改进LLM的RAG!

在本文中,我将向您展示我最喜欢的使用矢量搜索进行数据理解、数据探索、模型可解释性等方面的十种应用。

以下是我们将介绍的应用,按照复杂度的递增顺序大致为:

在Oxford-IIIT宠物数据集上进行图像相似性搜索(LICENSE)。图片由作者提供。

也许最简单的开始是图像相似性搜索。在这个任务中,您有一个由图像组成的数据集,可以是个人照片集,也可以是数十亿张图片的大型存储库,这些图片是在数千个分布式相机上拍摄的,跨越多年。

设置很简单:为数据集中的每个图像计算嵌入向量,并通过这些嵌入向量生成一个矢量索引。在这个初始的计算批次之后,无需再进行推理。探索数据集结构的一个绝佳方式是选择数据集中的一张图像,并查询矢量索引获取前k个最相似的图像。这可以直观地展示出围绕查询图像的图像空间有多密集。

更多信息和工作代码,请参见这里。

来自Unsplash的图像(由Mladen Šćekić提供)对Oxford-IIIT宠物数据集进行反向图像搜索。图像由作者提供。

在类似的情况下,图像相似性搜索的自然延伸是找到数据集中与外部图像最相似的图像。 这可以是来自本地文件系统的图像,也可以是来自互联网的图像!

要执行反向图像搜索,您需要像执行图像相似性搜索示例中那样为数据集创建向量索引。 不同之处在于运行时,您需要计算查询图像的嵌入,并使用该向量查询向量数据库。

更多信息和工作代码,请参见这里。

COCO-2017数据集验证分割中的绵羊的对象相似性搜索(许可证)。 图像由作者提供。

如果您想深入了解图像中的内容,则对象或“补丁”相似性搜索可能适合您的需求。 其中一个示例是人员重新识别,其中您只有一张包含感兴趣人物的图像,并且您想找到数据集中所有这个人的实例。

该人物在每个图像中可能只占据很小的部分,因此其中的整体图像嵌入可能强烈依赖于这些图像中的其他内容。 例如,一个图像中可能有多个人。

更好的解决方案是将每个对象检测补丁视为单独的实体,并为每个补丁计算一个嵌入。 然后,使用这些补丁嵌入创建一个向量索引,并针对您希望重新识别的补丁运行相似性搜索。 作为起点,您可以尝试使用ResNet模型。

这里有两个细节:

  1. 在向量索引中,您需要存储将每个补丁映射回数据集中相应图像的元数据。
  2. 您将需要运行对象检测模型来生成这些检测补丁,然后再实例化索引。 您可能还希望仅为某些对象类别(如person)计算补丁嵌入,而不计算其他对象类别的补丁嵌入,如chairtable等。

更多信息和工作代码,请参见这里。

在我博士论文的页面上使用Tesseract OCR引擎生成的文本区块进行模糊/语义搜索。使用GTE-base模型计算的嵌入。图像由作者提供。

光学字符识别(OCR)是一种技术,可以将手写笔记、旧期刊文章、医疗记录和那些藏在衣柜里的情书等文档数字化。OCR引擎如TesseractPaddleOCR通过识别图像中的单个字符和符号,并创建连续的文本“块”,即段落来工作。

有了这些文本后,您可以对预测的文本块进行传统的自然语言关键字搜索,如本文所示。然而,这种搜索方法容易受到单个字符错误的影响。如果OCR引擎错误地将“l”识别为“1”,那么以关键字“控制”进行搜索将会失败(这真是讽刺!)。

我们可以利用向量搜索克服这个挑战!使用文本嵌入模型如来自Hugging Face的GTE-base库,将文本块进行嵌入,并创建一个向量索引。然后,我们可以通过嵌入搜索文本并查询索引,对我们数字化的文档进行模糊和/或语义搜索。从高层次上看,这些文档中的文本块类似于目标相似性搜索中的目标检测补丁!

有关更多信息和实际代码,请参见此处。

语义图像搜索使用自然语言在COCO 2017验证集上。图片由作者提供。

通过使用多模态模型,我们可以将语义搜索的概念从文本扩展到图像。像CLIPOpenCLIPMetaCLIP这样的模型经过训练,可以找到图像及其标题的共同表示,使得狗的图像的嵌入向量与文本提示“一张狗的照片”的嵌入向量非常相似。

这意味着将CLIP嵌入用于数据集中的图像,然后对该向量数据库运行向量搜索查询,其中查询向量是文本提示的CLIP嵌入,是合理的(即“允许的”)操作。

💡通过将视频中的各个帧视为图像,并将每个帧的嵌入添加到向量索引中,您还可以通过视频进行语义搜索!

有关更多信息和实际代码,请参见此处。

跨模态检索

通过使用ImageBind和Qdrant向量索引在COCO 2017验证集上,实现了匹配输入音频文件的图像的跨模态检索。视频由作者提供。

从某种意义上说,通过图像数据集进行语义搜索是一种跨模态检索形式。一种概念化的方式是,我们正在检索与文本查询相对应的图像。通过使用像ImageBind这样的模型,我们可以更进一步!

ImageBind将六种不同模态(图像、文本、音频、深度、热力和惯性测量单元)的数据嵌入到同一嵌入空间中。这意味着我们可以为这些模态中的任何一种生成向量索引,并使用其他任何一种模态的样本对该索引进行查询。例如,我们可以使用车辆鸣笛的音频片段并检索所有汽车的图像!

有关更多信息和实际代码,请参见此处。

探测感知相似性

迄今为止,向量搜索故事中非常重要的一部分是模型。我们的向量索引中的元素是来自模型的嵌入。这些嵌入可以是定制嵌入模型的最终输出,也可以是在分类等其他任务上训练的模型的隐藏或潜在表示。

不管怎样,我们用于嵌入样本的模型都会对哪些样本与其他样本最相似产生重大影响。CLIP模型捕捉了语义概念,但在图像内部表示结构信息方面存在困难。而ResNet模型非常擅长表示结构和布局的相似性,操作的是像素和补丁的层次。然后还有像DreamSim这样的嵌入模型,旨在填补差距并捕捉中级相似性,将模型对相似性的概念与人类的感知相一致。

向量搜索为我们提供了一种探索模型“视觉”世界的方法。通过为我们感兴趣的每个模型创建一个单独的向量索引(在同样的数据上),我们可以快速了解不同模型在内部如何表示数据。

这里有一个示例,展示了在NIGHTS数据集上使用CLIP、ResNet和DreamSim模型嵌入执行的相似性搜索:

使用ResNet50嵌入在NIGHTS数据集中的图像上的相似性搜索(图像由Stable Diffusion — MIT RAIL LICENSE生成)。ResNet模型在像素和补丁的层次上操作。因此,检索的图像在结构上与查询相似,但语义上并不总是相似。
使用CLIP嵌入在相同查询图像上的相似性搜索。CLIP模型遵循图像的基本语义,但忽略布局。
使用DreamSim嵌入在相同查询图像上的相似性搜索。DreamSim填补了差距,寻求最佳的中级相似性折中,融合了语义和结构特征。

要了解更多信息和工作代码,请点击这里

比较模型表示

使用UMAP将ResNet50和CLIP模型在NIGHTS数据集上的表示进行启发式比较。使用UMAP将ResNet嵌入降至二维。在表示图中选择一个点并突出显示附近的样本,我们可以看到ResNet捕捉到的是组合和调色板的相似性,而不是语义相似性。使用CLIP嵌入在所选样本上运行向量搜索,我们可以看到根据CLIP获得的大多数样本与ResNet的本地化不一致。

通过将向量搜索和降维技术(如统一流形近似)结合起来,我们可以对两个模型之间的差异获得新的洞察。具体操作如下:

每个模型的嵌入包含关于模型如何表示数据的信息。使用UMAP(或t-SNE或PCA),我们可以从model1的嵌入中生成较低维度(2D或3D)的表示。通过这样做,我们会牺牲一些细节,但是希望保留一些关于哪些样本被认为与其他样本相似的信息。我们得到的是可视化这些数据的能力。

在model1的嵌入可视化作为背景的情况下,我们可以在该图中选择一个点,并对该样本相对于model2的嵌入执行矢量搜索查询。然后,您可以看到在2D可视化中检索到的点的位置!

上面的示例使用与上一节中相同的NIGHTS数据集,可视化ResNet嵌入,这些嵌入捕捉更多的组合和结构相似性,并使用CLIP(语义)嵌入执行相似性搜索。

概念插值

使用Oxford-IIIT宠物数据集上的CLIP嵌入在“哈士奇”和“吉娃娃”概念之间进行插值

我们即将结束这十个应用程序,但幸运的是,我为最后几个保存了一些最好的内容。到目前为止,我们唯一使用的向量是嵌入-向量索引用嵌入进行填充,并且查询向量也是嵌入。但有时嵌入空间中存在其他结构,我们可以利用这些结构与我们的数据进行更动态的交互。

这样一种动态互动的示例是我喜欢称之为“概念插值”。它的工作原理如下:获取一组图像数据集,并使用多模态模型(文本和图像)生成一个向量索引。选择两个文本提示,比如“晴朗”和“多雨”,它们代表概念,并在范围[0,1]内设置一个值alpha。我们可以为每个文本概念生成嵌入向量,并按照alpha指定的线性组合将这些向量相加。然后,我们对向量进行归一化处理,并将其作为查询用于图像嵌入的向量索引。

由于我们在线性插值两个文本提示(概念)之间的嵌入向量之间,我们在非常宽泛的意义上插值了概念本身!我们可以动态更改alpha并在每次交互时查询我们的向量数据库。

💡概念插值的概念是实验性的(即:它并不总是一个定义良好的操作)。我发现当文本提示在概念上相关,且数据集足够多样化以对插值谱上的不同位置产生不同结果时,它的效果最好。

有关更多信息和可用代码,请参见此处。

概念空间遍历

通过在COCO 2017数据集的测试拆分中以文本提示为方向的差异移动,遍历“概念”空间的动画。由作者提供的图像,使用CLIP模型对图像和文本进行嵌入。

最后,但肯定不是最不重要的,我们有一种我喜欢称之为“概念空间遍历”的方法。与概念插值类似,首先获取图像数据集并使用像CLIP这样的多模态模型生成嵌入。接下来,从数据集中选择一张图像。这张图像将作为你的起点,通过该起点你将在“概念”的空间中进行“遍历”。

从那里,你可以通过提供一个文本字符串作为概念的替代品,来定义你希望移动的方向。设置你希望在该方向上采取的“步长”大小,该文本字符串的嵌入向量(乘以一个系数)将添加到初始图像的嵌入向量中。将“目标”向量用于查询向量数据库。你可以以任意多的概念和数量添加,并观察随着实时更新的检索图像集。

与“概念插值”一样,这并不总是一个严格定义的过程。然而,我发现它非常吸引人,并且当应用于文本嵌入的系数足够高时,它的性能是相当不错的,这样嵌入就会得到足够的考虑。

有关更多信息和工作代码,请参见这里。

结论

向量搜索引擎是非常强大的工具。当然,在这个城市里最棒的节目中,它们是明星。但是,向量数据库的用途远不止于此。它们能够更深入地理解数据,洞察模型如何表示这些数据,并为我们与数据交互开拓新的途径。

向量数据库并不局限于LLMs。只要涉及嵌入,它们就会派上用场,而嵌入恰好处于模型和数据的交集上。我们越能深入地理解嵌入空间的结构,我们的向量搜索使能的数据和模型交互就会变得更加动态和广泛。

如果你觉得这篇文章有趣,你可能还想看看下面这些使用向量搜索的文章: