自然言語からSQLのクエリ生成ができるAmazon Q generative SQLを触ってみた(プレビュー)
本日はコネヒトアドベントカレンダー4日目の記事です。
どうもこんにちは、sasashuuu です。最近はキャンプギアを見漁るのがマイブームです。
昨日は アルペンマウンテンズ 練馬関町店 に行き、さまざまなキャンプギアに囲まれながらひたすらにワクワクしていました...!
はじめに
生成 AI の勢いがすごい昨今ですよね。その1つとして、AWS から Amazon Q generative SQL という自然言語からクエリを生成できる機能が Amazon Redshift がプレビュー機能として公開されており、気になったので試してみました。
概要
Amazon Q generative SQL は Amazon Redshift Query Editor という AWS コンソールから利用できる SQL エディター内のプレビュー機能として提供されています。AWS が公式に発信しているアップデート情報やブログなどは下記です。(AWS re:Invent 2023 でも発表があったようですね)
- Amazon Redshift adds new AI capabilities, including Amazon Q, to boost efficiency and productivity
- Amazon Q generative SQL is now available in Amazon Redshift Query Editor (preview) で
前提
2023/12/02(土)時点で把握している限り下記の前提がありますのでご注意ください。
- Amazon Redshift の Query Editor でのみ利用可能
- Query Editor の Notebook でのみ利用可能
- 対応リージョンは米国東部 (バージニア北部)、米国西部 (オレゴン)
検証環境について
Amazon Redshift Serverless を使用しました。下記の手順を参考に検証環境を構築し、AWS が提供するサンプルデータを使用しました。※ここでは具体的な構築手順等は割愛します。
サンプルデータは sample_data_dev のデータベースから Notebook を開き、ticket のスキーマを使用しました。下記がサンプルデータのテーブル定義になります。
category テーブル
Field | Type | NL | CMP |
---|---|---|---|
catid | smallint | NN | none |
catgroup | character varying(10) | NULL | lzo |
catname | character varying(10) | NULL | lzo |
catdesc | character varying(50) | NULL | lzo |
date テーブル
Field | Type | NL | CMP |
---|---|---|---|
dateid | smallint | NN | none |
caldate | date | NN | az64 |
day | character(3) | NN | lzo |
week | smallint | NN | az64 |
month | character(5) | NN | lzo |
qtr | character(5) | NN | lzo |
year | smallint | NN | az64 |
holiday | boolean | NULL | none |
event テーブル
Field | Type | NL | CMP |
---|---|---|---|
eventid | integer | NN | az64 |
venueid | smallint | NN | az64 |
catid | smallint | NN | az64 |
dateid | smallint | NN | none |
eventname | character varying(200) | NULL | lzo |
starttime | timestamp without time zone | NULL | az64 |
listing テーブル
Field | Type | NL | CMP |
---|---|---|---|
listid | integer | NN | az64 |
sellerid | integer | NN | az64 |
eventid | integer | NN | az64 |
dateid | smallint | NN | none |
numtickets | smallint | NN | az64 |
priceperticket | numeric(8,2) | NULL | az64 |
totalprice | numeric(8,2) | NULL | az64 |
listtime | timestamp without time zone | NULL | az64 |
sales テーブル
Field | Type | NL | CMP |
---|---|---|---|
salesid | integer | NN | az64 |
listid | integer | NN | az64 |
sellerid | integer | NN | az64 |
buyerid | integer | NN | az64 |
eventid | integer | NN | az64 |
dateid | smallint | NN | none |
qtysold | smallint | NN | az64 |
pricepaid | numeric(8,2) | NULL | az64 |
commission | numeric(8,2) | NULL | az64 |
saletime | timestamp without time zone | NULL | az64 |
users テーブル
Field | Type | NL | CMP |
---|---|---|---|
userid | integer | NN | none |
username | character(8) | NULL | lzo |
firstname | character varying(30) | NULL | lzo |
lastname | character varying(30) | NULL | lzo |
city | character varying(30) | NULL | lzo |
state | character(2) | NULL | lzo |
character varying(100) | NULL | lzo | |
phone | character(14) | NULL | lzo |
likesports | boolean | NULL | none |
liketheatre | boolean | NULL | none |
likeconcerts | boolean | NULL | none |
likejazz | boolean | NULL | none |
likeclassical | boolean | NULL | none |
likeopera | boolean | NULL | none |
likerock | boolean | NULL | none |
likevegas | boolean | NULL | none |
likebroadway | boolean | NULL | none |
likemusicals | boolean | NULL | none |
venue テーブル
Field | Type | NL | CMP |
---|---|---|---|
venueid | smallint | NN | none |
venuename | character varying(100) | NULL | lzo |
venuecity | character varying(30) | NULL | lzo |
venuestate | character(2) | NULL | lzo |
venueseats | integer | NULL | az64 |
シードデータもいくらか入っていましたので、そのまま利用できそうです。
確認
SELECT * FROM "sample_data_dev"."tickit"."event";
結果
eventid venueid catid dateid eventname starttime
4410 7 9 1836 Linkin Park 2008-01-10 14:00:00
3044 245 7 1843 The Frogs 2008-01-17 15:00:00
2428 243 7 1854 The Frogs 2008-01-28 19:00:00
2360 238 7 1856 Macbeth 2008-01-30 19:30:00
8596 112 9 1859 Missy Higgins 2008-02-02 15:00:00
2911 231 7 1873 November 2008-02-16 19:30:00
1278 247 6 1889 High Society 2008-03-04 20:00:00
6583 123 9 1891 Black Eyed Peas 2008-03-06 19:00:00
8273 3 9 1896 Hootie and the Blowfish 2008-03-11 19:00:00
2176 235 7 1911 The Homecoming 2008-03-26 15:00:00
1577 260 6 1920 O - Cirque du Soleil 2008-04-04 20:00:00
5846 102 9 1922 Lionel Richie 2008-04-06 14:00:00
5010 100 9 1930 Journey 2008-04-14 15:00:00
748 234 6 1933 Hairspray 2008-04-17 14:00:00
2076 247 7 1933 The Caretaker 2008-04-17 19:00:00
3723 232 7 1942 Oedipus the King 2008-04-26 14:00:00
3755 207 7 1952 Rosencrantz and Guildenstern Are Dead 2008-05-01 14:00:00
8726 31 9 1960 Tegan and Sara 2008-05-01 19:30:00
553 220 6 1982 Grease 2008-06-05 14:00:00
2292 233 7 1984 All My Sons 2008-06-07 15:00:00
1852 226 7 1985 For Colored Girls Who Have Considered Suicide When the Rainbow is Enuf 2008-06-08 14:00:00
2783 230 7 1985 As You Like It 2008-06-08 15:00:00
6090 32 9 1987 Rolling Stones 2008-06-10 15:00:00
122 300 8 1991 Orfeo ed Euridice 2008-06-14 20:00:00
325 300 8 1993 Die Walkure 2008-06-16 19:30:00
238 300 8 2002 The Birds (Die Vogel) 2008-06-25 19:30:00
8013 128 9 2003 Paul McCartney 2008-06-26 19:00:00
7118 37 9 2005 Matchbox Twenty 2008-06-28 15:00:00
4714 115 9 2022 Paramore 2008-07-15 14:00:00
4312 69 9 2024 Aretha Franklin 2008-07-17 19:00:00
421 306 8 2026 Madama Butterfly 2008-07-19 14:30:00
8684 123 9 2033 Led Zeppelin 2008-07-26 19:30:00
5911 45 9 2035 Eric Clapton 2008-07-28 15:00:00
2198 212 7 2036 A Bronx Tale 2008-07-29 19:30:00
8584 23 9 2040 Kansas 2008-08-02 14:00:00
3041 229 7 2042 Cirque du Soleil 2008-08-04 15:00:00
4906 117 9 2042 Carrie Underwood 2008-08-04 19:30:00
3536 230 7 2052 All My Sons 2008-08-14 14:00:00
152 305 8 2058 The Birds (Die Vogel) 2008-08-20 19:00:00
7006 90 9 2061 Dolly Parton 2008-08-23 19:30:00
5184 78 9 2071 Joanna Newsom 2008-09-02 19:00:00
1501 256 6 2073 Beatles LOVE 2008-09-04 15:00:00
4843 39 9 2073 Chaka Khan 2008-09-04 19:00:00
7667 6 9 2077 Rod Stewart 2008-09-08 19:30:00
1559 252 6 2081 Spamalot 2008-09-12 15:00:00
2607 220 7 2084 The Farnsworth Invention 2008-09-15 19:00:00
4138 78 9 2087 Foo Fighters 2008-09-18 14:00:00
1921 240 7 2090 The Glass Menagerie 2008-09-21 14:00:00
5238 25 9 2099 Idina Menzel 2008-09-30 19:30:00
6642 67 9 2104 Linkin Park 2008-10-05 19:30:00
3774 240 7 2108 Electra 2008-10-09 14:30:00
5918 65 9 2111 Black Eyed Peas 2008-10-12 14:00:00
760 208 6 2114 Pal Joey 2008-10-15 19:30:00
1900 245 7 2114 Our Town 2008-10-15 19:00:00
2164 203 7 2115 The Seagull 2008-10-16 14:00:00
6956 103 9 2115 Dandy Warhols 2008-10-16 19:00:00
3635 213 7 2143 The Farnsworth Invention 2008-11-13 20:00:00
2812 243 7 2147 The Country Girl 2008-11-17 20:00:00
4885 114 9 2159 Vince Gill 2008-11-29 19:00:00
2671 210 7 2181 Passing Strange 2008-12-21 19:30:00
6046 118 9 2182 Sweet Honey in the Rock 2008-12-22 19:30:00
5109 19 9 2186 Michael Buble 2008-12-26 19:30:00
5627 13 9 2187 Crosby Stills Nash 2008-12-27 19:30:00
4267 112 9 1845 Conor Oberst 2008-01-19 19:30:00
8183 13 9 1846 James Taylor 2008-01-20 19:30:00
3441 223 7 1850 November 2008-01-24 14:00:00
5779 105 9 1854 Montgomery Gentry 2008-01-28 19:00:00
641 203 6 1855 Grease 2008-01-29 19:00:00
2640 249 7 1858 The Country Girl 2008-02-01 19:00:00
2754 213 7 1860 To Be or Not To Be 2008-02-03 15:00:00
935 228 6 1871 Curtains 2008-02-14 15:00:00
868 214 6 1881 Mamma Mia! 2008-02-24 19:00:00
302 304 8 1887 The Magic Flute 2008-03-02 15:00:00
5520 36 9 1895 Dave Matthews Band 2008-03-10 19:00:00
1254 238 6 1899 Hairspray 2008-03-14 19:30:00
7062 79 9 1899 Tony Bennett 2008-03-14 14:00:00
8104 93 9 1903 David Sanborn 2008-03-18 19:30:00
1058 221 6 1911 High School Musical 2008-03-26 20:00:00
7336 38 9 1945 .38 Special 2008-04-29 19:30:00
8068 103 9 1949 Eric Clapton 2008-05-01 15:00:00
5116 38 9 1960 Bootsy Collins 2008-05-01 19:30:00
4083 63 9 1965 N.E.R.D. 2008-05-01 14:30:00
5673 128 9 1973 Lollapalooza 2008-05-01 15:00:00
1164 230 6 1974 High Society 2008-05-01 19:00:00
4348 73 9 1978 Tina Turner 2008-06-01 14:00:00
5142 127 9 1979 Jonas Brothers 2008-06-02 15:00:00
3284 205 7 1991 The Cherry Orchard 2008-06-14 20:00:00
6268 6 9 1991 Natasha Bedingfield 2008-06-14 19:00:00
1783 263 6 1996 Legally Blonde 2008-06-19 14:00:00
7985 11 9 2006 Chris Botti 2008-06-29 14:00:00
2617 220 7 2008 Passing Strange 2008-07-01 20:00:00
2943 231 7 2009 To Be or Not To Be 2008-07-02 19:00:00
3503 205 7 2023 The Glass Menagerie 2008-07-16 14:00:00
8585 69 9 2028 Little River Band 2008-07-21 15:00:00
2305 236 7 2035 The Tempest 2008-07-28 14:30:00
6565 127 9 2037 Johnny Mathis 2008-07-30 19:00:00
3518 228 7 2041 Glengarry Glen Ross 2008-08-03 20:00:00
7539 4 9 2043 Seal 2008-08-05 19:00:00
4960 6 9 2046 Dave Matthews Band 2008-08-08 19:00:00
3695 214 7 2060 A Doll's House 2008-08-22 19:00:00
利用方法
タブ追加の「+」マークをクリックします。
Editor か Notebook を選択できるので Notebook を選びます。
Generative SQL をクリックします。
有効化のための初期設定を行います。(チェックボックスにチェックを入れ Save で OK)
以降、Generative SQL をクリックするたびにサイドバーにチャットが出現するので、こちらに取得したいデータに関する情報を自然言語で入力し、プロンプトエンジニアリングを行います。
あらかじめサンプルデータをざっと眺めたのち、試しに適当な要求を英語で入力しました。
実際の入力
Get event records for Linkin Park.
※日本語訳
リンキン・パークのイベントの記録を取得してください。
結果
SELECT
*
FROM
tickit.event
WHERE
LOWER(eventname) = LOWER('Linkin Park')
返ってきたクエリを見た感じ、 event テーブルを対象に、eventname が「Linkin Park」で絞り込まれたものがちゃんと返ってきていそうです。LOWER 関数による小文字変換なども考慮されています。
チャットの様子です。
このまま SQL をコピーして使用しても良いのですが、Notebook への追加もチャット内から行えるようでしたので、試してみます。
追加されました。
Run したところ、クエリ実行が成功し、正常にレコードが返ってきました。
eventid venueid catid dateid eventname starttime
7638 103 9 1855 Linkin Park 2008-01-29 15:00:00
4444 86 9 1990 Linkin Park 2008-06-13 20:00:00
7142 56 9 1871 Linkin Park 2008-02-14 14:00:00
3892 7 9 2002 Linkin Park 2008-06-25 14:30:00
6086 5 9 1889 Linkin Park 2008-03-04 14:00:00
4410 7 9 1836 Linkin Park 2008-01-10 14:00:00
6642 67 9 2104 Linkin Park 2008-10-05 19:30:00
5882 113 9 2087 Linkin Park 2008-09-18 19:00:00
7739 92 9 1983 Linkin Park 2008-06-06 14:00:00
6005 43 9 1928 Linkin Park 2008-04-12 14:00:00
いろいろなパターンでの検証
チャットにてさまざまなパターンでの入力を試し、生成される SQL を見てみます。
複雑な要求
実際の入力
Get ticket purchaser, event name, and venue records for Linkin Park events from 2008 to 2009.
※日本語訳
2008 年から 2009 年までの Linkin Park イベントのチケット購入者、イベント名、会場の記録を取得してください。
結果
SELECT
u.username,
e.eventname,
v.venuename
FROM
tickit.users u
JOIN tickit.sales s ON u.userid = s.buyerid
JOIN tickit.event e ON s.eventid = e.eventid
JOIN tickit.venue v ON e.venueid = v.venueid
WHERE
LOWER(e.eventname) LIKE LOWER('Linkin Park%')
AND EXTRACT(
YEAR
FROM
e.starttime
) BETWEEN 2008
AND 2009
SELECT されたカラムのデータは、チケット購入者・イベント名・会場の3つで、users テーブルをはじめとし、各種テーブルの id をもとに各種関連データが join されています。EXTRACT で timestamp が格納されている starttime カラムのデータから年のみが抽出され、BETWEEN による範囲指定も行われています。
日本語での要求
実際の入力
リンキンパークのイベント名のレコードを取得してください。
結果
SELECT
eventname
FROM
tickit.event
WHERE
LOWER(eventname) LIKE LOWER('Linkin Park%')
簡単な要求ですが、このレベルであれば日本語での入力も問題なさそうな印象です。
日本語で複雑な要求
前述した「複雑な要求」パターンの日本語訳をそのまま入れてみます。
実際の入力
2008 年から 2009 年までの Linkin Park イベントのチケット購入者、イベント名、会場の記録を取得してください。
結果
SELECT
e.eventname,
v.venuename,
u.username
FROM
tickit.event e
JOIN tickit.venue v ON e.venueid = v.venueid
JOIN tickit.sales s ON e.eventid = s.eventid
JOIN tickit.users u ON s.buyerid = u.userid
JOIN tickit.date d ON e.dateid = d.dateid
WHERE
LOWER(eventname) LIKE LOWER('Linkin Park%')
AND year BETWEEN 2008
AND 2009
さきほどの「複雑な要求」パターンの sql と比べてみましょう。
SELECT
u.username,
e.eventname,
v.venuename
FROM
tickit.users u
JOIN tickit.sales s ON u.userid = s.buyerid
JOIN tickit.event e ON s.eventid = e.eventid
JOIN tickit.venue v ON e.venueid = v.venueid
WHERE
LOWER(e.eventname) LIKE LOWER('Linkin Park%')
AND EXTRACT(
YEAR
FROM
e.starttime
) BETWEEN 2008
AND 2009
開催日時のデータに関して、date テーブルを join するようになっています。また、event テーブルの starttime カラムのデータを EXTRACT せず、date テーブルの year カラムのデータで範囲指定するようにもなっていますね。その他、大きな乖離などはなさそうです。
文脈を加味していると仮定した要求
チャットのやり取りの文脈を考慮して、メッセージが返されるかも試してみます。
こちらはチャットの画面を載せておきます。
先に投げたメッセージの文脈を加味し、同じテーブル・カラムを対象とした SQL が生成されています。
おわりに
今回は Amazon Redshift で Amazon Q generative SQL を触ってみました。
テーブルの定義を全て理解した上で、各テーブル・カラムの情報をもとにクエリを作成するという労力が減り、自然言語で「どのようなデータをどのように取得するか」などを入力することで自動で SQL が生成されるのは非常に大きな魅力を感じました。うまく利用できればエンジニアはもちろんのこと、データを活用したい非エンジニアの方々に取っても大きな武器になりそうです。今回はプレビュー版の利用でしたが、 GA になることを楽しみに待ちたいと思います!
Discussion