了解语义搜索

已完成

让我们了解语义搜索的基础知识:

  • 它与标准词法搜索有何不同。
  • 什么是矢量嵌入?
  • 矢量数据库有什么用途?

标准词法搜索或关键字搜索通过匹配字符查询文档。 例如,查询“light”与文本“明亮的光”匹配,因为字符 light 出现在文档中。

词汇搜索可以通过模糊匹配进行扩充:例如,查询“lights”仍可能与文本“bright light”或拼写错误的 lihgts 相匹配(缺少 s, 或交换了 gh)。 尽管模糊匹配和其他技术(如词干提取)非常有用,但此方法必须与同义词或语义上相似的语言匹配:不同的措辞、俚语、技术词汇等。要通过词汇搜索提供最相关的搜索结果,作者需要在元数据或文本本身中嵌入关键字,这可能是一种尴尬的用户体验。

输入 语义搜索。 语义搜索不使用字符相似性。 而是使用单词和短语中概念的数字表示形式。 这些数字表示形式称为嵌入向量或只是嵌入。

如果两个嵌入在数字上相似,则它们在语义上也相似。 这种相似性比测试关键字重叠更为普遍,因为它对精确关键字选择或措辞不太敏感。

要执行语义搜索,请先生成查询的嵌入矢量。 然后,将该向量与矢量数据库进行比较。 与查询嵌入最接近的嵌入属于与查询最语义相似的文档。

大多数关系数据库用例不涉及存储 n 维向量并计算它们之间的数值距离。 高效的语义搜索需要 矢量数据库 功能。

一张图表展示了文档和查询通过 OpenAI 嵌入 API 转化为嵌入向量的过程。然后,使用余弦距离来比较这些向量。

嵌入

嵌入是语义的数字表示形式。 嵌入表示为 n 维向量: n 个数字数组。 每个维度表示由嵌入模型确定的一些语义质量。

显示“lorem ipsum”输入文本被发送到 Azure OpenAI 嵌入 API 后生成一个数字矢量数组的图示。

如果两个嵌入向量指向相似的方向,它们表示类似的概念,比如“明亮”和“阳光”。如果它们指向相反的方向,则代表相反的概念,比如“悲伤”和“快乐”。嵌入模型的结构和训练数据决定了哪些内容被视为相似或不同。

嵌入可以应用于文本和任何类型的数据,例如图像或音频。 关键部分是将数据转换为基于某些模型或函数的 n 维嵌入向量。 嵌入代理的数字相似性表示其相应数据的语义相似性。

n-维向量v1v2的数字相似性由其点积给出,写为v1·v2。 若要计算点乘积,请将每个维度的值相乘,然后对结果求和:

dot_product(v1, v2) = SUM(
 v1[0] * v2[0],
 v1[1] * v2[1],
 ...,
 v1[n-1] * v2[n-1],
 v1[n] * v2[n]
)

由于嵌入是单位向量(长度为 1 的向量),因此点积等于矢量的余弦相似性,其值在-1(完全相反的方向)到1(完全相同的方向)之间。 具有余弦相似性为零的向量是正交的:语义上无关。

可以通过使用主体组件分析(PCA)将它们投影到三维空间来可视化 n 维空间。 PCA 是减少矢量维度的标准技术。 结果是 n 维空间的简化但直观投影。 以此方式呈现文档嵌入内容将会显示更相似的文档分组在群集中,而差异更大的文档则距离较远。

鉴于这些定义,针对文档嵌入集合执行查询的语义搜索在数学上非常简单:

  1. 使用语言模型生成查询嵌入。
  2. 根据每个文档预先计算的嵌入获取查询嵌入的点积。
  3. 对点积进行排序,数值范围为从 -1 到 1。
  4. 最相关的(语义上相似的)文档的分数最高,最不相关的(语义上不同)文档的分数最低。

虽然从数学上简单,但这不是关系数据库中的简单查询或高性能查询。 若要存储和处理此类矢量相似性查询,请使用 向量数据库

矢量数据库

矢量数据库优化多维向量(例如嵌入)的存储和计算。 具体而言,矢量数据库提供快速准确的点积计算来执行矢量相似性查询。

矢量相似性搜索有多个用例:

  • 查找类似于查询图像嵌入的图像
  • 在语义上查找类似于查询文本的文档
  • 查找具有类似特征和评分的产品以用于推荐系统

语义搜索会查询矢量数据库,以获取查询嵌入与每个存储的嵌入的相似度。 然后,应用程序可以提取与嵌入对应的数据。

有许多本机矢量数据库和数据库扩展可供选择。 以下 Azure 服务可帮助你满足矢量数据库需求: