人工智能最新阶段的关键发现之一是能够基于相似性搜索来搜索和查找文档。相似性搜索是一种根据信息的含义而不是通过关键字来比较信息的方法。
相似性搜索也称为语义搜索。语义一词是指 “特定上下文中单词、短语或符号的含义或解释”。语义搜索开启了各种可能性,无论是研究人员从大学图书管中查找特定信息,还是让开发人员在查询 API 文档时获取精确信息。
语义搜索的精妙之处在于,我们可以将整个文档和文本页面转换为其含义的表示。
本文旨在介绍语义搜索的基本原理及其背后的基本数学知识。有了深刻的理解,你就可以利用这项新技术为用户提供非常有用的工具。
Vectors
你可能还记得高中或大学时向量的概念。它们在物理学中经常使用。在物理学中,向量被定义为大小加上方向。例如,汽车以 50 公里/小时的速度向北行驶。
向量可以用图形表示:
Vector
向量在人工智能中具有不同的含义,我们很快就会谈到。我将向你介绍如何从物理学中的向量转变为人工智能中的向量。
回到我们的图形表示,如果我们将其绘制在图表中,我们可以表示二维向量。
Vector in 2-dimensions
向量的末端可以由其在 x 轴和 y 轴上的值表示。这个向量可以用点[4, 3]来表示。
有了这一点,我们就可以用三角学来计算它的大小和方向。
如果我们创建一个 3 维向量,我们需要三个值来表示空间中的向量。
Vector in three dimensions
该向量由点 [2, 3, 5] 表示。我们再次可以应用三角学来计算幅度和方向。
我们可以对 2 维或 3 维向量执行的有趣计算之一是确定向量之间的相似性。
Vector similarity
利用三角法,我们可以确定哪些向量最相似,哪些向量最不相似。
人工智能中的向量
需要注意的是,向量可以用数值数组来表示。在三维空间中,一个向量可以用三个点 [1, 3, 4] 来描述。
在人工智能领域,我们使用数组来表示一组数据中的不同信息。例如,如果我们使用机器学习来预测房价,我们可以用数组来表示所有信息。
让我们来看一个非常简单的例子,我们只有三个数据点来表示每栋房子。数组的每个元素将代表房屋的不同特征。比如:
价格:多少钱(美元)。
卧室数量:整数值。
大小: 多少平方数。
之后,就可以这样表示房子:
[300000, 3, 400]
使用我们的 3 维住房数据,我们现在可以创建一个算法来创建住房推荐引擎。这是由数据数组表示的三个房子:
House 1: [300000, 3, 400]
House 2: [320000, 3, 410]
House 3: [900000, 4, 630]
将这三个房子绘制成三维图,我们得到下图。
Houses plotted in three dimensions
如果用户想要找到与房屋 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 向量简化为二维,它可能看起来像这样。
Cat and Dog vectors
我们可以采用第三个单词“Kitten”,创建向量嵌入并将其表示在这个二维空间中。
小猫向量:[-0.05196425、-0.11119605、1.0417968、-1.25673929、0.74538768、-1.71105376、-0.20586438、...]
Cat, Dog and Kitten vectors
假设我们有一系列关于喂养猫和狗的文章,我们的用户提出以下问题:
我该如何喂养我的小猫?
通过使用相似性搜索,人工智能确定小猫在语义上更接近猫而不是狗,因此返回有关如何喂养猫的文章。
这就是相似性/语义搜索的根本基础。通过将文本转换为向量嵌入,我们有一种方法来确定与其他信息的语义相似性。
另一个例子可能是获取图书馆书籍的摘要并将其转换为向量嵌入。下图显示了按类型分类的书籍。您会发现这些书往往会分成几组。
Visual representation of book vector embeddings
如果用户正在寻找与《沙丘》类似的书籍的推荐,它会看到《沙丘》聚集在“科幻小说”类型中,并返回诸如“2001:太空漫游”之类的推荐。
创建 Vector Embeddings
向量嵌入是由专门的人工智能模型创建的。 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 即可创建向量嵌入。
存储 Vector Embeddings
向量嵌入可以存储在任何类型的数据存储中。我在早期测试期间使用了 CSV 文件。
然而,过去几年开始出现了专门的向量数据库。它们与传统数据库的不同之处在于它们针对处理向量进行了优化。这些数据库提供了有效计算这些高维向量之间相似性的机制。
让我们看看向量数据库的模式是什么样的。假设我们正在运营一家金融科技公司,可以访问数千份财务报表,我们希望能够使用人工智能来查询这些文档。
Vector database rows
该向量数据库具有三个字段:
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。
Cosine similarity of two vectors
主要结论是相似性得分越接近 1,向量就越相似。向量数据库提供了执行余弦相似度的函数,你可以在其中设置参数,例如,要返回的结果数。例如,你可能想要三个最接近的结果。
执行相似性搜索
执行相似性搜索需要几个步骤。
将源文档转换为向量嵌入并将其存储在向量数据库中。
Storing source documents as vectors
在此过程中,每个源文档都会被输入到嵌入人工智能中,由人工智能创建向量嵌入。然后,这些向量嵌入连同对原始源文档的引用一起保存在向量数据库中。
对于图书馆来说,这可能是过去 100 年的报纸文章的集合。
将查询转换为向量并使用余弦相似度来查找与查询最相似的文档。
Convert query to vector and use cosine similarity search
在此过程中,用户查询本身被转换为向量。该向量用作向量数据库中的搜索向量,以查找最能回答查询的文档。
对于我们的图书馆来说,查询可能是“我正在寻找一篇有关 1950 年 Chinchaga 火灾的报纸文章”。
该查询本身被转换为向量并传递到向量数据库,该数据库使用其相似性搜索来查找与查询含义最相似的报纸文章。我们可能希望返回最上面的结果。
向量数据库将返回文章的名称和实际源文本的 URL。
将查询连同源文档一起发送给 LLM 以验证请求。
查询与原始源文本一起发送到大型语言模型以处理针对文档的查询。使用的 LLM 可以是 Claude、OpenAI、Gemini 或任何开源模型,例如 Llama 或 Mistral。
在我们的库示例中,它将检查源文档是否确实包含有关 Chinchaga 火灾的信息。如果是这样,将向用户提供源文档的 URL。
知识检索
整个过程称为知识检索或检索增强生成(RAG)。
想象一下,您正在使用信用卡支付提供商的 API。你不必苦苦搜寻 API 文档,而只需问 “处理付款的 API 是什么?”。
人工智能将使用相似性搜索来查找正确的文档,并将您的问题和文档发送给 LLM。它将根据源文件中的信息提供问题的答案。
之后,你还可以进一步查询并说 “我如何在 Ruby 中进行此 API 调用?” 或者使用 JavaScript、Python、C++ 等语言。LLM 应该能够根据 API 源文档生成代码。
知识检索是一种非常强大的手段,可以提高用户访问并获得其预期问题的答案的能力,而无需花费时间查看错误的信息。
知识检索可以以多种方式使用。它可用于查找整篇文章并将其返回给用户。它可以在大量文档源中找到非常具体的信息。它可以用于推荐。知识检索的用例取决于你的想象力。
知识检索服务
许多平台开始发布知识检索服务,这消除了流程的复杂性和开发工作。
例如,AWS 有他们的 Amazon Q 服务。 Amazon Q 有效地提供了一个点击界面来为其提供源文档,并且它将为你构建知识服务。 Amazon Q 的美妙之处在于,你可以给它实际的文档,将它们存储在 S3 中,或者给它一个 URL,它会为您抓取整个网站。您还可以让它自动同步数据,以便在亚马逊内选择对文档的更改。
随着我们的进步,我们将开始看到大量的此类服务。
您可能有非常具体的用例,您需要从头开始对知识检索进行编码。在这种情况下,您将需要使用以下工具:
Embeddings AI
向量数据库
唯一的限制就是你的开发技能和想象力。
总结
我相信,知识检索和相似性搜索是企业成功实施人工智能的切入点。过去,关键字搜索实际上对所有网站都是强制性的,但我们很快就会看到知识检索是最低标准。当我尝试处理没有知识搜索的 API 文档时,我已经感到沮丧。