了解人工智能相似性搜索
理解相似性搜索(也称为语义搜索)的指南,这是人工智能最新阶段的关键发现之一。
目录
- 一、说明
- 二、向量
- 三、人工智能中的向量
- 四、将文本转换为向量
- 五、创建向量嵌入
- 六、存储向量嵌入
- 七、相似性搜索
- 八、执行相似性搜索
- 九、知识检索
- 十、知识检索即服务
- 十一、概括
一、说明
人工智能最新阶段的关键发现之一是能够基于相似性搜索来搜索和查找文档。相似性搜索是一种根据信息的含义而不是通过关键字来比较信息的方法。
相似性搜索也称为语义搜索。语义一词是指“特定上下文中单词、短语或符号的含义或解释”。通过语义搜索,用户可以提出这样的问题:“主角爬过 500 英尺的鸡粪的电影是什么?”人工智能将回应“肖申克的救赎”。通过关键字搜索来执行这种搜索是不可能的。
语义搜索开启了各种可能性,无论是研究人员试图从大学馆藏中查找特定信息,还是让开发人员在查询 API 文档时访问精确信息。
语义搜索的天才在于我们可以将整个文档和文本页面转换为其含义的表示。
本文的目的是提供语义搜索的基础知识及其背后的基础数学。通过深入了解,您可以利用这项新技术为用户提供非常有用的工具。
这项技术的关键是向量数学。
二、向量
您可能还记得高中或大学时向量的概念。它们在物理学中经常使用。在物理学中,矢量被定义为大小加上方向。例如,汽车以 50 公里/小时的速度向北行驶。
向量可以用图形表示:
向量
向量在人工智能中具有不同的含义,我们很快就会谈到。我将向您介绍如何从物理学中的向量转变为人工智能中的向量。
回到我们的图形表示,如果我们将其绘制在图表中,我们可以表示二维向量。
二维向量
向量的末端可以由其在 x 轴和 y 轴上的值表示。这个向量可以用点[4, 3]来表示。
有了这一点我们就可以用三角学来计算它的大小和方向。
如果我们创建一个 3 维向量,我们需要三个值来表示空间中的向量。
三维向量
该向量由点 [2, 3, 5] 表示。我们再次可以应用三角学来计算幅度和方向。
我们可以对 2 维或 3 维向量执行的有趣计算之一是确定向量之间的相似性。
在物理学中,我们需要执行的计算之一是向量相似度(这导致了人工智能相似度搜索)。例如,在材料科学的研究中,矢量可用于比较负载下材料内的应力或应变矢量。
在图中,如果我们有相似的应力矢量,我们可以看到材料上的应变方向相同。而相反的力会对材料施加特定的应力。
向量相似度
使用三角学,我们可以确定哪些向量最相似或最不相似。
三、人工智能中的向量
需要注意的是,向量可以用值数组来表示。对于三维向量,由三个点 [1, 3, 4] 描述。
在人工智能中,我们使用数组来表示一组数据中的不同信息。例如,如果我们使用机器学习来预测房价,我们可以用数组表示所有信息。
让我们看一个非常简单的例子,其中我们只有三个数据点来代表每栋房子。数组的每个元素都代表房子的不同特征。例如:
价格:一美元价值。
卧室数量:整数值。
尺寸:以平方英尺为单位测量。
假设的房子将表示为:
房屋:[300000, 3, 400]
使用我们的 3 维住房数据,我们现在可以创建一个算法来创建住房推荐引擎。这是由数据数组表示的三栋房屋:
1号屋:[300000, 3, 400]
2号楼:[320000, 3, 410]
3号楼:[900000, 4, 630]
将这三所房子绘制成三维图,我们得到下图。
房屋以三个维度绘制
如果用户想要找到与房屋 1 最相似的房屋,则可以快速确定房屋 2 是最相似的,并且推荐引擎可以将该房产的详细信息返回给用户。
在机器学习中,房屋数组被称为向量。向量之所以如此有趣,是因为物理向量中使用的数学同样适用于数字数组。因此,我们使用术语向量。
当向量包含三个以上数据点时,就无法可视化。房屋向量可以包含许多数据点,例如位置、质量得分、年龄、浴室数量等。完整的房屋向量可能如下所示:
[300000, 3, 400, 122.2, 83.4, 87, 43, 3]
这被称为高维向量。在这种情况下,维度是指数据的一个特征。价格是一个维度。尺寸是另一个维度,所以也是如此。高维向量不能在 3 维空间中表示,但是,相同的概念和数学适用。我们仍然可以通过查找最相似的高维向量来运行我们的推荐引擎。
四、将文本转换为向量
当我们开始将文本转换为向量时,事情开始变得真正有趣。现代人工智能的天才之处在于能够将单词、短语甚至文本页面转换为代表该信息含义的向量。
让我们从一个词开始:“猫”。
专门的人工智能模型可以将“猫”一词转化为向量。该向量代表了单词 cat 的含义,因为它与训练数据中的其他单词相关。这些专门的人工智能使用预先训练的模型,这些模型已经学会了如何将文本表示为高维向量。这些向量根据文本在训练数据中的使用情况来捕获文本之间的语义和关系。
将文本转换为向量称为向量嵌入。
“猫”可能由 300 维向量表示。
[ 0.49671415、-0.1382643、0.64768854、1.52302986、-0.23415337、-0.23413696、1.57921282、…]
另一方面,“狗”可以用向量表示:
[ 1.69052570, -0.46593737, 0.03282016, 0.40751628, -0.78892303, 0.00206557, -0.00089039, …]
如果我们将 Cat 和 Dog 向量简化为二维,它可能看起来像这样。
猫和狗矢量
我们可以采用第三个单词“Kitten”,创建向量嵌入并将其表示在这个二维空间中。
小猫向量:[-0.05196425、-0.11119605、1.0417968、-1.25673929、0.74538768、-1.71105376、-0.20586438、…]
猫、狗和小猫矢量
假设我们有一系列有关喂养猫和狗的文章,并且我们的用户提出以下问题:
我该如何喂养我的小猫?
通过使用相似性搜索,人工智能确定小猫在语义上更接近猫而不是狗,因此返回有关如何喂养猫的文章。
这就是相似性/语义搜索的根本基础。通过将文本转换为向量嵌入,我们有一种方法来确定与其他信息的语义相似性。
另一个例子可能是获取图书馆书籍的摘要并将其转换为向量嵌入。下图显示了按类型分类的书籍。您会发现这些书往往会分成几组。
书籍向量嵌入的视觉表示
如果用户正在寻找与《沙丘》类似的书籍的推荐,它会看到《沙丘》聚集在“科幻小说”类型中,并返回诸如“2001:太空漫游”之类的推荐。
五、创建向量嵌入
矢量嵌入是由专门的人工智能模型创建的。 OpenAI 有他们的text-embedding-ada-002模型。
通过简单的 API 调用,文本可以传递到模型,该模型将生成向量嵌入。 OpenAI 向量嵌入通常在 1500 到 3500 个元素之间,具体取决于所使用的具体模型。
有关使用 OpenAI 嵌入端点的信息,请查看:https://platform.openai.com/docs/guides/embeddings
Anthropic 及其 Claude 模型还提供 1024 个元素的向量嵌入:https://docs.anthropic.com/claude/docs/embeddings
从编程的角度来看,每个嵌入人工智能模型都会以数组的形式返回向量,这使得使用起来很容易。
只需调用 API 即可创建向量嵌入。
六、存储向量嵌入
向量嵌入可以存储在任何类型的数据存储中。我在早期测试期间使用了 CSV 文件(尽管绝对不推荐用于任何严肃的应用程序)。
然而,过去几年开始出现了专门的向量数据库。它们与传统数据库的不同之处在于它们针对处理向量进行了优化。这些数据库提供了有效计算这些高维向量之间相似性的机制。
让我们看看矢量数据库的架构是什么样的。假设我们正在运营一家金融科技公司,可以访问数千份财务报表,我们希望能够使用人工智能来查询这些文档。
矢量数据库行。
该矢量数据库具有三个字段:
doc_name:文档的名称。
doc_url:原始源文档的存储位置。
doc_vector:PDF文档的向量嵌入。
实际上每个主要的数据库管理系统都发布了矢量数据库的版本。
PostgreSQL:他们发布了一个扩展调用 pgvector https://www.postgresql.org/about/news/pgvector-050-released-2700/
Redis:矢量搜索
https://redis.io/solutions/vector-search/
MongoDB:Atlas矢量搜索
https://www.mongodb.com/products/platform/atlas-vector-search
Pinecone:专门的矢量数据库
https://www.pinecone.io/
矢量数据库的选择实际上取决于您的开发偏好。
七、相似性搜索
矢量数据库针对相似性搜索进行了优化。有几种不同的数学方法,最常见且最容易实现的是使用余弦相似度。
余弦相似度是一种三角度量,用于确定两个向量的相似程度。数学计算确定两个向量之间角度的余弦。小角度的余弦接近 1,90 度角的余弦为 0。非常相似的向量的余弦将接近 1。
两个向量的余弦相似度
没有必要涵盖计算余弦相似度的数学知识,除非您是像我一样的数学极客,在这种情况下,该视频很好地解释了它:https://www.youtube.com/watch ?v=e9U0QAFbfLI
主要结论是相似性得分越接近 1,向量就越相似。
矢量数据库提供了执行余弦相似度的函数,您可以在其中设置参数,例如要返回的结果数。例如,您可能想要三个最接近的结果。
八、执行相似性搜索
执行相似性搜索需要几个步骤。
- 将源文档转换为向量嵌入并将其存储在向量数据库中。
将源文档存储为向量
在此过程中,每个源文档都会被输入到嵌入人工智能中,由人工智能创建向量嵌入。然后,这些向量嵌入连同对原始源文档的引用一起保存在向量数据库中。
对于图书馆来说,这可能是过去 100 年的报纸文章的集合。
- 将查询转换为向量并使用余弦相似度来查找与查询最相似的文档。
将查询转换为向量并使用余弦相似度搜索
在此过程中,用户查询本身被转换为向量。该向量用作向量数据库中的搜索向量,以查找最能回答查询的文档。
对于我们的图书馆来说,查询可能是“我正在寻找一篇有关 1950 年 Chinchaga 火灾的报纸文章”。
该查询本身被转换为向量并传递到向量数据库,该数据库使用其相似性搜索来查找与查询含义最相似的报纸文章。我们可能希望返回最上面的结果。
矢量数据库将返回文章的名称和实际源文本的 URL。
- 将查询连同源文档一起发送给LLM以验证请求。
将查询和源文档发送给 LLM
这是拼图的最后一块。查询与原始源文本一起发送到大型语言模型以处理针对文档的查询。使用的 LLM 可以是 Claude、OpenAI、Gemini 或任何开源模型,例如 Llama 或 Mistral。
在我们的库示例中,它将检查源文档是否确实包含有关 Chinchaga 火灾的信息。如果是这样,将向用户提供源文档的 URL。
九、知识检索
整个过程称为知识检索或检索增强生成(RAG)。
想象一下,您正在使用信用卡支付提供商的 API。您不必苦苦搜寻 API 端点和文档,而只需问“处理付款的端点是什么?”。
人工智能将使用相似性搜索来查找正确的文档,并将您的问题和文档发送给法学硕士。法学硕士将根据源文件中的信息提供问题的答案。
然后,您可以进一步查询并说“我如何在 Ruby 中进行此 API 调用?”或者 JavaScript、Python、C++ 等。LLM 应该能够根据端点源文档生成代码。
知识检索是一种非常强大的手段,可以提高用户访问并获得其预期问题的答案的能力,而无需花费时间查看错误的信息。
知识检索可以以多种方式使用。它可用于查找整篇文章并将其返回给用户。它可以在大量文档源中找到非常具体的信息。它可以用于推荐。知识检索的用例取决于您的想象力。
十、知识检索即服务
许多平台开始发布知识检索服务,这消除了流程的复杂性和开发工作。
例如,AWS 有他们的 Amazon Q 服务。 Amazon Q 有效地提供了一个点击界面来为其提供源文档,并且它将为您构建知识服务。 Amazon Q 的美妙之处在于,您可以给它实际的文档,将它们存储在 S3 中,或者给它一个 URL,它会为您抓取整个网站。您还可以让它自动同步数据,以便在亚马逊内选择对文档的更改。
随着我们的进步,我们将开始看到大量的此类服务。
您可能有非常具体的用例,您需要从头开始对知识检索进行编码。在这种情况下,您将需要使用以下工具:
- 嵌入人工智能
- 矢量数据库
- 否则,你唯一的限制就是你的开发技能和想象力。
十一、概括
我相信,知识检索和相似性搜索是企业成功实施人工智能的切入点。过去,关键字搜索实际上对所有网站都是强制性的,但我们很快就会看到知识检索是最低标准。当我尝试处理没有知识搜索的 API 文档时,我已经感到沮丧。