はじめに
生成 AI を利用してどの程度正しく SQL クエリが正しく出力されるかを検証することが時々あるため、それらで学んだことをポイントをいくつか紹介していきます。
前提
- 専用のエージェントの利用等の選択肢は一旦おいといて、あくまで素のプロンプトとしてどこまでできそうかに焦点を置いてます
- 生成した SQL クエリをそのまま使って、データベースへの問い合わせをするようなユースケースを想定しております
本題
システムプロンプト案
結論として、以下あたりのプロンプトに落ち着きました。
精度にブレあれば適宜調整ください。
ユーザーが欲しいデータについて質問を入力します。
これに対して {データベースサービス}にて実行可能な適切なSQL文をテーブル情報を参考に生成してください。
**SQL文のみ**を出力し、余分な説明やコメントは一切含めないでください。
SQL文にはデータベース名も必ず指定してください。
以下がテーブル情報になります。
{テーブル情報}
テーブル情報に最低限含めるべきもの
- データベース名
- テーブル名
- カラム名
- データ型
ポイント1: データベース系サービスの明示
一つの目のポイントは、クエリを作成してほしいデータベース系のサービスをプロンプト上で必ず指定することです。
使用しているデータベース系のサービスによって SQL の文法に違いが出てくるためです。
文法が異なる状態でデータベースへクエリで問い合わせてもエラーとなるため注意が必要です。
ポイント2: SQL文以外の余計な文字列の排除
生成 AI からのクエリ内容をそのままデータベースへの問い合わせの引数として自動的に渡したい場合、クエリ以外の余計な文字列が入ってしまえば、もちろん問い合わせした際に SQL 文とはみなされずエラーとなります。
ポイント3: データベース名の指定
データベース系のサービスよっては、クエリの中でデータベース名を指定しないとエラーとなるものもあります。
また、データベースを跨いでテーブルの結合等を行いたい場合もこちらでの制御が必須になります。
-- データベース A から テーブル sample を抽出する場合 〇パターン
SELECT * FROM A.sample
-- データベース A から テーブル sample を抽出する場合 △パターン
SELECT * FROM sample
ポイント4: テーブル情報の提示
適切な SQL を生成するためには現在の環境がどのような状態なのか情報を渡すことが重要です。
テーブル情報に記載されたテーブル名やカラム名を基準に生成 AI はクエリ生成を行います。
データベース系のサービスによっては information_schema などを活用して自動的にテーブル情報を取得できることが望ましいです。
データ型は特に重要で、あらあかじめ情報提示することで動作しない SQL クエリが減ります。
与えるテーブル情報が多すぎてもクエリの精度に影響する可能性があるためご注意ください。
まとめ
今回 生成 AI でクエリを作成するためのいくつか Tips を紹介させていただきました。
生成 AI を利用したクエリ精度向上に、参考になれば幸いです。