🤖

自然言語からSQLのクエリ生成ができるAmazon Q generative SQLを触ってみた(プレビュー)

2023/12/04に公開

本日はコネヒトアドベントカレンダー4日目の記事です。
https://adventar.org/calendars/8994

どうもこんにちは、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 でも発表があったようですね)

前提

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
email 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