MySQL HeatWaveで自然言語でSQLを実行する

目次

はじめに

先月リリースされた MySQL HeatWave 9.4.1 で、自然言語でSQLを生成して実行する機能が実装されました。

MySQL HeatWave GenAI now lets you generate SQL queries from natural-language statements using the new NL_SQL routine, making it easier for you to interact with databases. This feature collects information on the schemas, tables, and columns that you have access to, and then uses a Large Language Model (LLM) to generate an SQL query for the question pertaining to your data. It also lets you run the generated query and view the result set.

今回は、この機能を触って確認した内容を公開しようと思います。

なお、過去にデータベースとAIを組み合わせた検証記事も公開してますので、興味がある方は、ご一読下さい。

検証インスタンス

  • Oracle Cloud / MySQL HeatWave Version 9.4.1(大阪リージョン)

要件確認

MySQL HeatWaveのGenAI機能にプラスして、この機能を使用するにあたり、デフォルトで使用されるLLMは、 meta.llama-3.3-70b-instruct となりますが、このLLMを使用する場合には、Generative AI Service との連携が必要になる為、以下のリファレンスの「Before You Begin」をご確認下さい。

検証

以前、検証に使用したオープンソースのECサイト構築パッケージ EC-CUBE バージョン4.3のデータがあった為、そちらのデータを使用して検証していきます。

この機能を使用するには、 sys.NL_SQL() プロシージャをCALLします。
まずは、以下のように実行してみます。

第3引数で、対象のスキーマと、使用するモデルIDを指定しています。
現時点で、指定可能なモデルIDは、以下のみとなります。

  • meta.llama-3.3-70b-instruct
  • llama3.2-3b-instruct-v1
  • llama3.1-8b-instruct-v1

実行結果は以下のようになりました。

dtb_product テーブルの name 列の値を正しく認識して、結果が返されています。
特にテーブルやカラムにコメントがない状態でも、判別できているので、かなり期待できそうです。

ちなみに、デフォルトでは実行されたSQLも返されますが、こちらは、第3引数のオプションに、 'verbose',0 を追加することで、生成されたSQLの表示を抑制し、結果の一覧だけを返すことができます。

続いて、第2引数の output にどのようなデータが返されてるか見てみます。

マニュアル に書かれている通り、以下の内容が返されていることが分かります。

出力項目 内容
tables,schemas SQLの生成する為に考慮されたテーブルとデータベースのリスト
model_id 使用したモデルID
sql_query 生成されたSQL
is_sql_valid 生成されたSQLが有効化かどうか(0:無効 / 1:有効)

商品名 = dtb_product.name という判別が自動でできていた為、別途、products テーブルが存在した場合にどうなるのかを見てみたいと思います。

以下のようなテーブルとデータを作って確認してみます。

それでは、同じ質問をしてみましょう。

結果は、新しく追加した products テーブルが参照されるようになりました。

こういった似たようなリソース名が複数存在した場合にどれを参照すればいいかLLMで判断できないようなケースもあるかと思います。

その場合の対応の1つとして、引数で参照するテーブルを指定する方法があります。
先程の schemas オプションを tables オプションに変更して以下のように実行することで、dtb_product を参照するようになりました。

但し、この方法では、質問内容に沿った情報がどこにあるのかを実行者が把握しておく必要があります。
また、質問内容に応じて実行パラメータを変更するのは実用的ではありません。

この問題には、テーブルやカラムにコメントを付与して判別するというよくある機能が、MySQL HeatWave にも実装されているので、これを利用してみます。

まずは、products テーブルに「商品情報」ではなく、「商品カテゴリ情報」というコメントを付与してみました。

しかし、これだけでは、products テーブルに商品名の情報があると判断されているようです。

では、dtb_product テーブルに「商品情報」のコメントを追加してみました。

テーブルにコメント追加後に、もう1度実行してみると、想定通り dtb_product テーブルを参照してくれました。

次は、単一テーブルでなく、複数テーブルを参照するような質問をしてみましょう。

商品名だけでなく、その商品の価格も返すようにしてみます。
EC-CUBE4.3では、商品の価格の情報は、dtb_product ではなく、商品の規格ごとに dtb_product_class テーブルに保存されています。

以下のように質問を変えて実行します。

結果は残念ながら、products テーブルを参照してしまいました。
商品情報と価格情報と見受けられるカラム名が products テーブルには存在するからでしょうか?

そこで、実行する引数で dtb_productdtb_product_class テーブルを指定すると、 dtb_product_class.price01 の値を返してくれました。

ですが、EC-CUBEの画面上に表示される価格は、dtb_product_class.price02 なので、この情報を返すように、実行時にテーブル名を指定するのではなく、コメント情報から判別させてみます。

テーブルとカラムにコメントを追加します。

質問内容の「値段」を「販売価格」に変更して実行すると、想定通り dtb_product_class.price02 の値が返されました。

今度は「一番売れている商品って何?」っていう質問には、注文商品 dtb_order_item テーブルから注文数の最も多い商品を返してくれました。

商品名で GROUP BY されているのを ID でした方がいいかな?とかいうのはあるのですが、追加でコメント付与はしない中で、それなりに妥当な情報を抽出しているように思います。

さらに、テーブル一覧やVIEWも問題なく取得できました。

これまで、コメントを付与したり、対象のテーブルを指定することで臨むデータを返してくれましたが、テーブルデータに全く関係ない内容で実行するとどうなるのでしょうか?
「明日の東京の天気は?」として実行します。

無理やり感はありますが、存在するテーブルとカラム名から想定してSQLを実行しています。

また、「500円持ってて、210円のジュースを買いました。残ってるお金は?」という小学生の算数のような内容であった場合には、テーブルを参照せずに、ちゃんと計算した結果を返してくれています。

まとめ

MySQL HeatWave 9.4.1で新たに追加された自然言語でSQLを実行する機能について、実際のEC-CUBEのデータを使用して検証を行いました。
実際に使ってみて、テーブルとカラムに適切なコメントを設定していれば、非常に使える機能だなと感じました。

また、本記事内では LLM に meta.llama-3.3-70b-instruct を指定して実行していますが、llama3.2-3b-instruct-v1llama3.1-8b-instruct-v1 を指定した場合、うまくSQLが生成されなかったり、実行エラーになったりするケースが多く見られたので、現在指定できるLLMのうちでは、 meta.llama-3.3-70b-instruct を使用するのがマストかもしれません。

この機能により、SQLを知らないユーザーでもデータベースから情報を抽出できる可能性が広がると思いますので、是非、MySQL HeatWaveを使用してみて下さい。

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次