在过去一年多的时间中GPT火爆全网,被大家熟知,GPT概念更是收割市场,被预测为下一个风口,资本纷纷入场, AI 应用的发展如火如荼,带动了 AI 应用产业链上下游的火爆,而向量数据库就是其中最热门的应用之一。
有人说他用GPT是有记忆功能的。
过去的这一年,我们正处于人工智能领域的激动人心时刻,其中 GPT-3.5/4 模型的推出成为了万众瞩目的焦点。这些模型在自然语言处理方面表现卓越,让人叹为观止。但应用的背后也伴随着一些令开发者头痛的挑战。最为显著的一个问题是输入上下文(token)的限制,尤其是 gpt-3.5-turbo 模型,限制为 4K tokens(约3000字),这也就意味着GPT用户在与模型交互时最多只有3000字的内容来理解和推断。
所以 ChatGPT 是不具备对话记忆功能的,实际上,对话记忆是通过将对话记录存储在外部内存或数据库中实现的,而不是模型内部的记忆功能。当我们向模型发送消息时,程序会自动从存储的对话记录中选择最近的几次对话(在4096 tokens的限制内),并通过 prompt 组合成最终的问题,发送给 ChatGPT。因此,如果对话记忆超过4096 tokens,模型就会遗忘之前的对话。
不同版本的模型具有不同的 token 限制,例如 gpt-4 的限制为32K tokens,而 Claude 模型则达到了100K tokens。这似乎为处理更大文本提供了更大的灵活性,但这也引发了新的问题。Claude 模型在处理72K tokens的上下文时,响应速度已经达到20秒左右。这意味着,尽管我们有更大的上下文输入空间,但在实践中,处理大规模文档的效率依然面临着挑战。
此外,考虑到 GPT API 的计费是基于 tokens 的,输入更多上下文将导致更高的成本。这使得在成本、性能和任务需求之间寻找平衡成为一项复杂的任务。
在GPT模型的限制下,开发者积极寻找创新的解决方案,其中向量数据库就是一种引人注目的选择。概念的核心思想是将文本转换为向量,然后将这些向量存储在数据库中。当用户提出问题时,系统将问题转换为向量,然后在数据库中搜索最相似的向量和上下文,最终将相关文本返回给用户。
以一个实际应用场景为例,假设我们有一份大量文档需要GPT处理,比如培训资料或操作手册。 首先,我们可以将文档的所有内容通过Vector Embedding转化为向量,然后当用户提出相关问题时,将用户的搜索内容转换成向量。 接着,在数据库中搜索最相似的向量,匹配最相关的上下文,并将这些文本返回给GPT。 这不仅显著减轻了GPT的计算负担,提高了响应速度,还有效规避了GPT tokens的限制,降低了成本。
另一方面,当我们与ChatGPT进行大量对话时,可以将所有对话以向量的形式保存起来。当我们向ChatGPT提问时,将问题转化为向量,并进行语义搜索,找到与当前问题最相关的“记忆”,一起发送给ChatGPT。这一方法也可以显著提高GPT的输出质量。
向量数据库的应用不仅限于文字语义搜索,还包括传统AI应用和机器学习场景中的人脸识别、图像搜索、语音识别等功能。这个方案为AI获得理解和维护长期的记忆以及执行复杂任务提供了有力支持。
Vector Embedding(向量嵌入)是一种将数据映射到高维向量空间的技术。这种映射由深度学习模型生成,旨在捕捉数据的各种特征和语义信息。在这个高维向量空间中,数据的不同方面和关系通过向量的位置和方向得以表示。
具体来说,对于文本数据,Vector Embedding 可以将每个单词、短语或文档映射为一个高维向量。这个向量包含了关于该文本的语法、语义、情感等方面的信息。同样,对于图像、音频等不同类型的数据,Vector Embedding 也能够捕捉到它们的特征。
使用 Vector Embedding 的目的是将非结构化或半结构化的数据转换为机器学习算法可以理解的形式,同时保留数据的关键信息。这为各种任务,如相似性搜索、文本分类、推荐系统等提供了基础。
常见的 Vector Embedding 模型包括 Word2Vec、GloVe(Global Vectors for Word Representation)、BERT(Bidirectional Encoder Representations from Transformers)等。这些模型通过学习大量数据,能够生成具有语义信息的向量表示,使得数据可以更好地用于深度学习和机器学习任务。
对于传统数据库,搜索功能都是基于不同的索引方式(B Tree、倒排索引等...)加上精确匹配和排序算法(BM25、TF-IDF)等实现的。其本质还是基于文本的精确匹配,这种索引和搜索算法对于关键字的搜索功能非常合适,但对于语义搜索功能就非常弱。
例如,如果你搜索 “猫”,那么你只能得到带有 “猫”果,而无法得到 布偶、英短 等结果,因为 猫和 布偶是完全不同的词语,传统数据库无法识别它们的语义关系,所以传统的应用需要人为的将 猫和布偶等词之间打上特征标签进行关联,这样才能实现语义搜索。而如何将生成和挑选特征这个过程,也被称为 Feature Engineering (特征工程),它是将原始数据转化成更好的表达问题本质的特征的过程。
但是当处理非结构化数据,如图像、音频、视频等时,特征数量迅速膨胀,手动标注特征变得困难。所以我们需要一种自动化的方式来提取这些特征。这时,Vector Embedding提供了一种自动化的特征提取方式。
特征和向量是在数据科学和机器学习领域中经常使用的两个概念
特征(Feature):
- 征是描述数据的属性或属性集。
- 在机器学习中,特征通常是指用于描述样本的属性,可以是数值、类别、文本等不同类型的信息。
- 例如,对于一张图像,特征可以包括像素值、颜色直方图等;对于文本,特征可以是单词频率、词性等。
向量(Vector):
- 向量是一个有序的数学对象,由一列数字组成,可以表示空间中的一个点。
- 在机器学习中,向量常用于表示数据的特征集。每个维度对应一个特征。
- 例如,一个包含三个特征的数据点 (x1,x2,x3) 可以用向[x1,x2,x3] 表示。
特征和向量之间的联系在于特征可以被组织成向量。一个样本的所有特征值可以形成一个向量,这个向量在高维空间中的位置反映了样本在这个特征空间中的表现。
在机器学习任务中,我们通常使用向量表示数据,其中每个维度对应一个特征。Vector Embedding 这样的技术可以将特征映射到高维向量空间,以便更好地表示和处理数据。向量空间的概念也为相似性搜索、聚类等任务提供了强大的工具。
在向量数据库中,特征和向量的理念起着关键作用,为实现相似性搜索提供了基础。在深入研究相似性搜索之前,我们需要详细了解特征和向量的概念。
首先,我们从日常观察出发,思考为何我们能够区分不同的事物。这源于我们通过识别它们的不同特征来判别它们的类别。以动物为例,我们可以通过观察面部特征、体型大小、毛发长度、鼻子长短等特征进行区分。将这些特征抽象为坐标轴上的数值,我们可以得到每只动物在特征空间中的位置。
然而,单一特征可能不足以区分所有事物,比如在体型上相近的哈士奇、金毛和拉布拉多。为此,我们引入更多特征,比如毛发的长短,构建一个二维坐标系。通过不断添加特征,我们可以建立一个多维坐标系,以唯一表示事物在高维特征空间中的位置。
事实上,只要特征足够丰富,我们可以在高维坐标系中独特地表示任何事物。这种表示方式使得相似性搜索成为可能。在二维坐标系中,若两个坐标点相近,说明它们的特征也相近。将这些特征用向量表示,我们可以通过计算向量之间的距离来判断它们的相似度,这构成了相似性搜索的基本原理。
通过将事物映射到高维特征空间,我们能够利用向量表示和计算相似性来实现高效的相似性搜索。这一理念为向量数据库的相似性搜索算法奠定了基础,使得在高维空间中迅速找到相似向量成为现实。
相似性搜索是通过比较向量之间的距离来评估它们的相似度。然而,在处理大规模数据时,需要应对庞大的计算量,这就需要高效的搜索算法。这些算法通常通过以下两种方式提高效率:
- 减少向量大小: 通过降维或减小表示向量值的长度来降低计算复杂度。
- 缩小搜索范围: 通过聚类或将向量组织成基于树形、图形结构的形式,限制搜索范围,仅在最接近的簇中进行搜索,或通过最相似的分支进行过滤。
相似性测量是用于衡量两个数据对象之间相似程度的方法。在不同的领域和任务中,可以使用不同的相似性度量方法。
欧几里得距离(Euclidean Distance)
欧几里得距离(Euclidean Distance)是一种用于衡量两个点之间直线距离的方法。对于两个n维空间中的点A(a1, a2, ..., an)和B(b1, b2, ..., bn),欧几里得距离的公式如下:
这个公式实际上是计算点A到点B之间的直线距离,即两点之间的最短路径长度。
在相似性搜索中,欧几里得距离常用于衡量两个向量之间的相似度,距离越小表示向量越相似。在高维空间中,欧几里得距离的计算仍然有效,但需要注意维度的影响。在高维空间中,点之间的距离可能会因为维度的增加而呈指数级增长,这被称为维度灾难。
在实际应用中,欧几里得距离可以作为一种有效的相似性测量方法,但在处理高维数据时,可能需要考虑使用其他更适合高维空间的方法。
余弦相似度(Cosine Similarity)
余弦相似度(Cosine Similarity)是一种衡量两个向量之间夹角余弦的度量,用于评估它们的相似性。对于两个向量 A 和 B,余弦相似度的计算公式如下:
其中,A ⋅ B 表示向量内积,||A|| 和 ||B|| 分别表示向量的范数(或长度)。
余弦相似度的取值范围在 [-1, 1] 之间,其中:
- 1 表示两个向量方向相同,完全相似;
- 0 表示两个向量正交,无相似性;
- -1 表示两个向量方向相反,完全不同。
在相似性搜索中,余弦相似度常用于衡量文本、图像等高维数据之间的相似性。由于余弦相似度仅关注向量的方向而不考虑其长度,因此对于处理稀疏向量或高维数据具有优势。
点积相似度 (Dot product Similarity)
点积相似度(Dot product Similarity)是一种用于衡量两个向量之间相似度的度量方法,通常用于高维向量空间。对于两个向量 A = [a_1, a_2, ..., a_n] 和 B = [b_1, b_2, ..., b_n],点积相似度的计算公式如下:
其中,A ⋅ B 表示向量的点积,||A|| 和 ||B|| 分别表示向量的范数(或长度)。
点积相似度的取值范围在 [-1, 1] 之间,与余弦相似度类似。其计算方式涉及两个向量的点积以及它们的范数。相似度为1表示两个向量方向相同,相似度为0表示正交,相似度为-1表示方向相反。
在向量空间中,点积相似度常用于衡量文本、图像等高维数据之间的相似性。与余弦相似度相比,点积相似度更关注向量的绝对值大小,而不仅仅是方向。
向量数据库是一种处理大规模、高维度数据的技术,其核心思想是将数据转化为向量表示并存储在数据库中。这种数据库的应用广泛,其中包括相似性搜索、文本处理、图像检索等多个领域。
本文主要介绍了向量数据库的原理和实现,包括向量数据库的基本概念、相似性搜索、相似性测量等。这些技术在处理大规模数据时能够提高效率,降低计算复杂度,并且在机器学习和深度学习任务中发挥关键作用。向量数据库是崭新的领域,目前大部分向量数据库公司的估值借着 AI 和 GPT 的东风正在飞速的增长,但是在实际的业务场景中,目前向量数据库的应用场景还比较少,抛开浮躁的外衣,向量数据库的应用场景还需要开发者们和业务专家们去挖掘。