データアナリティクス事業本部 機械学習チームの鈴木です。
re:Invent 2023で、Amazon RedshiftクエリエディタのAmazon Q generative SQLのプレビュー提供が発表されました。
生成系AIをSQLに応用したSQL生成機能で、Amazon Redshiftクエリエディタv2からチャットが利用ができます。接続したデータベースから抽出したいことを自然言語で問い合わせすることで、生成系AIからSQLクエリが生成される機能になります。
特にプレビューの利用に参加したい方向けに、使い方のイメージや必要になった設定についてご紹介します。
Amazon Q generative SQLについて
re:Invent 2023で発表された、Amazon Redshiftクエリエディタv2向けのSQL生成機能です。
Management Guideの中に、以下のガイドが用意されています。この記事でも触れますが、単にユーザーとしてAmazon Redshiftクエリエディタv2からチャットを利用する以外にも、管理者としてgenerative SQLの設定を変更する場合の事項についても記載されていますので、ご確認ください。
記事執筆時点で米国東部 (バージニア北部)、米国西部 (オレゴン) のリージョンでパブリックプレビュー中です。チャットの言語は英語となります。
以下のAWS News Blogにも使用例があるので合わせてご確認ください。
generative SQLを使用する準備
まずはチャットを利用するにあたっての前提事項を確認していきます。
1. Redshift Serverlessの準備
今回は新しいRedshift Serverlessのリソースをバージニア北部リージョンに作成しました。
作成には、『Amazon Redshift Serverlessでクロスアカウントのデータ共有を試してみました』などで使っているいつものCloudFormationテンプレートを使用しました。
この記事にも記載しますが、長いのでトグルメニューにして隠しておきます。
CloudFormationテンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: "Redshift Serverless and VPC"
Parameters:
Env:
Type: "String"
Default: "test"
ProjectName:
Type: "String"
CidrBlock:
Description: Please type the CidrBlock.
Type: String
Default: 192.168.0.0/22
BaseCapacity:
Type: Number
Default: 8
EnhancedVpcRouting:
Type: String
AllowedValues:
- true
- false
Default: false
PubliclyAccessible:
Type: String
AllowedValues:
- true
- false
Default: true
AdminUsername:
Type: String
Default: awsuser
AdminUserPassword:
Type: String
Description: Must be 8-64 characters long. Must contain at least one uppercase letter, one lowercase letter and one number. Can be any printable ASCII character except “/”, ““”, or “@”.
NoEcho: true
MinLength: 8
MaxLength: 64
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Sub ${CidrBlock}
EnableDnsSupport: True
EnableDnsHostnames: True
InstanceTenancy: default
Tags:
- Key: Name
Value: !Sub ${ProjectName}-redshiftserverless-${Env}-VPC
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Application
Value:
Ref: AWS::StackId
- Key: Network
Value: Public
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId:
Ref: VPC
InternetGatewayId:
Ref: InternetGateway
PublicRouteTable:
Type: AWS::EC2::RouteTable
DependsOn: AttachGateway
Properties:
VpcId:
Ref: VPC
Tags:
- Key: Name
Value: !Sub |
${ProjectName}-redshiftserverless-${Env}-public-rtb
- Key: Application
Value:
Ref: AWS::StackId
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId:
Ref: PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: InternetGateway
Subnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: VPC
AvailabilityZone: !Select [ 0, !GetAZs ]
CidrBlock: !Select [ 0, !Cidr [ !GetAtt VPC.CidrBlock, 4, 8 ]]
Subnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: VPC
AvailabilityZone: !Select [ 1, !GetAZs ]
CidrBlock: !Select [ 1, !Cidr [ !GetAtt VPC.CidrBlock, 4, 8 ]]
Subnet3:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: VPC
AvailabilityZone: !Select [ 2, !GetAZs ]
CidrBlock: !Select [ 2, !Cidr [ !GetAtt VPC.CidrBlock, 4, 8 ]]
Subnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: Subnet1
RouteTableId:
Ref: PublicRouteTable
Subnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: Subnet2
RouteTableId:
Ref: PublicRouteTable
Subnet3RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: Subnet3
RouteTableId:
Ref: PublicRouteTable
RedshiftServerlessSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId:
Ref: VPC
GroupDescription: Marker security group for Application server.
Tags:
- Key: Name
Value: !Sub |
${ProjectName}-redshiftserverless-${Env}-sg
RedshiftServerlessRole:
Type: "AWS::IAM::Role"
Properties:
Path: "/"
RoleName: !Sub "${ProjectName}-${Env}-redshift-role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- redshift.amazonaws.com
Action: sts:AssumeRole
MaxSessionDuration: 3600
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/AmazonAthenaFullAccess"
- "arn:aws:iam::aws:policy/AmazonS3FullAccess"
- "arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess"
- "arn:aws:iam::aws:policy/AmazonRedshiftAllCommandsFullAccess"
Description: "Allows Redshift clusters to call AWS services on your behalf."
Tags:
- Key: "Name"
Value: !Sub "${ProjectName}-redshiftserverless-${Env}-redshift-role"
RedshiftServerlessWorkGroup:
Type: AWS::RedshiftServerless::Workgroup
Properties:
WorkgroupName: !Sub "${ProjectName}-${Env}-redshift-wg"
BaseCapacity: !Ref BaseCapacity
EnhancedVpcRouting: !Ref EnhancedVpcRouting
NamespaceName: !Ref RedshiftServerlessNamespace
PubliclyAccessible: !Ref PubliclyAccessible
SecurityGroupIds:
- !Ref RedshiftServerlessSecurityGroup
SubnetIds:
- !Ref Subnet1
- !Ref Subnet2
- !Ref Subnet3
RedshiftServerlessNamespace:
Type: AWS::RedshiftServerless::Namespace
Properties:
NamespaceName: !Sub "${ProjectName}-${Env}-redshift-ns"
AdminUsername: !Ref AdminUsername
AdminUserPassword: !Ref AdminUserPassword
DbName: !Sub "${ProjectName}-db"
IamRoles:
- !GetAtt RedshiftServerlessRole.Arn
このテンプレートをCloudFormationからデプロイしました。
2. サンプルのデータベースの作成
作成されたRedshift Serverlessインスタンスに、Redshift query editor v2で、awsuserスーパーユーザーで接続し、tpchサンプルデータベースを作成しました。
以下のようにサンプルデータベースとサンプルのノートブックが作成されました。
上の画像で表示されているGenerative SQL
というボタンを押すとチャットインターフェースが現れるイメージです。チャットはノートブックが対象となるようでした。
3. Generative SQLの有効化
早速チャットをしてみたいところですが、Generative SQLを設定から有効化しておく必要がありました。
クエリエディタv2の左下にある歯車マークを押すと、Generative SQL settings
があるのでクリックしました。
以下のように設定のポップアップが出るので、Generative SQL
にチェックを入れてSave
を押しました。
この設定の後にGenerative SQL
を押すとチャットへの入力ができるようになりました。
ちなみに有効化しないままGenerative SQL
を押すと、このように有効化を促す表示がされました。
SQLを生成してみる
準備ができたので、実際にSQLを生成して使い心地を確認してみました。
1. 単純な集約
まずは一つのテーブルで完結するものを試してみました。
以下のように入力してみました。
Which mktsegments are top 5 in customer table of tpch?
以下のようにSQLが生成されました。Add to notebook
を押すとノートブックにこのSQLが追加されました。
ここまでで特にデータベースになんのテーブルがあってという情報は与えていません。クエリエディタの接続でどのデータベースかを指定する必要はありますが、そのデータベース内であれば自動で認識してくれるようでした。
ノートブックで実行すると一発で欲しいものが得られました。
2. テーブルの結合が必要なもの
もう少し難しいものもチャレンジしてみようということで、以下の質問もしてみました。
How many nations in each region?
以下のように結合を使ったクエリが生成されました。
こちらもエラーなく実行できました。すごい。
感想
分析したいことをチャットで指示すると、それに対応したSQLを生成してくれました。
複雑な質問ではないため生成されたSQLもそこまで難しいものではなかったので、実際独自のデータで開発環境などで検証して頂くのが良さそうですが、少なくともこのレベルの質問であれば一発でエラーのないSQLを生成でき、期待通りの結果が得られました。
ETL用や複雑なアドホック分析用のクエリを生成してもらう場合、チャットで依頼する内容も複雑になるため、多少の手直しが必要になると思います。この場合、Add to notebook
を押すとノートブックにすぐコピーできるため、とても使いやすいと思います。
開発のときには、仕様が既に自然言語のテキストで決まっていたり、頭の中で思いついた分析ロジックがあったりすることが多いですが、SQLで表現するためにはどうしてももう一息頑張ってロジックをSQLに変換する必要があります。このような場合に、SQLを使った分析に慣れている方であっても、想定しているものをGenerative SQLが書き出してくれたり、思っているものに近いSQLを出してくれて手直しすれば完成したりすると、とても作業が効率化され、嬉しい機能だと思います。
もちろん、この機能によりSQLに慣れていない方でもテキストからSQLを作って分析できるもの大きなポイントですね。
最後に
re:Invent 2023でアナウンスされた、プレビュー提供のAmazon Redshiftクエリエディタv2向けのAmazon Q generative SQLのご紹介でした。
参考になりましたら幸いです。