作者:Nitin Eusebius、Arghya Banerjee 和 Randy DeFauw,发布日期:2024年1月4日,来源于 Amazon Bedrock
生成式 AI 在各个领域都展现了很大的潜力,包括文本生成、代码生成、摘要、翻译和聊天机器人。其中,利用自然语言处理NLP通过直观的 SQL 查询访问数据,是一项正在发展的应用。本文介绍了 Text2SQL 的概念、应用场景、挑战以及最佳实践,旨在帮助用户更便捷地查询数据库。
生成式 AIGenerative AI为人工智能领域带来了众多潜力,包含了文本生成、代码生成、摘要、翻译、聊天机器人等多种应用。在这些应用中,通过自然语言处理(NLP) 将访问信息的方式从复杂的技术代码转变为简单直观的 SQL 查询,正逐步成为一项重要趋势。这样一来,业务用户和数据分析师可以用自然语言提问,查询和获取数据洞察。Text2SQL 的主要目标是从自然语言文本自动生成 SQL 查询,经过结构化表示的文本输入,可以产生可用于访问数据库的 SQL 查询。
在本文中,我们将介绍 Text2SQL 并探讨其用例、挑战、设计模式及最佳实践,内容包括:
Text2SQL 的必要性Text2SQL 的关键组件自然语言或 Text2SQL 的提示工程考虑优化及最佳实践架构模式如今,大量数据存在于传统数据分析、数据仓库和数据库中,然而多数组织成员可能很难查询或理解这些数据。Text2SQL 的主要目标就是使数据库查询变得更容易,特别是对于非技术用户而言,用户可以用自然语言提出自己的查询。
利用 NLP SQL,业务用户可以通过键入或语音提问来分析数据并获得答案,例如:
“上个月每种产品的总销售额”“哪些产品产生了更多收入?”“各地区客户的百分比是多少?”Amazon Bedrock 是一项全托管服务,通过单一 API 提供多种高性能基础模型FMs,使得构建和扩展生成式 AI 应用程序变得更加容易。它可以用于生成与上述问题相似的 SQL 查询,并从组织的结构化数据中生成自然语言响应。
Text2SQL 系统涉及几个阶段,旨在将自然语言查询转换为可运行的 SQL:
组件描述自然语言处理分析用户输入的查询,提取关键元素和意图,转换为结构化格式SQL 生成将提取的细节映射到 SQL 语法,生成有效的 SQL 查询数据库查询在数据库中运行 AI 生成的 SQL 查询,检索结果并将其返回给用户大语言模型LLMs在生成代码方面表现出色,包括用于数据库的结构化查询语言SQL。这些 LLM 可以理解自然语言问题,并生成相应的 SQL 查询。随着更多数据的提供,LLMs 可以通过上下文学习和微调设置深化其能力。
以下图示展示了基础 Text2SQL 流程。
在使用 LLM 将自然语言翻译为 SQL 查询时,提示的设计至关重要。有效的 提示工程 是构建自然语言到 SQL 系统的关键。清晰、简洁的提示可以更好地指引语言模型。
提供用户请求 SQL 查询的上下文以及相关数据库架构细节,可以更准确地翻译意图。采用少量注释示例的提示即自然语言提示及对应的 SQL 查询,能帮助模型生成符合语法的输出。此外,集成检索增强生成RAG技术,模型在处理过程中能够检索相似示例,也能进一步提升映射准确性。设计良好的提示,能向模型提供足够的指引、上下文和示例,对可靠地将自然语言翻译成 SQL 查询至关重要。
以下是一个基线提示的示例,包括来自白皮书的数据库代码表示:Enhancing Fewshot TexttoSQL Capabilities of Large Language Models A Study on Prompt Design Strategies。
sql/ 给定以下数据库架构: /CREATE TABLE IF NOT EXISTS gymnast ( GymnastID int FloorExercisePoints real PommelHorsePoints real RingsPoints real VaultPoints real ParallelBarsPoints real HorizontalBarPoints real TotalPoints real PRIMARY KEY (GymnastID) FOREIGN KEY (GymnastID) REFERENCES people (PeopleID))CREATE TABLE IF NOT EXISTS people ( PeopleID int Name text Age real Height real Hometown text PRIMARY KEY (PeopleID))
/ 请回答:返回年龄最小的体操运动员的总分。 /SELECT t1TotalPoints FROM gymnast AS t1 JOIN people AS t2 ON t1GymnastID = t2PeopleID ORDER BY t2Age ASC LIMIT 1
这种基于提示的少量学习方法为模型提供了一小部分注释示例,以展示自然语言与 SQL 之间的映射关系。通常,提示会包含约 23 对自然语言查询和相应 SQL 声明。这些示例帮助模型在不需要大量训练数据的情况下,从自然语言中生成符合语法的 SQL 查询。
在构建自然语言到 SQL 系统时,细致调优模型是否是适当技术或有效的提示工程是否更为合适,常常成为争论的焦点。两者都可以依据合适的需求考虑采用:
细致调优 基线模型在大型通用文本语料库上预训练,然后通过 基于指令的微调 来提升模型在文本SQL 上的表现,适应目标任务。细致调优直接在最终任务上训练模型,但需要许多文本SQL 示例。可以基于 LLM 进行有监督的细致调优,以提升文本到 SQL 的有效性,并使用如 Spider、WikiSQL、CHASE、BIRDSQL 或者 CoSQL 等多个数据集。
提示工程 模型被训练以完成旨在提示目标 SQL 语法的提示。使用 LLM 从自然语言生成 SQL 时,提供清晰的提示指令对于控制模型输出至关重要。在提示中标注不同的组件,如指向字段、架构,再指示要创建的 SQL 类型。这些提示像是指令,告诉模型如何格式化 SQL 输出。以下是一个示例提示,其中指向表字段并指示创建 MySQL 查询:
sqlTable offices columns = [OfficeId OfficeName]Table employees columns = [OfficeId EmployeeId EmployeeName]Create a MySQL query for all employees in the Machine Learning Department
一个有效的文本到 SQL 模型的构建方式是先从没有任何任务特定细致调优的基线 LLM 开始。在接下来的过程中,使用精心设计的提示来调整和引导基础模型,以适应文本到 SQL 的映射。这种提示工程使您能够开发该功能,而无需进行细致调优。如果基线模型的提示工程没有达到所需准确度,则可以探索对小规模文本SQL 示例进行细致调优,同时继续进行进一步的提示工程。

如果单纯的提示工程未能满足要求,细致调优与提示工程的结合可能是必需的。然而,最佳的方法是首先尝试不进行细致调优的提示工程,因为这可以在不需要收集数据的情况下快速迭代。如果这未能提供足够的性能,细致调优和提示工程的结合是可行的下一步。这种综合方法在最大化效率的同时,允许在仅依赖提示的方法不足时进行定制。
优化和最佳实践对于提高效率、确保资源的最佳使用及获得期望结果至关重要。这些技术帮助改善性能、控制成本并达成更优质的成果。
在利用 LLM 开发 Text2SQL 系统时,以下是一些关键的优化领域:
优化策略描述缓存为改善延迟、控制成本和标准化,可以缓存从文本到 SQL LLM 中解析的 SQL 和识别的查询提示,避免重复查询的再处理。监控应收集关于查询解析、提示识别、SQL 生成和 SQL 结果的日志和指标,以监控 Text2SQL LLM 系统,更新提示或重新微调时提供可见性。物化视图与表物化视图可以简化 SQL 生成并提高常用 Text2SQL 查询的性能,直接查询表可能导致复杂的 SQL 以及性能问题。刷新数据物化视图需要按计划刷新,以保持 Text2SQL 查询中的数据更新。可以使用批量或增量刷新方法以平衡开销。集中数据目录创建集中数据目录提供组织数据源的全景视图,有助于 LLM 选择适当的表和架构,提供更准确的响应。通过集中数据目录生成的矢量嵌入可以与 LLM 一同提供,以生成相关且精确的 SQL 响应。通过应用最佳实践,如缓存、监控、物化视图、计划刷新和建立集中目录,您可以显著提高使用 LLM 的 Text2SQL 系统的性能与效率。
下面让我们看看可实现的文本到 SQL 工作流架构模式。
以下图示展示了使用提示工程生成 SQL 查询的架构。
在此模式中,用户创建基于提示的少量学习,提供模型的注释示例,包括表和架构细节以及一些示例查询与结果。LLM 使用提供的提示返回 AI 生成的 SQL,然后进行验证并在数据库中运行以获取结果。这是开始使用提示工程的最直接模式。您可以使用 Amazon Bedrock,它是一个全托管服务,通过单一 API 提供多种高性能基础模型,帮助构建包含安全性、隐私和负责任 AI 的生成式 AI 应用程序,或者使用 JumpStart 基础模型,为内容写作、代码生成、问答、文案撰写、摘要、分类、信息检索等用例提供先进的基础模型。
以下图示展示了使用提示工程和细致调优生成 SQL 查询的架构。
小熊加速器永久免费此流与前一种模式相似,主要依赖提示工程,但增加了在领域特定数据集上细致调优的流程。细致调优后的 LLM 用于生成 SQL 查询,其上下文值很小。您可以使用 SageMaker JumpStart 对领域特定数据集进行细致调优,这与在 Amazon SageMaker 上训练和部署任何模型的方法相同。
以下图示展示了使用提示工程和 RAG 生成 SQL 查询的架构。
在此模式中,我们使用 检索增强生成 和矢量嵌入存储,如 Amazon Titan Embeddings 或 Cohere Embed,从组织的中央数据目录如 AWS Glue 数据目录,获取数据库信息。矢量嵌入存储在矢量数据库中,如 Amazon OpenSearch Serverless 的矢量引擎、Amazon RDS 的 PostgreSQL带 pgvector 扩展或 Amazon Kendra。LLM 使用矢量嵌入在创建 SQL 查询时,更快速地选择适合的数据库、表和表中的字段。当数据和需要由 LLM 检索的相关信息存储在多个独立的数据库系统中时,使用 RAG 有助于 LLM 能够搜索或查询来自所有不同系统的数据。由此,通过将集中或统一数据目录的矢量嵌入提供给 LLM,便能提高返回信息的准确性和全面性。
在本文中,我们讨论了如何利用自然语言生成 SQL,从企业数据中创造价值。我们探讨了关键组件、优化和最佳实践,还学习了从基本提示工程到细致调优和 RAG 的架构模式。欲了解更多信息,请参考 Amazon Bedrock,以轻松构建和扩展生成 AI 应用程序并利用基础模型。
Randy DeFauw 是 AWS 的高级首席解决方案架构师,拥有密歇根大学的电子工程硕士学位,曾研究自动驾驶车辆的计算机视觉。他还持有科罗拉多州立大学的 MBA,担任过软件工程、产品管理等多种技术岗位。他于 2013 年进入大数据领域,继续探索这一领域,并积极参与机器学习项目,曾在多个会议上发言,包括 Strata 和 GlueCon。
Nitin Eusebius 是 AWS 的高级企业解决方案架构师,拥有软件工程、企业架构和 AI/ML 方面的丰富经验。他极具热情地探索生成式 AI 的可能性,致力于帮助客户在 AWS 平台上构建架构良好的应用程序,并解决技术挑战,助力客户的云之旅。
Arghya Banerjee 是 AWS 的高级解决方案架构师,专注于帮助客户采用和使用 AWS 云,居住在旧金山湾区,主要关注大数据、数据湖、流处理、批分析以及 AI/ML 服务和技术。
使用 Oracle 企业管理器监控 Amazon RDS for Oracle 实例主要收获在本文中,我们介绍了如何通过 Oracle 企业管理器OEM监控 Amazon RDS for Oracle 实例。以下是要点:在安装 OEM Agent 之前,确保满足相关前提条件和网络配置。通过添加 OE...
在 AWS RoboMaker 上使用公共容器映像协调 NVIDIA Isaac Sim 和 ROS 2 导航主要观点此文提供了一个教程,教会如何在 AWS RoboMaker 上协调使用 NVIDIA Isaac Sim 和 ROS 2 导航,以进行高保真机器人模拟。这不仅可以帮助开发人员快速搭建...