2023.07.10
Alibaba製OSS Chat2DBのSQL生成機能を紐解いてみる
Alibabaが提供するOSS「Chat2DB」が備えている,OpenAIのAPIを用いたSQL生成・解説・最適化機能の実装を調査します。
こんにちは,S.T.です。前回の記事では,OpenAIのAPIを用いてMySQL Shellに自然言語からSQLを生成する機能を実装しました。今回は,類似の機能を持っているAlibabaが提供するOSS「Chat2DB」を試しつつ,その実装を調査します。
1.Chat2DBとは
Chat2DBは,Alibabaが提供するOSSのデータベースクライアントソフトウェアです。MySQLやPostgreSQL,Oracleをはじめ,様々なデータベースに対応しています。また,AIGCの機能を実装しており,自然言語からSQLを生成したり,SQLに自然言語の解説を付与したり,SQLを最適化したりすることができます。Chat2DBはApache-2.0 licenseですが,商用環境に接続して使用することに関して制限がある点は,注意が必要です。
画面は図1のようなよくあるGUIのDBクライアントです。言語は中国語と英語を選択できますが,英語にしても一部のメニューは中国語のままになる上,翻訳もかけづらいのが少々つらいところです。

Chat2DBのAIGC機能は,バックエンドを選択可能です。APIのエンドポイントなどを設定から変更できるため,OpenAI API以外を利用することも可能です。中国国内での利用を考慮した機能かと思われますが,独自にチューニングしたモデルを使うためのインタフェースとしても利用できそうです。
2.Chat2DBを使ってみる
まずはChat2DBを触ってみましょう。Chat2DBは,以下の機能に対応しています。
- 自然语言转SQL(SQL生成):自然言語からSQLを生成
- SQL解释(SQL解説):SQLに対する自然言語の解説を生成
- SQL优化(SQL最適化):SQLの最適化に関するアドバイスを生成
- SQL转换(SQL変換):別のDBSM向けのSQLに変換したSQLを生成
これらの機能を,お馴染みのMySQLのサンプルデータベースworldを使って試してみます。
SQL生成機能を利用するためには,事前に設定画面からAPI Keyを設定しておく必要があります。設定画面は中国語ですが,「自定义AI」の設定で「AI来源」を「OpenAI」に設定し「Api Key」以外を空欄にしておけば問題なさそうです。
2.1.自然语言转SQL(SQL生成)
こちらの機能が本命の「自然言語からSQLを生成する機能」です。クエリエディタに自然言語を入力し,その文章を選択した状態で「自然语言转SQL」ボタンを押すと図2のようにテーブル選択画面が表示されます。

テーブルを選んだあとに,取消ではないほうのボタンを押すと,図3のようにSQLが生成されます。

残念ながら,生成されたSQLは公用語フラグのチェックがなく,cityテーブルをJOINしておらず都市名が出力されない,という問題点はありますが,プロンプトに最低限の情報しか入力していないのも原因ですので,ひとまず気にしないでおきます。
GUIのエディタ上で動作するので,前回紹介したChat2Queryライクな見た目ですが,自分でテーブルを選ぶ必要があるため,どのテーブルに何のデータ入っているかを人間が理解しておく必要があります。
2.2.SQL解释(SQL解説)
この機能は,自然言語でSQLを解説してくれる機能です。SQL生成と同様に,解説を付けたいSQLを選択して「SQL解释」ボタンを押すと,図4のように自然言語による解説が生成されます。解説生成時に出てくる入力欄に追加の情報を入力することで,とくに解説してほしい情報を指定することもできます。ただし,解説は中国語です。

今回は2.1で生成したSQLの解説をしてもらいました。翻訳を駆使して内容を把握すると,どのテーブルをSELECTして何をキーに結合して,,,というようなことを丁寧に書いてくれています。内容は正しそうですが,正直なところSQLを読めばわかる情報が長々と書かれているだけなので,実用性は薄そうです。SQLの解説で私たちが求めているものは,そのテーブルに格納されているデータの意味や周辺のドメイン知識,サービスの仕様を含めたものであることが多いため,既製品のツールでの実現は難しそうです。
2.3.SQL优化(SQL最適化)
SQL最適化機能も同様にSQLを選択して「SQL优化」ボタンを押すことで実行できます。実行結果は2.2のように中国語の箇条書きで生成されます。内容はインデックスの作成やCPUやメモリの増強(SQL最適化なのに,,)の提案でした。実際に性能に困っているSQLを入力すれば,多少は得るものがある応答が得られるのかもしれません。
2.4.SQL转换(SQL変換)
SQL変換機能の使い方も同様なのですが,ボタンの名称が「SQL转换」ではないので注意が必要です(2023/7/7時点のバージョンで,一番右)。ボタンを押すと,変換先のDBMSと追加の情報を指定できる入力欄が表示されるので,好きなDBMSを指定して実行すると,変換後のSQLが生成されます。

MySQLのLIMITがOracleのFETCH FIRST 5 ROWS ONLYに変換されました。SQL生成ばかりに注目していましたが,この機能は結構良さそうです。ただし,変換先のDBMSに「Oracle 11g」のようにバージョンを指定しても,ROW_NUMBERを使わずにFETCH FIRST ROWS ONLYを使ったSQLを生成してしまうので,ある程度知識がある人が楽をするためのツールとして捉えるのが良さそうです。
3.Chat2DBを実装を見てみる
Chat2DBでSQL生成や自然言語による解説ができることがわかりました。次に,Chat2DBがどのようなプロンプトを利用しているのかを見てみましょう。
Chat2DBはOSSなので,OpenAI APIを呼び出している周辺のコードを探せば,プロンプトを組み立てる実装を見つけることができます。ChatController.javaを見ると,buildPromptというメソッドがあり,ここでテーブルの情報などを用いてプロンプトを組み立てていることがわかります。プロンプトの大部分は共通で,「请根据以下table properties和SQL input」に続く一文が呼び出す機能によって異なるようです。buildPromptの呼び出し後の処理を見ると,モデルごとに分岐する処理と,生成したプロンプトをinfoレベルでログに出力する処理が書かれています。自分でコードをビルドして実行すれば,ログに書かれたプロンプトを見ることができそうです。さっそく試してみましょう。
2023-06-23 16:47:41.303 INFO 89778 --- [io-10821-exec-2] c.a.d.s.w.a.c.ai.ChatController : 请根据以下table properties和SQL input将自然语言转换成SQL查询. MYSQL SQL tables, with their properties: country(Code, Name, Continent, Region, SurfaceArea, IndepYear, Population, LifeExpectancy, GNP, GNPOld, LocalName, GovernmentForm, HeadOfState, Capital, Code2) countrylanguage(CountryCode, Language, IsOfficial, Percentage) city(ID, Name, CountryCode, District, Population) SQL input: 英語が公用語の国最も人口が多い都市の国名と都市名と人口を取得
テーブル定義と自然言語の入力を組み合わせてプロンプトを生成していることがわかりました。しかし,テーブル定義はテーブル名とカラム名のみをプロンプトに含めているため,型の情報がカラム名から推測しにくいカラムに対する条件などはうまく付与できない可能性があります。試してみましょう。

ContinentカラムはEnumで,大陸名が英語で格納されます。しかし,プロンプトには型の情報がないため,大陸名が「南アメリカ」であるレコードを抽出する,というSQLが生成されてしまいました。
実装を見てわかるように,Chat2DBのAIGC機能のプロンプトは非常にシンプルなものであり,あまり高精度な出力は期待できません。あくまでも参考程度とするのが良さそうです。ただし,SQL変換機能はテーブル定義に依存しないため,割と実用性は高そうです。
4.Chat2DBのプロンプトを日本語にしてみる
最後に,ソースコードを少し変更してプロンプトを日本語にして,日本語でSQLの解説が出力できるようにしてみましょう。さきほど,「请根据以下table properties和SQL input」に続く一文が機能によって異なる,ということを紹介しました。機能ごとのプロンプトはこちらのenumで定義されています。SQL_EXPLAINを「SQLを日本語で解説」に書き換えて実行してみましょう。解説するSQLは,さきほど中国語の解説を生成したものと同じものを利用します。
2023-07-09 13:14:50.726 INFO 37245 --- [io-10821-exec-3] c.a.d.s.w.a.c.ai.ChatController : 请根据以下SQL inputSQLを日本語で解説. SQL input: SELECT c.Capital, cl.LanguageFROM country cLEFT JOIN countrylanguage cl on c.Code = cl.CountryCodeORDER BY c.Population DESCLIMIT 5
このように,若干不自然なプロンプトが生成されました。前半の「请根据以下SQL input」も修正すれば良いのですが,ひとまずこのままで出力を見てみましょう。

それらしい解説が日本語で生成されました。
先ほども述べたように,デフォルトのChat2DBはプロンプトもシンプルで,出力も中国語ですが,プロンプト生成の実装がわかりやすく,自分でカスタムするのも容易です。プロンプトをカスタマイズすることで,自分が実行したいタスクに最適化したDBクライアントソフトウェアに仕上げることもできそうです。
5.まとめ
Alibaba製のOSS Chat2DBのSQL生成機能を検証しました。プロンプトが非常にシンプルであり,SQL生成やその他のAIGC機能は参考程度の精度です。OSSの特性を活かしてカスタムすることで,より高い実用性が見えてくるのではないでしょうか。
次世代システム研究室では,グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。アプリケーション開発者の方,次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら,ぜひ募集職種一覧からご応募をお願いします。
参考
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD