输入“/”快速插入内容

2023-07-25ChatGPT盛行的当下,向量数据库为大模型配备了一个超级大脑

2023年7月26日修改
作者:Doug Wang编辑:H4O
你是否有过这样的经历:你在网上看到一张壁纸,画面中的雪山和湖泊令人心驰神往,你想知道这是哪个国家的美景,却不知道如何搜索;或者,在阅读一篇文章时,你想深入了解这个话题,寻找更多的观点和资料,却不知道该如何精确描述;又或者,当你在聆听一首歌曲时,你想寻找更多同样风格或情感的歌曲,却不知道如何分类。这时,你需要的是一个能够理解你的意图,为你提供最相关的结果,让你轻松找到你想要的信息的工具。
这就是 Vector Data Base (VectorDB, 向量数据库),它就像一个超级大脑,帮助你解决这些问题
Vector DB 的用途远不止于此,它还能够帮助像 ChatGPT 这样的智能系统,从海量的数据中快速检索出最合适的答案,提高它们的准确性和效率。在当前大家普遍面临算力不足,难以对大语言模型进行微调的情况下,为大语言模型配备一个知识库(超级大脑)就显得尤为重要。这就像给大语言模型提供了一份小抄,使其能够更好地服务于我们。
Vector 是什么 —— 计算机理解世界的起点在我们深入了解 Vector DB 之前,让我们先来简单理解(或回顾)一下什么是 Vector,其实它也就是我们在高中数学或者大学数学里学到的向量,只不过维度比当时的直角坐标系里的二维多一点而已(或许多到了 512 维)。在许多学术论文中,你可能更熟悉它的另一个名字 —— 嵌入(Embedding)。为了实现我们前面提到的超级大脑,我们首先需要让这个大脑理解各种信息,而这就是嵌入的作用。
你可能会问,什么是嵌入呢?想象一下,你正在看一部电影,你的大脑会自动将电影中的人物、情节、对话等信息转化为你可以理解的形式。这就是一种嵌入的过程。很奇妙对吧,大脑就这么理解他们了。同样,我们也可以让计算机做类似的事情,将各种类型的数据转化为它可以理解的形式,而计算机接受的也就是数字,也就是向量。回顾一下高中数学就好了,二维向量可以表征一个直角坐标系里的每个点,也就表征了这个直角坐标系里的所有信息了。那如果我们把维度无限拉大,他就可以表征无限多的信息。你可能在一些科幻电影中看到过,说高等生物可能不会像我们一样以三维的肉体存在,他们可能存在于更高的维度。比如时间就是第四维,跳脱之后就变成了四维生物。这其实就说明了为什么嵌入可以更好的理解这个世界,因为三维只能容纳我们的肉体,而高维的世界,才存在着我们的灵魂
理解了为什么一串数字可以帮助计算机理解世界之后,你可能会考虑到下一步更实际的问题,如何将数据转换为向量呢?这就要靠我们在 AI 界做出的进步了,我们研究出了很多模型,可以将任意类型的数据映射到一个高维空间中,生成一个向量,这个向量就是数据的嵌入表示。
嵌入方法有很多种,例如文本嵌入(text embedding),可以将文字转换为向量;图像嵌入(image embedding),可以将图片转换为向量;音频嵌入(audio embedding),可以将声音转换为向量;视频嵌入(video embedding),可以将视频转换为向量;甚至还有多模态嵌入(multimodal embedding),可以将不同类型的数据转换为同一个空间中的向量,比如一个电影包含声音和画面,那如果要更全面的表征这个电影,我们就需要结合音频嵌入和视频嵌入,也就是多模态嵌入了。图 1 展示了几组文本嵌入的情况,一个最简单的例子就是 king - man + woman = queen,简单的小学加减法。
图 1. 三维情况下的向量图解。
有了嵌入方法,我们就可以将各种数据转换为向量,并存储在 Vector DB 中。当我们想要搜索某种数据时,我们只需要提供一个查询向量,这个查询向量可以是同类型或不同类型的数据,只要它能够表示我们想要找到的信息或标准。然后,Vector DB 会使用一种相似度度量(similarity measure),来计算查询向量和存储向量之间的距离或相似度,并返回最相似或最相关的向量列表。我们就可以从这个列表中找到我们想要的数据,或者进一步缩小范围。当然,向量检索近年来的火热与大模型能力的提升是密切相关的。大模型通常能更好地理解和生成更高维度、更复杂的数据表示,这为向量检索提供了更精确、更丰富的语义信息。反之,向量检索也能为大模型提供信息的补充和长上下文的处理能力,从而进一步提高模型的性能。此外,向量检索在大模型的训练和应用中起着关键作用。虽然向量数据库不是进行向量检索的唯一方式,但它确实是所有方式中最高效、最便利的一种。
在后续的文章中,我们将进一步探讨为什么向量数据库在构建未来 AI 系统时是必不可少的关键环节。
Vector DB 是什么 —— 一瓶数据库专有的智慧药水
在我们了解了 VectorDB 里存的是什么之后,再结合我们引言里的介绍,VectorDB 的真容也就呼之欲出了 —— 它是一种新型的数据库,它新在它存的是 Embeddings(嵌入)。这个新并不是为了新而新,从传统的直接存储内容转到存储向量,就像是给数据库喝了瓶智慧药水,让它变得更聪明,更强大。
Vector DB 就像是一个超级侦探,它可以让你根据内容或意思来搜索数据,而不是根据标签或关键词来搜索数据。这就好像你在一个无序的图书馆里找书,不需要知道书的 ISBN 号,只要告诉 Vector DB 你想要的书的内容,它就能帮你找到。
Vector DB 还可以是一个超级翻译机,它可以让你用一种类型的数据来搜索另一种类型的数据。这就好像你只知道一首歌的旋律,但不知道歌名,Vector DB 就能帮你找到这首歌的信息。
Vector DB 也可以被理解为一个超级搜索引擎它可以让你在海量和复杂的数据中进行快速和准确地搜索。这就好像你在一个巨大的迷宫里,Vector DB 就是你的导航,帮你快速找到出口。
如最开始所说,VectorDB 不仅有以上这些好处,还有一个非常重要且热门的应用场景,那就是与 LLM 结合。LLM 是指大型语言模型(Large Language Models),它们就像是一个超级作家,可以生成自然语言文本,或者理解和回答自然语言问题。但是,LLM 也有一些挑战,例如缺乏领域知识,缺乏长期记忆,缺乏事实一致性等。
为了解决这些挑战,Vector DB 就像是给 LLM 提供了一本百科全书,让 LLM 可以根据用户的查询,在 Vector DB 中检索相关的数据,并根据数据的内容和语义来更新上下文,从而生成更相关和准确的文本。这样,LLM 就可以拥有一个长期记忆,可以随时获取最新和最全面的信息,也可以保持事实一致性和逻辑连贯性。
Vector DB 和 LLM 的结合有很多具体的例子,假设你正在使用一个基于 LLM 的聊天机器人,你问它:“最近有什么好看的电影吗?”ChatGPT 本身只能回答他数据集里包含的信息(2021 年之前),而有了外接知识库,机器人可以在 Vector DB 中搜索最近的电影评价向量,并返回一些高评价的电影。就像你问你的朋友推荐电影,他会根据他的记忆和你的口味给你推荐。
ChatGPT 本身像是一个耄耋老人,信息还停留在他年轻的时候,而加入了外界知识库的 ChatGPT,摇身一变变成了你的同龄人朋友,你们都紧跟时事,只需要随时去刷刷社交平台(更新知识库)就好了
举个例子,[1] 想要让 ChatGPT 拥有 Numpy 的背景知识(如何做各种运算,比如求中位数、平均值等),但是它的文档有 20 多页,显然是不能直接作为知识输入给 ChatGPT 的(长度太长),然而,建立一个可以简单查询的 vectorDB 只需要以下几行代码。
然后,如果你想问这个文档里的问题,所需的代码依然很简单:
最后,就会得到这个结果:
看到了吧,在现有大语言模型的理解能力下,我们已经不需要 fine-tune 了,只需要外接一个知识库,就能很快地得到最新的知识。
简单,好用
Vector DB 的发展历程 —— 好莱坞英雄成长史
Vector DB 的故事就像一部好莱坞大片中的励志英雄,从默默无闻到大放异彩。它的起源可以追溯到生物技术和基因研究领域的兴起。在 20 世纪 70 年代末,DNA 测序作为一个新兴的研究领域开始引起人们的关注。为了存储大量的 DNA 链数据,科学家们需要一种新的方法,这种方法需要能够处理高维向量。这就是 Vector DB 的诞生,它是一种可以将任何类型的数据转化为向量的数据库,能够计算数据之间的相似度,从而实现数据的分类、聚类和检索等功能。
然而,这个时期的 Vector DB 还相当初级,它只能处理文本数据,无法处理图像、音频、视频等其他类型的数据;它只能计算数据的表面相似度,无法计算数据的深层相似度;它只能处理静态的数据,无法处理动态的数据。尽管如此,它已经展现出了其独特的潜力和魅力。
在 Vector DB 出现之前,大家普遍使用的是关系型数据库,如 MySQL、Oracle 等,这些数据库以表格的形式存储数据,适合存储结构化数据,但对于非结构化数据,如文本、图像、音频等,处理起来就相对困难。而且,关系型数据库在处理大规模数据时,性能会下降,不适合大数据处理。这就像是在一个拥挤的图书馆里找一本书,你知道它在哪个书架上,但是找到它还需要花费大量的时间。但是在当时,这已经足够了。
随着时间的推移,我们看到 Vector DB 在不同的领域和应用中不断成长和进化。从 20 世纪 90 年代末到 2000 年初,美国国立卫生研究院和斯坦福大学都开始使用 Vector DB,他们利用 Vector DB 进行了一系列的基因研究,发表了多篇高质量的论文 [2]。随着 2005 年到 2015 年间基因研究的深入和加速,Vector DB 也在并行中增长,像 UniVec 数据库这样的工具在 2017 年就已经被广泛使用 [5],它们在基因序列比对、基因组注释等领域发挥了重要作用 [3,4]。
此时,随着数据类型和规模的多样化,关系型数据库的局限性也逐渐暴露出来。首先,关系型数据库主要适用于结构化数据,对于非结构化数据,如文本、图像、音频等,处理起来就相对困难。其次,关系型数据库在处理大规模数据时,性能会下降,不适合大数据处理。最后,关系型数据库的查询语言(如 SQL)虽然强大,但对于复杂的查询和分析任务,可能需要编写复杂的 SQL 语句,这对于非专业的用户来说,可能是一个挑战。
在 2017 年和 2019 年之间,我们见证了 Vector DB 的爆炸式增长,它开始被应用于自然语言处理计算机视觉、推荐系统等领域。这些领域都需要处理大量和多样化的数据,并从中提取有价值的信息。Vector DB 通过使用诸如余弦相似度欧氏距离、Jaccard 相似度等度量方法 [6],以及诸如倒排索引、局部敏感哈希、乘积量化等索引技术 [18],实现了高效和准确的向量检索。大家大多应该听说过或者用过推荐系统、以图搜图 (淘宝的用图搜产品)、哼唱搜歌、问答机器人等等,这些的内核都是 Vector DB。
就在我们以为故事已经到达高潮的时候,Vector DB 又给我们带来了一个惊喜。在今年,Vector DB 开始被用于与大语言模型结合的应用。它为大语言模型提供了一个外部知识库,使得大语言模型可以根据用户的查询,在 Vector DB 中检索相关的数据,并根据数据的内容和语义来更新上下文,从而生成更相关和准确的文本。这些大语言模型通常使用深度神经网络来学习文本数据中隐含的规律和结构,并能够生成流畅和连贯的文本。Vector DB 通过使用诸如 BERTGPT预训练模型将文本转换为向量,并使用诸如 FAISS、Milvus 等开源平台来构建和管理向量数据库。
Vector DB 成功地解决了很多挑战,并为人们带来了很多价值。它采用了一种新的数据结构和算法,可以有效地存储和检索向量,可以保证检索的准确性和效率,可以处理大规模和复杂的数据。它还可以与其他工具和平台结合,提供更多功能和服务。它已经成为了一个不可或缺的工具,为人们提供了更好的信息获取和交流体验。它不仅打败了其他 DB,还赢得了用户的心。
然而,这部大片依然未完待续,Vector DB 仍有改进的空间。例如,它在处理大规模数据时,可能会面临存储和计算资源的挑战,这就像是在一个无底的大海中寻找一颗珍珠;在处理复杂的查询时,可能会面临性能和准确性的挑战,这就像是在一个复杂的迷宫中寻找出口;在处理动态的数据时,可能会面临数据更新和同步的挑战,这就像是在一个不断变化的沙漠中寻找一个固定的地标。
然而,我们有理由相信,随着技术的不断发展和进步,Vector DB 将会越来越强大,越来越完善,为我们的生活带来更多的便利和价值。就像我们的励志英雄,无论面临多大的困难和挑战,都会不断地前进,不断地成长,最终实现自己的目标。这部大片还没有结束,Vector DB 依然在刻苦努力着,保持着这来之不易的成功。
在介绍 Vector DB 近期做出的努力之前,不得不说的是,Vector DB 和关系型数据库是各有优势的,选择哪种数据库取决于具体的应用需求。如果你需要处理的是结构化数据,并且数据规模不大,那么关系型数据库可能是一个好选择。但如果你需要处理的是非结构化数据,或者需要处理大规模的数据,那么 Vector DB 可能是一个更好的选择。
Vector DB 的技术内核 —— 超级英雄的武器
为了更加了解我们的超级英雄,我们先从超级英雄的日常生活开始。想象一下,你是一个超级英雄,你的任务是理解和处理海量的信息。你的工具是一种叫做 Vector DB 的新型数据库,它可以存储和处理嵌入向量 (Embeddings)。Sounds cool, right? 但是,这并不是一件轻松的事情。你需要处理的问题包括如何将数据转化为向量 (向量嵌入),如何度量向量之间的相似性 (相似度度量),如何索引和检索向量 (向量索引和检索),以及如何压缩向量以节省存储空间 (向量压缩)。这些都是 Vector DB 的核心技术,也是你作为超级大脑的主要烦恼。
那让我们来一起探索 Vector DB 的技术内核,看看这个超级英雄每天是如何工作的。让我们用一个例子来更方便的理解这些步骤。假设作为超级英雄,你的任务是管理一个巨大的图书馆。这个图书馆有各种各样的书,包括小说、诗歌、科学论文、历史书籍等等。你的目标是让读者能够快速准确地找到他们想要的书。
首先,你需要将每本书转化为一个向量。这就像是给每本书创建一个独特的指纹,这个指纹可以反映出书的内容、风格、主题等关键信息。这个过程就是向量嵌入。这是一个很大的话题,这篇文章里暂时不会很详细的涉及,但是得益于 AI 的发展,现在嵌入都能较好的表征他们想要表征的数据了 [7]。
在假设我们能够得到很好的表征之后,你就需要度量向量之间的相似性了。这就像是比较两本书的指纹,看看它们有多么相似。这个过程就是相似度度量。在早期,我们可能会使用欧几里得距离或者余弦相似度来度量相似性。但是,随着时间的推移,我们发现这些方法在处理高维数据时可能会遇到困难。
因此,现代的相似度度量方法,如最近邻搜索 (Nearest Neighbor Search) 和局部敏感哈希 (Locality-Sensitive Hashing) 等,被开发出来 [8]。这些方法可以更有效地处理高维数据,提供更准确的相似度度量。接下来,你需要索引和检索向量。这就像是创建一个图书馆的目录,让读者可以根据他们的需求快速找到他们想要的书。这个过程就是向量索引和检索。在早期,我们可能会使用线性搜索或者树形结构来索引和检索向量。但是,随着数据量的增长,这些方法可能会变得效率低下。因此,现代的向量索引和检索方法,如倒排索引 (Inverted Index) 和乘积量化 (Product Quantization) 等,被开发出来 [9]。这些方法可以更有效地处理大规模数据,提供更快速的索引和检索。
最后,你需要压缩向量以节省存储空间。这就像是将书的内容进行压缩,让它们占用更少的空间。这个过程就是向量压缩。在早期,我们可能会使用简单的压缩算法,如 Huffman 编码或者 Run-Length 编码来压缩向量。但是,随着数据量的增长,这些方法可能无法满足压缩需求。因此,现代的向量压缩方法,如乘积量化 (Product Quantization) 和优化乘积量化 (Optimized Product Quantization) 等,被开发出来 [10]。这些方法可以更有效地压缩向量,提供更高的压缩比。
读到这里,如果你是 AI 专业的人,你可能已经意识到,虽然向量嵌入和相似度度量都是重要的问题,但是在 Vector DB 的发展中,得益于 AI 的发展,嵌入已经不算最大的问题了。当下要解决的最主要的问题其实是向量索引和向量检索。这是因为,随着数据量的增长,如何有效地索引和检索向量成为了一个巨大的挑战。
索引,检索,压缩 —— 超级英雄的烦恼
非技术人员撤离警告
但是你知道吗,即使已经成了超级英雄,也有自己的烦恼。超级英雄的故事已经讲完了,我们来看看 VectorDB 究竟做了什么努力。首先,我们正式的定义一下这个过程(图 2):
首先,我们用一个嵌入模型把我们要索引的数据转换成向量嵌入。
然后,向量嵌入被存储到向量数据库里,并保留了它们对应的原始数据的引用。
最后,当应用程序发起一个查询时,我们用同样的嵌入模型把查询变成一个向量嵌入,并用它来在数据库中搜索最相似的向量嵌入。正如我们所说的,这些相似的向量嵌入反映了它们生成它们的原始数据的含义。
图 2. VectotDB 应用流程。图源:https://www.pinecone.io/learn/vector-database/
在这里其中对于 Vector DB 来说最主要的瓶颈还是在于第二步和第三步的索引,检索和压缩,因为 Vector DB 的目标和优势就是更好的处理大规模的数据
向量索引与检索,这就像是超级英雄的重要武器之一,是 Vector DB 处理大规模数据的关键。向量索引的任务就是在海量的向量中,快速找到与查询向量最相似的向量。这就像是在一个巨大的超市里,快速找到你想要的商品。想象一下,如果超市里的商品没有分类,没有标签,你要找到你想要的商品可能需要花费大量的时间。而向量索引就是这个超市的分类标签,它可以帮助你快速找到你想要的商品。