使用 Transformers 和 Amazon OpenSearch Service 为表格列构建语义搜索引擎

使用 Transformers 和 Amazon OpenSearch Service 为表格列构建语义搜索引擎

源节点: 1986937

在a中查找相似的列 数据湖 在数据清理和注释、模式匹配、数据发现和跨多个数据源的分析方面有重要的应用。 无法准确地查找和分析来自不同来源的数据对于从数据科学家、医学研究人员、学者到金融和政府分析师的每个人来说都是一个潜在的效率杀手。

传统的解决方案涉及词法关键字搜索或正则表达式匹配,它们容易受到数据质量问题的影响,例如缺少列名或跨不同数据集的不同列命名约定(例如, zip_code, zcode, postalcode).

在本文中,我们演示了一种基于列名、列内容或两者来搜索相似列的解决方案。 该解决方案使用 近似最近邻算法 可用 亚马逊开放搜索服务 搜索语义相似的列。 为了便于搜索,我们使用来自 句子转换库 in 亚马逊SageMaker. 最后,为了与我们的解决方案进行交互并可视化结果,我们构建了一个交互式 流光 网络应用程序运行于 AWS 法门.

我们包括一个 代码教程 供您部署资源以在示例数据或您自己的数据上运行解决方案。

解决方案概述

以下架构图说明了用于查找语义相似列的两阶段工作流。 第一阶段运行一个 AWS步骤功能 从表格列创建嵌入并构建 OpenSearch 服务搜索索引的工作流。 第二阶段,或在线推理阶段,通过 Fargate 运行 Streamlit 应用程序。 Web 应用程序收集输入搜索查询并从 OpenSearch 服务索引中检索与查询近似的 k 最相似列。

解决方案架构

图 1. 解决方案架构

自动化工作流程按以下步骤进行:

  1. 用户将表格数据集上传到 亚马逊简单存储服务 (Amazon S3) 桶,调用一个 AWS Lambda 启动 Step Functions 工作流的函数。
  2. 工作流程始于 AWS胶水 将 CSV 文件转换成的作业 阿帕奇木地板 数据格式。
  3. SageMaker 处理作业使用预训练模型或自定义列嵌入模型为每个列创建嵌入。 SageMaker 处理作业在 Amazon S3 中保存每个表的列嵌入。
  4. Lambda 函数创建 OpenSearch 服务域和集群来索引在上一步中生成的列嵌入。
  5. 最后,使用 Fargate 部署交互式 Streamlit Web 应用程序。 Web 应用程序为用户提供了一个界面,用于输入查询以在 OpenSearch 服务域中搜索类似的列。

您可以从下载代码教程 GitHub上 在示例数据或您自己的数据上尝试此解决方案。 有关如何部署本教程所需资源的说明,请访问 Github上.

先决条件

要实施此解决方案,您需要具备以下条件:

  • An AWS账户.
  • 基本熟悉 AWS 服务,例如 AWS云开发套件 (AWS CDK)、Lambda、OpenSearch 服务和 SageMaker 处理。
  • 用于创建搜索索引的表格数据集。 您可以自带表格数据或下载示例数据集 GitHub上.

建立搜索索引

第一阶段建立列搜索引擎索引。 下图说明了运行此阶段的 Step Functions 工作流。

步骤函数工作流

图 2 – 阶跃函数工作流程 – 多个嵌入模型

数据集

在这篇文章中,我们构建了一个搜索索引,以包含来自超过 400 个表格数据集的 25 多列。 数据集来源于以下公共资源:

有关索引中包含的表的完整列表,请参阅代码教程 GitHub上.

您可以使用自己的表格数据集来扩充示例数据或构建自己的搜索索引。 我们包含两个 Lambda 函数,它们启动 Step Functions 工作流,分别为单个 CSV 文件或一批 CSV 文件构建搜索索引。

将 CSV 转换为 Parquet

使用 AWS Glue 将原始 CSV 文件转换为 Parquet 数据格式。 Parquet 是大数据分析中首选的面向列的格式文件格式,可提供高效的压缩和编码。 在我们的实验中,与原始 CSV 文件相比,Parquet 数据格式显着减少了存储大小。 我们还使用 Parquet 作为通用数据格式来转换其他数据格式(例如 JSON 和 NDJSON),因为它支持高级嵌套数据结构。

创建表格列嵌入

为了提取本文示例表格数据集中各个表列的嵌入,我们使用以下预训练模型 sentence-transformers 图书馆。 有关其他型号,请参阅 预训练模型.

SageMaker 处理作业运行 create_embeddings.py() 对于单个模型。 为了从多个模型中提取嵌入,工作流运行并行 SageMaker 处理作业,如 Step Functions 工作流所示。 我们使用该模型创建两组嵌入:

  • 列名嵌入 – 列名(标题)的嵌入
  • 列内容嵌入 – 列中所有行的平均嵌入

有关列嵌入过程的更多信息,请参阅上的代码教程 GitHub上.

SageMaker 处理步骤的替代方法是创建 SageMaker 批量转换以获取大型数据集上的列嵌入。 这需要将模型部署到 SageMaker 端点。 有关详细信息,请参阅 使用批量转换.

使用 OpenSearch 服务的索引嵌入

在此阶段的最后一步,Lambda 函数将列嵌入添加到 OpenSearch 服务近似 k-Nearest-Neighbor (kNN) 搜索索引. 每个模型都分配有自己的搜索索引。 有关近似 kNN 搜索索引参数的详细信息,请参阅 神经网络.

使用 Web 应用程序进行在线推理和语义搜索

工作流的第二阶段运行 流光 Web 应用程序,您可以在其中提供输入并搜索在 OpenSearch 服务中索引的语义相似的列。 应用层使用了 应用程序负载均衡器、Fargate 和 Lambda。 应用程序基础架构作为解决方案的一部分自动部署。

该应用程序允许您提供输入并搜索语义相似的列名、列内容或两者。 此外,您可以选择要从搜索中返回的嵌入模型和最近邻居的数量。 应用程序接收输入,将输入嵌入指定模型,并使用 OpenSearch 服务中的 kNN 搜索 搜索索引列嵌入并找到与给定输入最相似的列。 显示的搜索结果包括表名、列名和已识别列的相似性分数,以及数据在 Amazon S3 中的位置以供进一步探索。

下图显示了 Web 应用程序的示例。 在这个例子中,我们在我们的数据湖中搜索了具有相似的列 Column Names (载荷类型),以 district (有效载荷). 使用的应用程序 all-MiniLM-L6-v2 作为 嵌入模型 然后返回 10 (k) 来自我们的 OpenSearch 服务索引的最近邻居。

申请被退回 transit_district, city, boroughlocation 作为基于 OpenSearch 服务中索引的数据的四个最相似的列。 此示例演示了搜索方法识别跨数据集的语义相似列的能力。

网络应用程序用户界面

图 3:Web 应用程序用户界面

清理

要删除本教程中由 AWS CDK 创建的资源,请运行以下命令:

cdk destroy --all

结论

在这篇文章中,我们介绍了为表格列构建语义搜索引擎的端到端工作流程。

今天开始使用您自己的数据,我们的代码教程位于 GitHub上. 如果您想帮助加速在您的产品和流程中使用 ML,请联系 亚马逊机器学习解决方案实验室.


作者简介

卡奇·奥多梅内 是 AWS AI 的应用科学家。 他构建 AI/ML 解决方案来为 AWS 客户解决业务问题。

泰勒麦克纳利 是亚马逊机器学习解决方案实验室的深度学习架构师。 他帮助各行各业的客户在 AWS 上利用 AI/ML 构建解决方案。 他喜欢喝杯好咖啡,喜欢户外活动,喜欢与家人和精力充沛的狗共度时光。

奥斯汀韦尔奇 是 Amazon ML 解决方案实验室的数据科学家。 他开发定制的深度学习模型来帮助 AWS 公共部门客户加速他们的 AI 和云采用。 在业余时间,他喜欢阅读、旅游和柔术。

时间戳记:

更多来自 AWS 大数据