Loading...
作者:Jose Navarro Sebastian Bustillo Prashanth Ganapathy 和 Uchenna Egbe日期:2024年4月8日标签:高级,Amazon Redshift,Amazon SageMaker JumpStart,分析
随着生成式人工智能AI解决方案的广泛应用,组织正在试图利用这些技术提升团队的生产力。一个令人兴奋的应用案例就是通过自然语言与关系型数据库进行交互。用户无需书写复杂的 SQL 查询,只需用简单的自然语言描述所需的数据进行检索或操作。大型语言模型LLM能够理解自然语言输入的意图及数据结构,并自动生成适当的 SQL 代码。这样,分析师可以更高效地工作,无需切换到严格的查询语法,同时也能让技术水平较低的用户使用关系型数据库。
在这篇文章中,我们将向您展示如何设置和部署一个解决方案,以自然语言与您的数据库进行对话,允许用户在无需编写任何代码或 SQL 查询的情况下获得数据洞察。
想象一下,Michelle 是一名业务分析师,负责通过对数据仓库进行复杂的 SQL 查询来准备每周的销售报告。过去,这一手动过程需要花费 23 小时与分析团队手动编写这些查询。现在,借助文本到 SQL 的生成性 AI,Michelle 只需用英语描述所需的报告,例如:“显示上周在西部地区鞋子的总收入,以子类别分组。” AI 助手自动生成所需的 SQL 查询,在几秒钟内执行并返回格式化报告。
通过消除 SQL 烦恼,Michelle 每周节省了数小时,能够将时间花费在更有影响力的分析上,而不是编写查询。像 Michelle 这样的其他业务用户也能够通过这种对关系数据的对话式访问获得类似的生产力提升。生成式 AI 工具本质上将自助分析的愿景变为现实,使业务团队能够将 SQL 工作交给机器来完成。
本实现中使用了 Mixtral 8x7B MoE。Mixtral 8x7B 是由 Mistral AI 发布的最先进的稀疏专家混合MoE基础模型,支持文本摘要、分类、文本生成和代码生成等多种用例。它是一种 8x 模型,具有八个不同的参数组,共约 450 亿个参数,并支持 32000 个 tokens 的上下文长度。MoE 是一种神经网络架构,由多个“专家”组成,其中每个专家都是一个神经网络。在 Transformer 模型中,MoE 用稀疏 MoE 层替换某些前馈层。热门点是,这些层中的路由网络选择哪个专家在每一层处理每个 token。与传统的 LLM 相比,Mixtral 8x7B 提供了更快的解码速度,虽然参数量更大,但速度与较小的参数密集模型相当。它在某些基准测试中还优于其他公开访问的模型,并支持更长的上下文长度。
现在可以通过单击在 Amazon SageMaker JumpStart 上部署 Mixtral 8x7B。Amazon SageMaker JumpStart 提供了一种简化的方式来访问和部署 100 多种不同的开源和第三方基础模型。用户无需手动集成、优化和配置每个基础模型,SageMaker JumpStart 会为您处理这些复杂任务。只需几次单击,您就可以使用优化容器和 SageMaker 端点部署 Hugging Face、Cohere、AI21 Labs、Stability AI 等公司的最先进模型。SageMaker JumpStart 消除了基础模型部署中的繁重工作,您可以快速使用一个庞大的预构建模型目录,用于推理。这是一种可扩展、经济高效的方式,在没有机器学习ML专业知识的情况下实施强大的 AI 解决方案。
以下是解决方案架构图:
从高层次来看,整体解决方案由三个核心组件组成:
结构化数据源 可以是任何关系型数据源,例如 Amazon Relational Database ServiceAmazon RDS、Amazon Aurora、Amazon Athena,或 Snowflake。它包含要查询的商业数据。语言模型 这个大型语言模型LLM具备理解源数据库的数据架构和将自然语言问题NQL映射到相应 SQL 查询的能力。协调后端 代码脚本可以在多种环境中运行,例如 Amazon SageMaker Studio 笔记本、AWS Lambda 函数、Amazon Elastic Compute CloudAmazon EC2,或 Amazon Elastic Container ServiceAmazon ECS。另外,您还可以选择添加协调服务,比如 AWS Step Functions。端到端的流程如下:
用户提出自然语言问题,该问题会传递给在 SageMaker 中托管的 Mixtral 8x7B 指令模型。LLM 分析该问题,并利用从连接的 Amazon Redshift 数据库获取的架构生成 SQL 查询。SQL 查询在数据库中运行。如出现错误,则会启动重试工作流。返回的表格结果会再次传递给 LLM,以解释并将其转换为用户原始问题的自然语言响应。要启动一个在 SageMaker JumpStart 上托管 Mixtral 8x7B 的端点,您可能需要请求服务配额增加,以便访问 mlg548xlarge 实例使用端点。您可以通过 AWS 管理控制台、AWS 命令行界面AWS CLI或 API 来 请求服务配额增加,以允许访问这些额外的资源。
为此示例进行演示,您还需要访问一个关系型数据源。本帖中使用 Amazon Redshift 作为主要数据源,并使用 TICKIT 数据库。该数据库帮助分析师跟踪虚构的 TICKIT 网站的销售活动,用户可以在该网站上在线购买和出售体育赛事、表演和音乐会的门票。具体而言,分析师可以识别门票在时间上的变动、卖家的成功率以及最畅销的事件、场地和季节。您也可以尝试其他 AWS 数据源,例如 Amazon RDS、Athena 或自己的关系数据库。确保掌握数据源的连接信息,如数据库 URL、用户名和密码。
为了通过 Amazon Redshift 进行演示,您首先需要设置一个 Redshift 集群,如果您还没有,可以使用 Amazon Redshift 控制台或 AWS CLI 启动带有所需节点类型和节点数量的集群。当集群可用后,在其中创建一个新的数据库和表格,以保存您的样本关系数据。您可以从 Amazon Simple Storage ServiceAmazon S3加载数据或直接插入行。当将数据存储在 Amazon S3 时,确保所有公共访问被阻止,并且数据在静态和传输过程中都是加密的。有关更多信息,请参考 Amazon S3 的安全最佳实践。最后,请确保记下集群的端点、数据库名称和连接所需的凭证。配置并加载数据的 Redshift 集群将是为自然语言访问做好准备的理想关系后端。
要测试您是否成功向 Redshift 集群添加数据,请完成以下步骤:
在 Amazon Redshift 控制台中,在导航窗格中选择 Clusters。选择您想要查询的集群。导航到 Query Editor 选项卡,打开查询编辑器。运行以下示例查询或编写自己的 SQL 查询:查找特定日期的总销售额:
sql SELECT sum(qtysold) FROM sales date WHERE salesdateid = datedateid AND caldate = 20080105
查找前 10 位买家:
sql SELECT firstname lastname totalquantity FROM (SELECT buyerid sum(qtysold) totalquantity FROM sales GROUP BY buyerid ORDER BY totalquantity desc limit 10) Q users WHERE Qbuyerid = userid ORDER BY Qtotalquantity desc
查询编辑器允许保存、调度和共享查询。您还可以查看查询计划、检查运行详细信息和监控查询性能。
代码中包含多个函数,这些函数通过解决方案图中显示的逻辑进行调用。以下是与解决方案图相匹配的相关代码块。您可以在 GitHub 仓库 中查看完整的解决方案代码。
要实现这一解决方案,请完成以下步骤:
设置一个 Redshift 集群。对于这篇博文,我们使用 RA3 类型集群。将 TICKIT 销售数据集加载到 Redshift 集群中。详细说明请参见 从 Amazon S3 加载数据到 Amazon Redshift。为了确保 Amazon Redshift 访问是私密且仅限于您的 VPC,请参考 为不同 VPC 中的客户端应用程序启用对 Amazon Redshift 的私有访问 中的步骤。设置 SageMaker 域,确保它拥有与 Amazon Redshift 交互的适当权限。克隆 以下 GitHub 仓库 到 SageMaker Studio Classic。第一步是部署 Mixtral 8x7B 指令 SageMaker 端点。我们使用标准大小的 mlg548xlarge 实例。确保您有至少 1 个 mlg548xlarge 的端点使用服务配额。python # 注意:这需要一个 mlg548xlarge 实例。 modelid = huggingfacellmmixtral8x7binstruct from sagemakerjumpstartmodel import JumpStartModel model = JumpStartModel(modelid=modelid) predictor = modeldeploy(endpointname=MIXTRALENDPOINT)
极光加速免费设置与 Redshift 集群的连接。确保用您的 Redshift 标识符替换以下占位符。为了安全起见,您应使用 AWS Secrets Manager 保护凭证。有关指导,请参见 通过 AWS Secrets Manager 集成,无需人工干预即可存储 Amazon Redshift 管理凭证,从而增强安全态势python redshiftclient = boto3client(redshiftdata) CLUSTERIDENTIFIER = redshiftcluster1 DATABASE = dev DBUSER = awsuser
设置自然语言问题和模型的提示参数:python prompt = San Diego 在 2008 年售出门票数量最多的五位卖家的名字是什么?
params = { sqllen 700 texttoken 500 tables tables db schm temp 001 modelid mixtral prompt prompt }
Redshift 集群查询以生成相关的数据库架构和示例记录,如步骤 2 所示:
pythontimeress = redshiftqna(params)执行一个问答过程,根据用户的问题生成 SQL 查询。参数: params (dict) 一个包含表名、数据库名、提示等参数的字典。返回: tuple 一个包含响应、生成的 SQL 语句和查询输出的元组。sql1 = fSELECT tablecatalog tableschema tablename columnname ordinalposition isnullable datatype FROM informationschemacolumns WHERE tableschema={params[db]}sql2 = []for table in params[tables] sql2append(fSELECT from dev{params[db]}{table} LIMIT 3)sqls = [sql1] sql2
question = params[prompt]results = executequerywithpagination(sqls CLUSTERIDENTIFIER DATABASE DBUSER)
colnames = results[0]split(n)[0]observations = njoin(sorted(results[0]split(n)[1]))strip()params[schema] = f{colnames}n{observations}params[sample] = for examples in results[1] params[sample] = f{examples}nn
生成的 SQL 查询在 Redshift 集群中运行步骤 68:

pythonqs = queryllm(prompts 200)sqlpattern = recompile(r()() reDOTALL) sqlmatch = research(sqlpattern qs)qs = sqlmatchgroup(1) print(f第一次尝试 SQLn{qs})output qs = singleexecutequery(qs CLUSTERIDENTIFIER DATABASE DBUSER question) 在 Amazon Redshift 集群上执行单个 SQL 查询并处理结果。
参数: sqlquery (str) 要执行的 SQL 查询。 clusteridentifier (str) Redshift 集群的标识符。 database (str) 数据库名称。 dbuser (str) 用于验证与 Redshift 集群的用户凭证。 question (str) 与查询关联的描述性标签或问题。
返回: pandasDataFrame 包含 SQL 查询处理结果的 DataFrame。resultsets = []response = executequeryredshift(sqlquery clusteridentifier database dbuser)
由于 LLM 生成的 SQL 中可能会出现错误,因此我们有一个调试步骤,可以进行若干次迭代,要求 LLM 查看 Amazon Redshift 错误消息以及前一个上下文用户问题、DB 模式、表样本和生成的过去 SQL 查询,根据这些信息生成新的查询以解决该问题。我们通过提示工程和指令来引导模型,指导其提出不同的查询。新的查询将再一次在集群上运行。此过程在示例代码中配置为最多重复五次,或者直至查询成功运行。如果在指定的重试次数内查询未能成功运行,则将向用户返回失败消息。此步骤在图中以红色突出显示。
pythondef llmdebugger(question statement error params) 生成调试指导和 SQL 修正以应对 PostgreSQL 错