Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 矢量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库对于构建生产就绪的 AI/ML 服务至关重要。更多关于 Elastic 向量搜索的信息,可以在地址 What is vector search? Better search with ML | Elastic 找到更多的信息。
向量到底是什么?
简而言之,向量是数据的数值表示。 所有数据(表格、文本、图像、视频、声音等)都可以表示为多维数字数组。
向量搜索的具体工作方式存在不同的技术变化,但基本思想集中在向量空间中的 ANN 算法搜索概念上。
如上图所示,我们可以看到在向量(嵌入)空间里,cat 和 kitten 这两个单词靠的比较近,而 dog 稍远一点。king 和 queen 这两个词靠的比较近一点,而和 dog 及 cat,kitten 相隔的比较远。这个我们可以通过阅读文章 “Elasticsearch:语义搜索 - Semantic Search in python” 也可以看出来。 那是一篇非常有趣的文章。值得阅读。
作为向量的表格数据
将数据转换为机器学习算法易于使用的形式是在 ML 管道的数据预处理阶段完成的。 这是管道的早期阶段之一。
表格数据(例如 SQL 数据库中的表)每行包含一个观察值。
每列中的数据可大致分为四种类型之一。
- Nominal:名义数据是指没有任何顺序或定量值的值。 性别就是此类数据的一个例子。
- Ordinal:序数数据具有自然排序,其中数字按其在刻度上的位置按某种顺序出现,但我们无法对它们执行任何算术任务。 日期字段是序数数据的示例。
- Discrete:离散数据包含属于整数或整数的值。 班级中的学生总数是离散数据的一个示例。 这些数据不能分解为小数或分数。
- Continuous:连续数据采用小数形式。 例如,班级学生的身高就是连续数据的一个例子。
机器学习算法不擅长处理名义数据或有序数据。 因此,在将表格数据输入机器学习算法之前,我们通常需要将这些字段转换为数字。 编码是机器学习中将非数字字段转换为数字字段的过程。 对名义字段和序数字段进行编码后,你获得向量数据集。
图像作为矢量
图像可以表示为 3 维数字矩阵(技术上是 Rank-3 Tensor,但现在让我们忽略细节)。 两个维度代表像素的坐标,第三个维度包含三个颜色通道。 矩阵中的数字范围为 0 到 255,代表像素的三基色(红、绿、蓝)的值。 因此,4 x 4 像素的彩色图像可以表示为如下所示的矩阵。
有关如何把图像转换为向量,请参考文章:
文本作为矢量
文本信息可以转换为一个长的数字向量,其中向量中的位置代表单词,值代表该单词在文本中出现的次数。 这称为文本数据的词袋(bag of words)表示。
These are not the droid you are looking for. No, I am your father.
these:1, are: 2, not: 1, the: 1, droid: 1, you: 1, look: 1, for: 1
no: 1, i: 1, am:1, you: 1, father: 1
文本信息可以转换为一个长的数字向量,其中向量中的位置代表单词,值代表该单词在文本中出现的次数。 这称为文本数据的词袋(bag of words)表示。这种早期形式的矢量化文本会产生稀疏向量(带有太多零的向量)。现在存在更复杂的方法(词嵌入)将文本转换为向量。 这些方法可以生成紧凑、密集的向量,这些向量具有更小的存储大小,并且还以这样的方式对文本的含义进行编码:向量空间中更接近的文本预计在含义上相似。
为什么我们将数据表示为向量?
数据点(data points)在机器学习中被表示为向量,因为它们可以有效地编码和操作信息。 向量提供了一种简洁且结构化的格式来组织数据点,其中每个向量元素对应于特定的特征或属性。 当数据点表示为向量时,机器学习算法可以轻松执行加法、减法和点积等数学运算。 这有利于训练和推理过程中涉及的各种计算,例如计算数据点之间的相似性、估计距离和优化模型。 此外,向量可以使用线性代数和矩阵运算,这构成了许多机器学习技术的基础。 通过利用向量的力量,机器学习算法可以有效地分析复杂的数据集并从中学习,最终获得准确的预测和有价值的见解。
向量是数学的东西
向量搜索是一种已经发展了数十年的机器学习技术。 它将单词转换为数字并使用相似性度量,或测量这些单词彼此之间的相似程度。 它有点复杂,但我们可以通过依赖高中数学中的一些概念使它更具体。
两点之间的线是一个向量,一端在原点,另一端在一点。 我们将其表示为线段的终点。
用几何术语来思考这一点使它更加具体。 你有一条带有起点(称为原点)的线,它向左延伸六个点,向右延伸六个点。 从同一原点开始,直线向上延伸六点,向下延伸六点。 (你可以将线条延伸至无穷大,但为了具体起见,我们使用了一小部分数字。)
如果我们把这些线变成图表,那么左右的线就是 x 轴,上下的线就是 y 轴。 你可以用数字表示轴上的任何点,一侧为正数,另一侧为负数。 我们一直看到这种二维图形,即平面。
在图 2 中,我们的向量(或线端点)有两个数字 — 一个代表 x 轴,另一个代表 y 轴。 二维意味着你需要两个数字来描述向量空间中的一个位置。
要想象三个维度,我们需要从图表中走出来,就像我们从一页纸上走出来一样。 三维点得到三个数字。
对于添加到向量的每个维度(这很难想象),都会得到一个附加数字(有时称为稠密向量)。
在机器学习应用中,计算机科学家将在数百或数千维的空间中处理向量。 这无疑使我们可视化它们的能力以及我们对几何的一些直觉变得复杂,但二维和三维的相同原理也适用。
测量向量相似度
因此,向量允许我们将非结构化数据转换为数字表示,这些数据包括单词、图像、查询,甚至产品。 数据及其向量通过相似性进行同步,并显示与搜索者的问题和意图相匹配的结果。
我们使用相似性指标将数据与查询进行匹配。 这就是上面关于线、图和向量空间的段落的用武之地。
当我们谈论两个非结构化数据的相关程度时,我们需要某种方法来测量它们在向量空间中的距离。 向量用角度来衡量相似性。 这意味着向量的方向而不是向量的长度很重要。 线条的方向决定了角度的宽度,这就是我们衡量相似性的方式。
再次查看我们的图表,我们看到三个向量。
- 向量 A 是 (2,1)
- 向量 B 是 (3,2)
- 向量 C 为 (-1, 2)
向量 A 和向量 B 之间的角度比向量 A 和向量 C 之间的角度小得多。
窄角度告诉我们,事物是密切相关的,即使一条线段比另一条线段长得多。 同样,我们感兴趣的是向量的方向,而不是长度。
如果两个向量之间存在 180 度角,则表明它们是反相关的,这可能是有价值的信息。 如果角度为 90 度,则这两个向量无法告诉你彼此的信息。
测量两个向量之间的相似度或距离称为余弦距离,因为距离(数字)的实际计算使用余弦函数。
查看曼哈顿地图,您会发现大多数街道都是从上到下(北/南)和从左到右(东/西)延伸的。 当我们需要查看最好的百吉饼店距离我们酒店有多远时,有人会告诉我们向上三个街区,向下一个街区。
这是测量距离的一种方法 —— 百吉饼店距离我所在的地方(原点)有多远,称为曼哈顿距离。 但也有直线距离,这是一种不同的测量方法,称为欧几里德距离。 测量距离的方法有很多种,但这两个例子给了我们这个想法。
在向量搜索中,更接近意味着 “更相关”,更远意味着 “更不相关”。
现在我们已经将数据表示为向量,接下来会发生什么?
一旦数据以向量形式表示,通常会被输入到预先训练的机器学习模型中,该模型将这些向量映射到新的向量空间,以便相似对象(文本、图像或数据点)的向量在向量中显得彼此接近。新的向量空间。 这个过程称为嵌入,你猜对了,生成的一组新向量也称为嵌入。
一旦我们有了一组新的向量(每个向量代表我们的一个数据点),其中与相似数据对应的向量彼此接近,就会发生令人惊奇的事情。
那么有什么大不了的呢?
随着向量搜索的发布,你现在可以使用简单的运算符 HNSW 对存储在 Elasticsearch 中的向量执行相似性搜索,而无需设置完全不同的并行基础设施来执行向量搜索。
应用团队立即开始看到以下好处:
- 简化的应用程序架构和设计
- 更快的应用程序发布周期
- 降低基础设施成本
- 降低维护费用
- 更快实现价值
能够使用最新的人工智能技术(例如 LLMs 和生成式人工智能)快速增强用户体验的应用程序团队更有可能在竞争中领先。
更多关于如何使用 Elasticsearch 进行向量搜索的知识,请阅读 AI文章专栏。
向量搜索用例
- 语义搜索:根据搜索查询的含义和文档内容的含义来搜索文档。 与传统的文本搜索方法相比,语义搜索是一种从数据库或搜索引擎检索信息的更先进的方法。 传统文本搜索依赖于关键字匹配和精确单词匹配,而语义搜索旨在理解用户查询和搜索内容背后的上下文、意图和含义。请参阅文章 “Elasticsearch:如何部署 NLP:文本嵌入和向量搜索”。
- 反向图像搜索:查找 “看起来像” 给定图像的图像 - 例如 谷歌图片搜索。请参阅文章 “Elasticsearch:如何在 Elastic 中实现图片相似度搜索”。
- 推荐引擎:根据以前的视图推荐社交媒体帖子(Instagram 中的 Think Image 推荐、Twitter 上的推文推荐、Facebook Feed 或 Youtube 中推荐的故事等)
- 抄袭检测:根据文档与数据库中文档的匹配程度来检测抄袭。