自然言語 SQL 生成
執筆:Ai Flowi · 公開日
自然言語 SQL 生成は、データベースのデータに関する質問を SQL 文に変換します。生成された文は下書きとして扱い、実行前にテーブル、結合、フィルター、集計を確認してください。構文が正しくても、別の質問に答えたり、意図した範囲外のデータにアクセスしたりするクエリはあり得ます。
この AI Flowi Workflow の設計では、クエリ生成と、レビューを経た実行を分けます。コンポーネントはカタログに記載されていますが、Ai Flowi による本番環境でのテストは行われていません。この提案では、データベース接続、生成クエリの結果、無制限のクエリを防ぐ保護機能のいずれもテストしていません。
1. 質問に既知の限定されたスキーマを与える
合成データセット、または承認済みのレポート用ビューだけにアクセスできるデータベースロールから始めます。データベースの方言、各テーブルの意味、単位、各行が表す粒度を記録してください。amount という列名だけでは、商品単価、注文合計、集計済みの値のどれが入っているかモデルには分かりません。結合によって行が増える可能性も含め、キーと関係を明示します。
Illustrative schema, not a connected database:
orders(order_id, created_at, status)
order_items(order_id, product_code, quantity)
Question: Show total units per product for completed orders
within a specified start-inclusive, end-exclusive interval.
この例には、非公開のレコードや、返されたと主張する値はありません。生成前に、完了済みの定義と期間の指定方法を決めてください。ユーザーが開始・終了のどちらかを省略したら、モデルに推測させず確認を求めます。金額や率の計算では、LLM の数値推論と同様に、まず分母と単位を確定します。
2. データベース側で制限を強制する
データを変更できず、必要なレポート用ビューだけを読み取れる認証情報を作成します。ワークフローに接続する前に、データベースの管理ツールで権限を検証してください。読み取り専用でも、読み取れる行の情報は開示できてしまいます。必要に応じてテーブル、行、列へのアクセスを絞ります。SELECT のみと指示するプロンプトでは、これらの権限制限を強制できません。
データベースホストへのアクセス、実行環境でサポートされる接続ドライバー、ご自身のモデルプロバイダーのアカウントと API キーが必要です。プロバイダーの利用料金は別途請求されます。対応するシークレットの扱いは、認証情報と変数のガイドを参照してください。認証情報入りの接続 URL を共有プロンプト、エクスポート、テストレポートに含めないでください。
3. 名前が似ているコンポーネントを区別する
カタログの SQLDatabase には、必須入力の uri と、型が SQLDatabase の出力があります。Natural Language to SQL は db にその型を、llm に LanguageModel を、input_value に質問を受け取ります。説明は自然言語から SQL を生成します。
です。出力 text の型は Message です。
別名の実行コンポーネントと接続フィールドについては、SQL Database 実行コンポーネントのリファレンスを参照してください。
提案する注文の例では、確認できるクエリの下書きが得られた時点で生成が完了し、実行はその後に判断します。まず、求める合計が商品の個数なのか、完了した注文の件数なのかを決めてください。同じテーブルと結合を使えても、集計は異なります。その選択を質問の横に記録し、もう一方の解釈に答える、もっともらしいクエリをレビュアーが却下できるようにします。
4. 生成のみを行う設定の下書きを作る
レビューを前提としたクエリ設計:設定例であり、記録されたテストではありません
| コンポーネント | 設定するカタログ入力 | 続行前の確認 |
|---|---|---|
| SQLDatabase | uri:制限されたビューへの接続を非公開で設定します。 | スキーマ情報の取得範囲と権限を検証します。エクスポートにはスキーマ検出の説明がありません。 |
| Language Model | model:Language Model のポートリファレンスに従って設定したプロバイダーのモデル。 | 生成クエリを確認する前に、プロバイダーへのアクセスを確認します。 |
| Natural Language to SQL | db:SQLDatabase 接続。llm:LanguageModel 接続。input_value:曖昧さを解消した質問。prompt:承認済みスキーマと SELECT のみを生成する指示。 | text の Message は信頼できないクエリの下書きとして読みます。top_k をアクセス制限として扱いません。 |
| SQL Database | database_url:制限された実行用接続。query:手動でレビューした文。 | レビューが完了するまで、生のモデル出力には接続しません。 |
| Structured Output | input_value:クエリの下書きと提供されたスキーマ。output_schema:テーブル、フィルター、集計、未解決の前提。system_prompt:レビュー用に下書きを説明する指示。 | 別のモデルによる説明は確認を補助しますが、SQL の安全性を強制しません。 |
Natural Language to SQL には top_k が載っていますが、その意味、既定値、強制方法は定義されていません。行数制限やクエリのコスト上限がある根拠にしないでください。また、生成時にスキーマ以外のデータベース情報を参照するかもカタログには明記されていません。最初から隔離された制限付き接続を使い、動作する生成機能として扱う前に実際の挙動を確認します。
5. 質問と照らして文をレビューする
例の質問では、orders と order_items だけを読み、指定された注文キーで結合し、意図した完了ステータスで絞り込み、両方の時間境界を適用しているか確認します。行数を数えず quantity を合計していること、product_code ごとにグループ化していること、意図しない追加の結合で注文が重複しないことを確認してください。
最初のキーワードだけでなく、参照する全オブジェクト、関数、サブクエリをレビューします。SELECT で始まる文でも、データベースによっては機密性の高い関数や未承認のオブジェクトを使えます。文字列照合やモデルの自己評価で安全性の判定を作らないでください。この提案では文全体をレビューし、データベース権限と承認済みのクエリ範囲に依拠します。
前提は下書きの横に記録します。SQL の NULL の扱い、タイムゾーンの境界、結果が空の場合の挙動で、回答の意味が変わることがあります。実行前に、権限のあるレビュアーと期待する扱いを決めてください。実行コンポーネントのカタログにはパラメーターバインディング用の入力がないため、このページではユーザーの入力値に対する架空のバインディング手順を示しません。
6. 承認されたクエリを管理された環境で実行する
レビューした文だけを SQL Database の query にコピーします。期待する行が分かる合成データから始めてください。回答用モデルに送る前に、Result Table の実際の列と値を確認します。ここで期待する出力は商品別の表形式の集計であり、実証されたデータベース応答ではありません。
実行を試す前に、エラーと対応設定の制限をSQL Database リファレンスで確認してください。
タイムスタンプが期間の終了と完全に一致する合成行と、開始と完全に一致する行を用意します。指定された質問では開始の行を含め、終了の行を除外します。さらに、同じ商品に複数の明細行を持つ完了済み注文を用意してください。集計が明細行数を返さず、それぞれの quantity を加算しているかレビューします。大規模データセットや架空の本番結果に頼らず、期間演算子や集計の誤りを検出できます。
7. 自然言語SQLで曖昧さと境界条件をどうテストしますか?
| 入力ケース | 必要なレビュー判断 | 確認内容 |
|---|---|---|
| 必要な情報がそろったレポート用の質問 | 承認済みビューだけを対象にクエリを作成します。 | 単位、グループ化、ステータス、期間が質問に一致しています。 |
| 日付範囲の欠落 | 欠けている境界を確認します。 | 任意の集計期間が黙って追加されていません。 |
| 未承認テーブルへの要求 | 要求を却下するか、範囲を狭めます。 | データベース認証情報では、禁止されたオブジェクトを読み取れません。 |
| 条件に一致するデータがない | 観測された空の結果、または定義された集計の挙動を保持します。 | 行や説明を捏造しません。 |
この設計を、本番データへの無制限のアクセス、書き込み、生成された文を自動実行するチャットエンドポイントに使わないでください。この提案の最小範囲は、レビュー済みの下書きと制限付き認証情報です。SQL アクセスを無関係なタスクに広げず、他のデータワークフローは文書化されたユースケースを参照してください。
クエリ生成の利用量
プラン:Goは年払いで月額USD8から(月払いUSD10)、Plusは月額USD16から(月払いUSD20)、Pro 100は月額USD80から(月払いUSD100)、Pro 200は月額USD160から(月払いUSD200)、Pro 500は月額USD400から(月払いUSD500)。毎月5,000~250,000 Flowi Tokensが含まれ、追加購入も可能です。ノード実行1回につき1トークン。サードパーティのAPIとモデルの利用料金は含まれません。
モデルによる下書き作成、任意のクエリレビュー、データベース実行を、観測した実行経路に含めます。行数、SQL の top_k フィールド、ワークフローの課金トークンは別の数量です。