対話型AI活用術:ViewCreator SQLビルダ アシスタントによるSQL開発の効率化

はじめに

このCookBookでは、intra-mart Accel Platform 2024 Autumn(Jasmine)(以降では iAP と表記)以降で提供している「ViewCreator SQLビルダ アシスタント」機能を活用したSQL開発の効率化について解説します。データベースからのデータ取得に必要なSQLを、対話型AIによるアシスタント機能を使って作成する方法を実践的に紹介します。

SQLの課題と解決策

業務システムにおいて整合性が重視されるデータは、一般的にデータベースで管理されています。
データベース(ここでは、RDBを指すものとします)からデータを取得するには、大抵 SQL を作成する必要があります。
SQL を利用するとかなり柔軟なデータ取得が可能な半面、以下のような課題があります:

  • SQL構文の専門的な知識が必要
  • テーブル間の関連性を理解していなければならない
  • 複雑なJOINや条件を扱う際のSQLの作成が難しい
  • テーブル定義を把握している必要がある

「ViewCreator SQLビルダ アシスタント」は、iAP で提供しているテーブル定義情報を活用してSQLを生成する生成AIです。
つまり、 製品標準で作成されるテーブルのことを最初から知っているSQL生成AI です。
※一部、参照できないテーブルがあります。
※独自に作成したテーブル定義を追加することも可能です。

このCookBookでは、「ViewCreator SQLビルダ アシスタント」を利用して SQL を作成する例をご紹介します。
たとえば、iAP では、業務領域で良く利用されるユーザや組織のマスタデータを管理するための仕組みを用意しています。

これらのデータを取得するSQLを、「ViewCreator SQLビルダ アシスタント」を活用して作成します。

前提条件

以下のガイドを参考に、環境設定を行ってください。

レシピ

  • サイトマップ > ViewCreator > クエリ一覧 を押下します。
    「SQLで編集」を押下します。
    cookbook258197_01
    「SQLビルダ アシスタント」付きのSQL作成画面に遷移します。
    cookbook258197_02

下記ガイドに記載されている、「ユーザ」の情報を取得してみます。
intra-mart Accel Platform IM-共通マスタ 管理者操作ガイド - ユーザの基本設定

ということで以下のように指示してみます。

ユーザの一覧を作りたい

この内容で問い合わせてみると、以下のような回答が返ってきました。
cookbook258197_03_02

SQLが表示されているエリアの右上のボタンを押すと、コピーできます。
cookbook258197_04_04

右側のエリアにコピーしたSQLを貼り付けて「カラム一覧に反映」ボタンを押すと、カラム一覧に反映されます。
cookbook258197_05_02
このときに、エラーメッセージが表示されなければ実行可能なSQLということになります。

「プレビュー」を押すと実行結果を確認できます。
cookbook258197_06_02
しかし、ユーザ名やユーザコードが同じデータがあるのが気になります。

この疑問について、生成AIに質問します。

実行結果を見るとユーザ名やユーザコードが重複しているのですがなぜでしょうか?

cookbook258197_07

要するに imm_user というテーブルは、ロケールごと、期間ごとに別々のデータを持てるようになっているということのようです。

以下を続けて指示してみます。

それなら、現時点で利用できる、日本語のデータだけに絞ってください。

cookbook258197_08
修正されたSQLが返ってきたので、コピーして「カラム一覧に反映」ボタンを押してみましたが、エラーメッセージが返って来てしまいました。

実行できなかったことを生成AIに聞いてみます。

そのSQLは実行できませんでした。
ERROR: 列"u.user_name"はGROUP BY句で指定するか、集約関数内で使用しなければなりません 位置: 44

修正した結果が返ってきました。これをコピーして同様に「カラム一覧に反映」ボタンを押してみると、実行できるSQLではあるようですが「現時点で利用できる」と指示した部分が無視されてしまっているようです。
cookbook258197_09

SQLの結果に問題があるため、生成AIの回答だけでなく、imm_user テーブルの定義を確認することにします。

imm_user テーブルの定義(カラムやデータ型、説明など)を知りたいです

cookbook258197_10

「主な」と言ってるので他にもカラムがあるようです。

imm_user テーブルが持つ全てのカラムについて教えてください

cookbook258197_11

見づらいので表形式にしてもらえますか?

cookbook258197_12
テーブル定義から「ユーザの有効期間の開始日」と「ユーザの有効期間の終了日」カラムが確認できました。これらを条件に使用することで、現時点で有効なデータのみを抽出できると考えられます。

「ユーザの有効期間の開始日」と「ユーザの有効期間の終了日」を使って、現時点で利用可能なデータに絞ることはできませんか?

cookbook258197_13
cookbook258197_14
今度は意図した通りのレコードを抽出するSQLができたようです。

ユーザ情報の取得ができたので、次に組織マスタとの関連付けについて質問します。

組織マスタと紐づけて、組織ごとの所属ユーザを取得するSQLにすることはできますか?

cookbook258197_15
cookbook258197_16
プレビューしてみると、日本語以外の組織名のデータも取得しているようです。

組織マスタについても、期間やロケールを意識してもらえますか?

cookbook258197_17
一見して妥当なSQLに思われましたが、実行時にエラーが発生しました。

発生したエラーメッセージを伝えます。

実行できませんでした
ERROR: 列da.locale_idは存在しません ヒント: 列"d.locale_id"を参照しようとしていたようです。 位置: 363

cookbook258197_18
実行できるSQLに修正されたようですが、locale_id を使わない代わりに start_date, end_date を使ったというのは何か変です。

imm_department テーブルの構造についての仮説を提示します。

imm_department にロケールに関する情報があるのではないですか?imm_department の start_date と end_date で期間を考慮できるのであればそれはそれで良いと思います。

cookbook258197_19

生成されたSQLを確認すると、imm_user テーブルに対するロケール条件(日本語のみを抽出する条件)が追加されていないことが分かります。
しかし、いままでの経緯を踏まえると、AND u.locale_id = 'ja' を足せば良いと考えられます。

最終的に作成したSQL

SELECT
    d.department_cd,
    d.department_name,
    u.user_cd,
    u.user_name,
    u.email_address1,
    u.telephone_number
FROM imm_department d
INNER JOIN imm_department_ath da
    ON d.company_cd = da.company_cd
    AND d.department_set_cd = da.department_set_cd
    AND d.department_cd = da.department_cd
INNER JOIN imm_user u
    ON da.user_cd = u.user_cd
WHERE
    d.delete_flag = '0'
    AND da.delete_flag = '0'
    AND u.delete_flag = '0'
    AND d.locale_id = 'ja'
    AND u.locale_id = 'ja'
    AND d.start_date <= CURRENT_TIMESTAMP
    AND d.end_date >= CURRENT_TIMESTAMP
    AND u.start_date <= CURRENT_TIMESTAMP
    AND u.end_date >= CURRENT_TIMESTAMP
ORDER BY
    d.department_cd, u.sort_key ASC;

あらかじめ必要なテーブルが分かっている場合

先ほどの例では、かなり回り道をしたやりとりでしたが、もし必要なテーブルが分かっている(一部でも)場合はその情報を含めると回答精度の向上が期待できます。

所属組織別のユーザ一覧を作ってください。
以下のテーブルを利用できると思います。
imm_user, imm_department, imm_department_ath

cookbook258197_20

このくらいになると生成AIなしでは、SQLに詳しい方であっても1からつくるのは時間が必要になってくるかもしれません。

所属組織別のユーザ一覧を作ってください。一覧には所属組織の直近の親組織名とユーザの役職名も含めてください。
各テーブルでロケールや期間を管理している場合は、日本語のみ取得、現在有効な期間のみを参照してください。
以下のテーブルを利用できると思います。
imm_user, imm_department, imm_department_ath, imm_department_inc_ath, imm_department_post_ath, imm_company_post

まとめ

生成AIを利用したSQL作成において、以下のポイントが重要です:

  • 生成AIは間違った回答をすることがあるため、結果を必ず検証する

    • 例)生成AIが回答したSQLを「カラム一覧に反映」して構文エラーがないか確認後、「プレビュー」で想定したデータが表示されるか検証する
  • 問い合わせメッセージを具体的に工夫することで、より適切な回答を得られる確率が上がる

    • 例)「ユーザ一覧を作りたい」ではなく「現在有効な日本語のユーザ一覧を作りたい」のように具体的に指示する
  • あらかじめ必要なテーブルが分かっている場合は、その情報を含めると回答精度が向上する

    • 例)「所属組織別のユーザ一覧を作ってください。以下のテーブルを利用できると思います。imm_user, imm_department, imm_department_ath」
  • エラーメッセージは具体的に伝える

    • 良くない例)「あなたが出してくれたSQLだとエラーになります」
    • 良い例)「そのSQLは実行できませんでした。ERROR: 列"u.user_name"はGROUP BY句で指定するか、集約関数内で使用しなければなりません 位置: 44」
  • テーブル定義を確認しながら進めることで、より正確なSQLを作成できる

    • 例)「imm_user テーブルの定義(カラムやデータ型、説明など)を知りたいです」と質問して、有効期間の列を確認する
  • 試行錯誤の過程も含めて、対話的に改善していくアプローチが効果的

    • 例)初回の回答で意図した結果が得られなくても、問題点を指摘しながら徐々に改善していく