Amazon OpenSearch 服务一直以来都支持词法和语义搜索,其成功得益于使用了knearest neighbors (kNN) 插件。通过将 OpenSearch 服务用作向量数据库,用户能够无缝地结合词法搜索和向量搜索的优势。OpenSearch 服务 29 中引入的神经搜索功能进一步简化了与人工智能 (AI) 和机器学习 (ML) 模型的整合,从而促进语义搜索的实现。
词法搜索使用 TF/IDF 或 BM25 算法,几十年来一直是搜索系统的主力。这些传统算法通过在文档中匹配用户查询的确切单词或短语来进行搜索。词法搜索适合精确匹配,延迟低且结果可解释性高,并且在多个领域具有良好的推广性。然而,该方法未考虑上下文或单词的含义,可能导致不相关的结果。
近年来,基于向量嵌入的语义搜索方法日益受到欢迎,以增强搜索效果。语义搜索能够更好地理解用户的自然语言查询,提供更具上下文意识的搜索。然而,基于向量嵌入的语义搜索需要针对相关领域 (如医疗或零售) 对 ML 模型进行微调,并且相较于基本的词法搜索需要更多的内存资源。
词法搜索和语义搜索各有其优缺点。将二者结合的混合搜索,通过两者的最佳特性提升搜索结果的质量。OpenSearch 服务 211 现已支持开箱即用的混合查询功能,使得实现融合词法搜索和语义搜索的混合搜索模型变得简单。
本文将阐述混合搜索的内部原理以及如何使用 OpenSearch 服务构建混合搜索解决方案。我们将通过样本查询进行实验,探索并比较词法、语义和混合搜索。所有在本文中使用的代码都可以在GitHub 仓库中找到。
一般而言,混合搜索结合词法和语义搜索包括以下步骤:
使用复合查询子句运行语义和词法搜索。每种查询类型提供不同跨度的分数。例如,Lucene 词法搜索查询的分数范围为 1 到无穷大,而使用 Faiss 引擎的语义查询则返回范围在 0 到 1 之间的分数。因此,您需要对来自每种查询类型的分数进行归一化,以便在合并分数之前将其置于相同的尺度。在分布式搜索引擎中,此归一化需要在全局水平完成,而非分片或节点级别。所有分数再次整理到相同尺度之后,便可对每个文档进行合并。根据新的综合分数重新排序文档,并将文档呈现为查询的响应。在 OpenSearch 服务 211 之前,搜索实践者需要使用复合查询类型来组合词法和语义搜索查询。然而,这种方法并没有解决第二步提到的分数全局归一化的挑战。
OpenSearch 服务 211 则通过在搜索管道中引入分数归一化处理器,增加了对混合查询的支持。搜索管道负责在不需要将结果组合到 OpenSearch 服务域以外的重担。搜索管道在 OpenSearch 服务域内运行,并支持三种类型的处理器:搜索请求处理器、搜索响应处理器和搜索阶段结果处理器。
在混合搜索中,搜索阶段结果处理器在协调节点 (全局) 级别运行于查询阶段和获取阶段之间。下图说明了此工作流程。
OpenSearch 服务中的混合搜索工作流包含以下阶段:
查询阶段 搜索请求的第一阶段是查询阶段,您索引中的每个分片会在本地运行搜索查询并返回与搜索请求匹配的文档 ID 及其相关性分数。分数归一化与组合 搜索阶段结果处理器在查询阶段和获取阶段之间运行。它使用归一化处理器来对来自 BM25 和 KNN 子查询的评分结果进行归一化。搜索处理器支持minmax和L2欧几里得距离归一化方法。该处理器组合所有分数,编译最终排名的文档 ID 列表,并将其传递到获取阶段。处理器支持算术平均数、几何平均数和调和平均数来组合分数。获取阶段 最终阶段是获取阶段,协调节点检索到符合最终排名列表的文档,并返回搜索查询结果。在本节中,您将构建一个网络应用程序,在一个样本的零售空间图像数据集上进行搜索,使用 OpenSearch 服务提供的混合搜索系统。假设该网络应用程序是一个零售商店,您作为消费者需要运行查询以搜索女性鞋子。
在进行混合搜索时,您将针对数据集中图像的文本标题结合使用词法和语义搜索查询。整体搜索应用程序的高层架构如以下图所示。
工作流包含以下步骤:
您使用Amazon SageMaker 笔记本从存储在Amazon Berkeley Objects 数据集中的图像标题和图像 URL 中索引数据到 OpenSearch 服务,使用OpenSearch 数据摄取管道。该数据集包含147702个带有多国语言元数据的产品列表和398212个独特的目录图像。出于演示目的,您仅使用大约1600个商品的图像和名称,且仅限于美国英语。OpenSearch 服务调用托管在 SageMaker 中的嵌入模型,为图像标题生成向量嵌入。您使用GPTJ6B变体嵌入模型,该模型生成4096维的向量。现在,您可以在托管在Amazon Elastic Compute Cloud (Amazon EC2) 实例 (c5large) 上的网络应用程序中输入搜索查询。应用程序客户端在 OpenSearch 服务中触发混合查询。OpenSearch 服务调用 SageMaker 嵌入模型为搜索查询生成向量嵌入。OpenSearch 服务运行混合查询,结合文档的语义搜索和词法搜索得分,并将搜索结果送回 EC2 应用程序客户端。让我们分别详细分析第1、2、4和5步。

在第一步中,您使用textembedding处理器在 OpenSearch 服务中创建数据摄取管道,以生成图像标题的向量嵌入。
定义kNN 索引后,您运行批量索引操作,将数据存储到 kNN 索引中。在该解决方案中,您仅对图像 URL、文本标题和标题嵌入进行索引,其中字段类型为kNN 向量。
在这些步骤中,OpenSearch 服务使用 SageMaker ML 连接器生成图像标题和查询的嵌入。上面的架构图中的蓝色框表示 OpenSearch 服务与 SageMaker 之间的集成,使用了ML 连接器功能。此功能自 OpenSearch 服务版本 29 起提供。它使您能够与其他 ML 服务 (如 SageMaker) 集成。
OpenSearch 服务使用搜索阶段结果处理器来执行混合搜索。对于混合打分,OpenSearch 服务使用在搜索管道的归一化处理器中设置的归一化、组合和权重配置选项。
在您部署解决方案之前,请确保您具备以下先决条件:
一个 AWS 帐户熟悉 Python 编程语言熟悉AWS 身份与访问管理 (IAM)、Amazon EC2、OpenSearch 服务和 SageMaker使用提供的AWS CloudFormation模板来部署您的资源。支持的 AWS 区域有 useast1、uswest2 和 euwest1。按照下列步骤启动堆栈:
在 AWS CloudFormation 控制台中创建一个新堆栈。对于模板来源,选择Amazon S3 URL。对于Amazon S3 URL,输入部署混合搜索模板的路径。选择下一步。给堆栈命名为hybridsearch。保留剩余设置为默认,选择提交。模板堆栈需要约 15 分钟进行部署。当完成后,堆栈状态将显示为CREATECOMPLETE。当堆栈完成后,导航到堆栈输出选项卡。选择SagemakerNotebookURL链接以在新选项卡中打开 SageMaker 笔记本。在 SageMaker 笔记本中,导航至AIsearchwithamazonopensearchservice/opensearchhybridsearch目录并打开HybridSearchipynb。如果笔记本提示设置内核,请从下拉菜单选择condapytorchp310内核,然后选择设置内核。笔记本应如下图所示。笔记本现在已经准备好使用,请按照笔记本中的分步说明进行操作。通过这些步骤,您将创建 OpenSearch SageMaker ML 连接器和 kNN 索引,将数据集摄取到 OpenSearch 服务域中,并在 Amazon EC2 上托管网络搜索应用程序。
网络应用程序现在已在您的帐户中部署,您可以使用 SageMaker 笔记本末尾生成的 URL 访问该应用程序。
复制生成的 URL 并在浏览器中输入以启动应用程序。
飞跃加速器官网入口按照以下步骤进行混合搜索:
使用搜索栏输入您的搜索查询。使用下拉菜单选择搜索类型。可用的选项为关键词搜索、向量搜索和混合搜索。选择GO以呈现查询结果,或根据新设置重新生成结果。使用左侧面板调整混合搜索配置:在语义搜索的权重下,调整滑块以选择语义子查询的权重。请注意,词法查询和语义查询的总权重应为 10。权重越接近 10,语义子查询的权重越大,设置的权重减去 10 将作为词法查询的权重。对于选择归一化类型,选择归一化技术 (minmax 或 L2)。对于选择分数组合类型,选择分数组合技术:算术平均、几何平均 或 调和平均。在本节中,您将进行四个实验,以了解每种搜索类型输出的差异。
作为这家零售商店的顾客,您正在寻找女性鞋子,但尚不确定想购买何种风格。您希望零售商店能够根据以下参数帮助您做出决定:
不偏离