了解语义搜索

已完成

我们来回顾一下语义搜索的基础知识:

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

标准词汇搜索或关键字搜索通过匹配字符来查询文档。 例如,查询“light”与文本“bright light”匹配,因为文档中出现了 light

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

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

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

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

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

关系图显示了文档和查询通过 OpenAI 嵌入 API 变为嵌入矢量。然后,使用余弦距离对这些矢量进行比较。

嵌入

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

关系图显示了将要发送到 Azure OpenAI 嵌入 API,从而生成数字矢量数组的“lorem ipsum”输入文本。

如果两个嵌入矢量指向类似的方向,则它们表示相似的概念,如“bright”和“sunny”。如果它们彼此指向相反的方向,则表示相反的概念,如“sad”和“happy”。嵌入模型结构和训练数据确定了什么会被视为相似和不同。

嵌入可以应用于文本和任何类型的数据,例如图像或音频。 关键之处是基于一些模型或函数将数据转换为 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 服务可帮助你满足矢量数据库需求: