与 Amazon Q 生成式 SQL 交互 - Amazon Redshift

与 Amazon Q 生成式 SQL 交互

注意

只有以下 AWS 区域中支持 Amazon Q 生成式 SQL:

  • 美国东部(弗吉尼亚州北部)区域 (us-east-1)

  • 美国西部(俄勒冈州)区域 (us-west-2)

  • 亚太地区(孟买)区域 (ap-south-1)

  • 亚太地区(新加坡)区域 (ap-southeast-1)

  • 亚太地区(悉尼)区域 (ap-southeast-2)

  • 亚太地区(东京)区域 (ap-northeast-1)

  • 欧洲(法兰克福)区域 (eu-central-1)

  • 欧洲(巴黎)区域 (eu-west-3)

  • 欧洲地区(爱尔兰)区域 (eu-west-1)

您可以在 Amazon Redshift 查询编辑器 v2 中,与 Amazon Q 生成式 SQL 功能进行交互。这是一个编码助手,可以根据您的提示和数据库架构生成 SQL 语句。当您在查询编辑器 v2 中撰写笔记本时,可以使用这个编码助手。生成的 SQL 用于笔记本所连接的数据库。

在与 Amazon Q 生成式 SQL 交互时,请提出具体问题,在有复杂请求时进行迭代,并验证答案的准确性。

在以自然语言提供分析请求时,请尽可能具体,以便编码助手准确了解您的需求。正确的做法不是询问“查找门票销量最高的前几个场馆”,而是要提供更多详细信息,例如“查找 2008 年门票销量最高的前三个场馆的名称/ID”。如果您知道数据库中对象的名称,请使用一致且具体的名称。例如,使用数据库中定义的架构、表和列名称,而不是以不同的方式引用同一对象,这会让助手不明所以。

将复杂的请求拆分为多个简单的语句,便于助手解释。反复提出跟进问题,让助手提供更详细的分析。例如,首先问“哪个州的场馆最多?” 然后根据回答,问“这个州最受欢迎的场馆是哪个?”。

在运行生成的 SQL 之前,请对其进行检查,以确保准确性。如果生成的 SQL 查询存在错误或与您的意图不符,请向助手提供如何更正查询的说明,而不是以不同的措辞来重述整个请求。例如,如果查询中缺少关于年份的谓词从句,请询问“提供 2008 年的场馆”。

将运行生成的 SQL 时收到的错误文本作为提示提交回 Amazon Q 生成式 SQL。它能从这些错误中学习,从而生成更好的 SQL。

将您的架构添加到 SQL 搜索路径中,以表示应使用该架构。例如,当数据在 tickit 架构而非公共架构中时,添加 tickit 架构。

set search_path to '$user', tickit;

与 Amazon Q 生成式 SQL 交互时的注意事项

使用聊天面板时,请注意以下几点。

  • 账户的查询编辑器 v2 管理员必须已在生成式 SQL 设置页面中开启聊天功能。

  • 要使用 Amazon Q 生成式 SQL,除了在查询编辑器 v2 的 AWS 托管策略中指定的其它权限外,还需要在 IAM 策略中指定 sqlworkbench:GetQSqlRecommendations 权限。有关 AWS 托管策略的更多信息,请参阅访问查询编辑器 v2

  • 您必须使用英语撰写问题。

  • 问题必须与集群或工作组中连接的数据库有关。为避免空状态错误,数据库中应至少有一个表和一些数据。

  • 您的问题必须与所连接数据库中存储的数据有关。它不能引用外部架构。有关所支持架构的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的创建架构

  • 如果在任何问题中会导致 SQL 更改所连接数据库,就可能产生警告。

  • 生成式人工智能技术是一项全新的技术,其回复中可能会出现错误,有时将这种错误称为幻觉。在您的环境或工作负载中使用代码之前,请对所有代码进行测试并检查是否存在错误和漏洞。

  • 您可以通过分享账户中其他用户运行的 SQL 查询来改进建议。账户管理员可以运行以下 SQL 命令来允许访问账户的查询历史记录。

    GRANT ROLE SYS:MONITOR to "IAMR:role-name"; GRANT ROLE SYS:MONITOR to "IAM:user-name"; GRANT ROLE SYS:MONITOR to "database-username";

    有关 SYS:MONITOR 的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的 Amazon Redshift 系统定义的角色

  • 您的数据是安全和私密的。数据不会跨账户共享。您的查询、数据和数据库架构不会用于训练生成式人工智能基础模型 (FM)。您的输入将用作 FM 的上下文提示,仅用于回答您的查询。

自定义上下文

查询编辑器 v2 管理员可以指定自定义上下文,以便根据环境定制生成的 SQL。自定义上下文提供领域知识和偏好设置,可对 SQL 生成进行精细控制。自定义上下文在 JSON 文件中定义,可由查询编辑器 v2 管理员上传到 Amazon Q 生成式 SQL。

用于为数据仓库个性化设置生成的 SQL 的 JSON 键如下。

所有表引用均需遵循三部分表示法 database.schema.table

资源

资源指定了应用自定义上下文的数据资产的范围或部分。

ResourceId

指定资源的唯一标识符。对于 Amazon Redshift 集群,请指定 cluster id。对于 Redshift Serverless 工作组,请指定 workgroup name

ResourceType

有效值:REDSHIFT_WAREHOUSE

TablesToInclude

指定生成 SQL 时要考虑的一组表。如果要将 SQL 查询的范围限制在已定义的可用表子集上,该字段至关重要。该字段可以减少不必要的表引用,有助于优化生成过程。您可以将该字段与 TablesToExclude 搭配使用,以便更精细地控制查询的生成。

TablesToExclude

指定从 SQL 生成中排除的表集。当某些表无关紧要或不应在查询生成过程中考虑时,请使用该字段。

TableAnnotations

提供有关所用表的元数据或补充信息。这些注释可包括表描述、使用说明或任何其它属性,以便于 Amazon Q 生成式 SQL 更好地理解表的上下文或结构。这对于通过增加表定义的清晰度来提高 SQL 生成的准确性非常有价值。

ColumnsToInclude

定义在生成 SQL 查询时包含指定表中的哪些列。该字段有助于 Amazon Q 生成式 SQL 将重点放在相关列上,并通过缩小数据检索范围来提高性能。该字段可确保 Amazon Q 生成式 SQL 只提取给定查询上下文所需的数据。

ColumnsToExclude

指定在生成 SQL 时不考虑的列。当某些列包含 Amazon Q 生成式 SQL 不应考虑的无关数据或冗余数据时,可以使用该字段。通过管理列的包含和排除,您可以优化结果并保持对检索到的数据的控制。

ColumnAnnotations

TableAnnotations 类似,该字段提供特定于各个列的元数据或注释。这些注释可以提供对列定义或特殊处理说明的深入了解。这些信息有助于指导 SQL 生成过程,并确保在查询中适当使用列。

CuratedQueries

一组预定义的问题和答案示例,其中问题是用自然语言(NLQ)编写的,答案是相应的 SQL 查询。这些示例有助于 Amazon Q 生成式 SQL 理解其预期生成的查询类型。它们是提高 Amazon Q 生成式 SQL 输出准确性和相关性的参考点。

CustomDocuments

为 Amazon Q 生成式 SQL 提供的附加信息或提示,如定义、特定领域知识或解释。例如,如果您的业务部门使用一种独特的方法来计算某个值,如“制造部门的总销售额为价格 * 收入”,则可以在此记录下来。这些文档通过提供额外的上下文,增强了 Amazon Q 生成式 SQL 解释自然语言输入的能力。

AdditionalTables

指定生成 SQL 时应考虑但不属于存储在数据仓库中的数据的任何其它表。这使得 Amazon Q 生成式 SQL 能够将外部数据来源整合到其 SQL 生成逻辑中,从而扩大其处理复杂数据环境的能力。

AppendToPrompt

为 Amazon Q 生成式 SQL 提供的附加说明或指南,用于指导 SQL 生成过程。这可以包括有关如何构造查询的具体指令、对某些 SQL 构造的偏好,或任何其它可提高 Amazon Q 生成式 SQL 输出质量的高级指令。

下面的自定义上下文示例向您展示了 JSON 文件的格式,并定义了以下内容:

  • 为集群 mycluster 的 Amazon Redshift 数据仓库定义自定义上下文。

  • 定义要包含和排除的特定表和列,以便于优化 SQL 生成过程。

  • 定义要包含的表和列的注释。

  • 定义供 Amazon Q 生成式 SQL 使用的精选查询示例。

  • 定义生成 SQL 时要使用的自定义文档和护栏。

  • 定义生成 SQL 时要使用的附加表 DDL。

{ "resources": [ { "ResourceId": "mycluster", "ResourceType": "REDSHIFT_WAREHOUSE", "TablesToInclude": [ "database.schema.table1", "database.schema.table2" ], "TablesToExclude": [ "database.schema.table3", "database.schema.table4" ], "ColumnsToInclude": { "database.schema.table1": [ "col1", "col2" ], "database.schema.table2": [ "col1", "col2" ] }, "ColumnsToExclude": { "database.schema.table5": [ "col1", "col2" ], "database.schema.table6": [ "col1", "col2" ] }, "TableAnnotations": { "database.schema.table1": "table1 refers to Q3 sales", "database.schema.table2": "table2 refers to Q4 sales" }, "ColumnAnnotations": { "database.schema.table1": { "col1": "col1 refers to Q3 sale total", "col2": "col2 refers to sale location" }, "database.schema.table2": { "col1": "col2 refers to Q4 sale total", "col2": "col2 refers to sale location" } }, "CuratedQueries": [ { "Question": "what is the sales data for Q3", "Answer": "SELECT * FROM table1" }, { "Question": "what is the sales data for Q4", "Answer": "SELECT * FROM table2" } ], "CustomDocuments": [ "in manufacturing division total sales is price * revenue", "in research division total sales is price * revenue" ], "AdditionalTables": { "database.schema.table8": "create table database.schema.table8(col1 int)", "database.schema.table9": "create table database.schema.table9(col1 int)" }, "AppendToPrompt": "Apply these guardrails: Queries should never return the secretId field of a user." } ] }