すべてのプロダクト
Search
ドキュメントセンター

PolarDB:LLM による自然言語から SQL へ

最終更新日:Jun 21, 2026

SQL に不慣れなユーザーでもデータ分析を利用できるようにするため、PolarDB for AI には、大規模言語モデルベースの自然言語から SQL への変換 (LLM ベースの NL2SQL) に対応した独自の組み込み AI モデルが搭載されています。従来の NL2SQL 手法と比べて、LLM ベースの NL2SQL モデルはより強力な言語理解能力を持ち、日付演算など、より多くの機能をサポートする SQL ステートメントを生成します。このモデルは、valid->isValid=1 のような単純なマッピング関係も理解できます。適切にファインチューニングすることで、datastatus=1 のような条件を自動的に適用するなど、ユーザーがよく使用する SQL パターンを学習できます。

/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'List the names and leave counts of the 2 students with the most leave requests, sorted in descending order.') WITH (basic_index_name='schema_index');
出力: SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;

NL2SQL ワークフロー

NL2SQL アプリケーションの実装を支援するために、プロセスをクイックスタート、最適化とチューニング、本番デプロイの 3 つの段階に分けました。

  • クイックスタート段階:この段階では、基本的な NL2SQL 機能をゼロから迅速に構築できます。

  • 最適化とチューニングの段階:この段階では、特定のビジネスシナリオに合わせた詳細な最適化に重点を置いています。

  • 本番デプロイ段階:この段階では、NL2SQL システムを本番環境にデプロイします。

image

前提条件

  • AI ノードを追加し、そのデータベースアカウントを設定します。 詳細については、「PolarDB for AI機能の有効化」をご参照ください。

    説明
    • クラスターの購入時に AI ノードを追加した場合、AI ノードのデータベースアカウントを直接設定できます。

    • AI ノードのデータベースアカウントには、対象のデータベースへの[読み書き]権限が必要です。

  • クラスターエンドポイント を使用してPolarDB クラスターに接続します。 詳細については、「PolarDB for AIへのログイン」をご参照ください。

    重要
    • コマンドラインからクラスターに接続する場合は、-c オプションを追加してください。

    • Data Management (DMS) でPolarDB for AI を使用する場合、DMS はデフォルトで[プライマリアドレス] を使用してPolarDB クラスターに接続するため、SQL ステートメントは AI ノードにルーティングされません。 接続アドレスを手動で[クラスターのエンドポイント] に変更する必要があります。

注意事項

  • 質問の表現方法:適切に表現された質問には、条件、対象となる列の値、および考えられる列名が含まれます。例:

    SELECT 'What is the property name of a "house" or "apartment" with more than one room?'

    この例では、'with more than one room' が条件、'house''apartment' が列の値、'property name' が考えられる列名です。

  • クエリ結果の精度LLM ベースの NL2SQL モデルのパフォーマンスは、いくつかの要因の影響を受けます。クエリ結果が期待どおりになるようにするには、以下の点を考慮してください。

    • テーブルと列のコメントの充実度:各テーブルと列に詳細なコメントを追加すると、クエリの精度が向上します。

    • 質問と列のコメントの一致:質問に含まれるキーワードと列のコメントの間の意味的な一致が高いほど、クエリの精度は向上します。

    • 生成される SQL ステートメントの長さ:関連する列が少なく、条件が単純であるほど、クエリの精度は向上します。

    • 生成される SQL ステートメントの論理的な複雑さ:SQL ステートメントで使用される高度な構文が少ないほど、クエリの精度は向上します。

使用法

データテーブルの標準化

LLM ベースの NL2SQL が動作するには、モデルがデータテーブルとそのカラムを理解する必要があります。そのため、開始する前に、よく使用するデータテーブルとカラムにコメントを追加してください。

  • テーブルコメント

    テーブルコメントは、LLM ベースの NL2SQL モデルがテーブルの内容を理解するのを助け、クエリに必要なテーブルを正確に特定できるようになります。良いコメントとは、テーブルのデータ (例:「orders」、「inventory」) を簡潔に要約したもので、10 語以内に収め、詳細すぎる説明は避ける必要があります。

  • カラムコメント

    カラムコメントは、「Order ID」、「Date」、「Store Name」など、カラムのデータを正確に表す一般名詞またはフレーズにしてください。また、サンプルデータや値マッピングをカラムコメントに含めることもできます。例えば、isValid という名前のカラムの場合、コメントは アイテムが有効かどうかを示します。0:いいえ、1:はい。 にできます。

説明

既存のコメントを変更できない場合は、カスタムのテーブルとカラムのコメント機能を使用してオーバーライドできます。詳細については、「Advanced usage - Custom table and column comments」をご参照ください。

データの準備

説明

ご自身のビジネスシナリオを反映したテストデータを準備することができます。このトピックの例では、次のテストデータセットを使用します:Test Dataset.sql

  1. 検索インデックス テーブルの作成

    データテーブルからデータを抽出するには、そのデータテーブルの検索インデックス テーブルを作成する必要があります。データベースの命名規則に準拠したカスタムのテーブル名を指定することができます。このトピックでは、schema_index を例として使用します。次の SQL ステートメントは、検索インデックス テーブルを作成します:

    /*polar4ai*/CREATE TABLE schema_index(id integer, table_name varchar, table_comment text_ik_max_word, table_ddl text_ik_max_word, column_names text_ik_max_word, column_comments text_ik_max_word, sample_values text_ik_max_word, vecs vector_768, ext text_ik_max_word, PRIMARY KEY (id));
    説明
    • 検索インデックス テーブルは、標準のテーブルリストには表示されません。確認するには、/*polar4ai*/SHOW TABLES; ステートメントを実行します。

    • schema_index などの検索インデックス テーブルを削除するには、/*polar4ai*/DROP TABLE IF EXISTS schema_index; ステートメントを実行します。

  2. データテーブル情報の検索インデックス テーブルへのインポート

    次のステートメントは、現在のデータベース内にあるすべてのテーブル情報をベクトル化するようPolarDB for AI に指示します。デフォルトでは、カラム値のサンプリングは無効になっています。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;

    パラメーター

    • _polar4ai_text2vec はテキスト埋め込みモデルです。

    • INTO の後に、「手順1:検索インデックス テーブルの作成」で作成した検索インデックス テーブルの名前を指定します。

    • WITH() 句では、次のパラメーターを設定できます:

      パラメーター

      必須

      説明

      mode

      はい

      データ書き込みモード。このパラメーターは、非同期モードを指定する async に設定する必要があります。

      resource

      はい

      リソースタイプ。このパラメーターは、データテーブル情報のベクトル化を指定する schema に設定する必要があります。

      tables_included

      いいえ

      ベクトル化するテーブルを指定します。

      デフォルトは '' で、すべてのテーブルがベクトル化されます。複数のテーブルを指定する場合は、名前をカンマ区切りの1つの文字列として指定します。

      to_sample

      いいえ

      カラム値をサンプリングするかどうかを指定します。サンプリングを有効にするとデータのインポート時間は増加しますが、カラム数が15未満のテーブルでは生成されるSQLの品質が向上する場合があります。有効な値:

      • 0 (デフォルト):カラム値をサンプリングしません。

      • 1:カラム値をサンプリングします。

      columns_excluded

      いいえ

      LLM ベースの NL2SQL 処理から除外するカラムを指定します。

      デフォルト値は '' で、この場合、ベクトル変換に関与するすべてのテーブルのすべてのカラムが、後続の LLM ベースの NL2SQL 処理に参加します。このパラメーターを設定する場合は、後続の LLM ベースの NL2SQL 処理から除外するカラムを、table_name1.column_name1,table_name1.column_name2,table_name2.column_name1 形式の文字列として指定する必要があります。

      :このステートメントは、現在のデータベース内の graph_infoimage_infotext_info テーブルをベクトル化し、カラム値のサンプリングを有効にします。また、graph_info テーブルの time カラムと、text_info テーブルの ext カラムを、LLM ベースの NL2SQL 処理から除外します。

      /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema', tables_included='graph_info,image_info,text_info', to_sample=1, columns_excluded='graph_info.time,text_info.ext') INTO schema_index;
  3. タスクステータスの確認

    インポートステートメントは、task_id (例:bce632ea-97e9-11ee-bdd2-492f4dfe0918) を返します。この ID を使い、次のコマンドでタスクのステータスを確認します。ステータスが finish と表示されたら、タスクは完了です。

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;

    次の SQL ステートメントを実行すると、検索インデックス情報を確認できます:

    /*polar4ai*/SELECT * FROM schema_index;

LLM ベースの NL2SQL の使用

構文

/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '<question>') WITH (basic_index_name='<basic_index_name>');

パラメーター

  • <question> を自然言語の質問に置き換えます。次の表に例を示します。

    このトピックの例

    その他のシナリオ

    教師名で昇順に並べ替え、教師の名前と担当するコース名を表示してください。

    休暇申請が最も多い学生上位10人を見つけ、休暇申請数で降順に並べ替え、学生名と休暇申請数を表示してください。

    2023-10-01から2023-10-03の間に開催されたコースの名前と場所をクエリしてください。

    2つを超えるコースを受講している学生について、学生名と受講コース数を表示し、受講コース数で降順に並べ替えてください。

    住所に「東京」または「大阪」を含む学生の名前と電話番号を見つけてください。

    2回以上の治療を行った専門家のID、役割、名前は何ですか?

    最も一般的に飼育されている犬種の犬種名は何ですか?

    犬の治療で最も多く支払ったのはどの飼い主ですか?飼い主のIDと姓を一覧表示してください。

    犬の治療に最も多く支払った飼い主のIDと姓を教えてください。

    総コストが最も低い治療タイプの説明は何ですか?

  • WITH() 句では、次のパラメーターを設定できます:

    パラメーター

    必須

    説明

    basic_index_name

    はい

    現在のデータベースにある検索インデックス テーブルの名前です。

    to_optimize

    いいえ

    SQLの最適化を実行するかどうかを指定します。有効な値:

    • 0 (デフォルト):最適化を実行しません。

    • 1:SQLの最適化を有効にします。PolarDB for AI は、生成されたSQLを書き換えてパフォーマンスを向上させます。

    basic_index_top

    いいえ

    リコールする関連テーブルの最大数です。1~10 の整数を指定します。

    • デフォルト値は3です。単一テーブルのクエリでは、通常1で十分です。

    • 複数テーブルが関与するクエリの場合は、この値を4以上に設定してリコールを拡大し、結果を改善できます。

    basic_index_threshold

    いいえ

    テーブルリコールの類似度のしきい値です。値は (0,1] の範囲で指定します。

    デフォルトは 0.1 です。関連性スコアがこのしきい値を超える場合にのみ、テーブルがリコールされます。

  • 例 1:並べ替えを含む基本クエリ

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '教師名で昇順に並べ替え、教師名と担当するコース名を表示してください。') WITH (basic_index_name='schema_index');
    SELECT t.teacher_name, c.course_name FROM teachers t JOIN courses c ON t.id = c.teacher_id ORDER BY t.teacher_name ASC;
  • 例 2:制限と並べ替えを含む条件付きクエリ

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '休暇申請が最も多い学生を2人見つけ、休暇申請数で降順に並べ替え、学生名と休暇申請数を表示してください。') WITH (basic_index_name='schema_index');
    SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;

高度な使用法

PolarDB for AI には、4 つの高度な使用シナリオがあります。以下の問題が発生した場合は、対応する手順をご参照ください。

  • 質問テンプレートの設定: 汎用的な質問テンプレートを設定し、モデルが特定の知識に基づいて SQL ステートメントを生成できるようにします。

  • 設定テーブルの構築: 質問を前処理したり、生成された SQL ステートメントを後処理したりします。

  • テーブルとカラムのカスタムコメント: 元のテーブルコメントやカラムコメントを変更できない場合は、新しいコメントを追加してオーバーライドできます。

  • ワイドテーブルのサポート: テーブルに含まれるカラムが多すぎる場合、または Please use column index to avoid oversize table information. エラーが発生した場合は、カラムインデックステーブルを構築し、モデルがワイドテーブルを処理できるようにします。

質問テンプレートの設定

質問テンプレートは、特定の知識ドメインにおけるユーザーの質問をモデルが理解するのに役立ちます。汎用的な質問テンプレートを設定してモデルに特定の知識を提供できます。モデルはこの知識に基づいて SQL を生成します。

操作手順

  1. 質問テンプレートテーブルの作成

    質問テンプレートテーブル名は polar4ai_nl2sql_pattern で始まる必要があります。また、スキーマには、次の CREATE TABLE ステートメントで定義されている 5 つのカラムを含める必要があります。

    DROP TABLE IF EXISTS `polar4ai_nl2sql_pattern`;
    CREATE TABLE `polar4ai_nl2sql_pattern` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'プライマリキー',
      `pattern_question` text COMMENT 'テンプレート質問',
      `pattern_description` text COMMENT 'テンプレートの説明',
      `pattern_sql` text COMMENT 'テンプレート SQL',
      `pattern_params` text COMMENT 'テンプレートパラメーター',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

    カラムの説明

    パラメーター

    説明

    テンプレート質問

    LLM ベースの NL2SQL モデルへの入力となるパラメーター化された質問です。

    テンプレート質問では、パラメーターを #{XXX} 形式で記述します。

    テンプレートの説明

    テンプレート質問の要約です。日付、年、組織などのエンティティをパラメーターとして抽出します。これらのエンティティは通常、テーブル内の特定のカラムにマッピングされます。

    テンプレートの説明では、パラメーターを [XXX] 形式で記述する必要があります。また、パラメーターの順序は、テンプレート質問内のパラメーターの順序と一致させる必要があります。

    テンプレート SQL

    テンプレート質問に対する正しい SQL です。この SQL では、テンプレート質問のパラメーターは変数として扱います。

    説明

    テンプレート質問とテンプレート SQL のパラメーターは同一である必要はありませんが、関連している必要があります。例えば、パラメーターが共通のプレフィックスを共有し、値が 1 対 1 のマッピングになる場合があります。#{category}#{categoryCode} では、category のパラメーター値が "ordinary trademark"、"special trademark"、"collective trademark" の場合、対応する categoryCode の値はそれぞれ 0、1、2 です。詳細については、次のをご参照ください。

    テンプレートパラメーター

    table_nameparam_infoexplanation の 3 つのパラメーターで構成される JSON 文字列です。

    • table_name string:テンプレート SQL で使用するテーブル名です。

    • param_info array:テンプレート SQL 内のパラメーターの説明です。

      • param_name string:パラメーター名です。

      • value array:パラメーターのサンプル値です。

        説明
        • パラメーターに有限の列挙値セットがある場合は、可能であれば value 配列にすべて列挙してください。

        • サンプル値のみを指定する場合は、2 ~ 4 個の例を列挙してください。

        • パラメーターが相互依存する場合は、配列インデックスを使用してマッピングします。例えば、#{category}#{categoryCode} では、category の "ordinary trademark" は categoryCode の 0 に対応し、"special trademark" は categoryCode の 1 に対応します。詳細については、次のをご参照ください。

    • explanation string:補足事項です。通常は、返す情報や特定のフィールドの解釈方法など、生成される SQL の要件を記述します。

    説明

    テンプレートパラメーターが不要な場合は、値を次のいずれかに設定できます:

    • NULL

    • 空の文字列

    • 空のリスト文字列: []

    テンプレート質問

    テンプレートの説明

    テンプレート SQL

    テンプレートパラメーター

    Query for courses with course name #{courseName} and teaching status #{status}

    What are the courses with [Course Name] and [Teaching Status]?

    SELECT course_name, course_time, course_location 
    FROM courses 
    WHERE 
    course_name=#{courseName} 
    AND status=#{statusCode}

    [{"table_name":"courses","param_info":[{"param_name":"#{courseName}","value":["Mathematics","Physics","Chemistry","English","History","Geography","Biology","Computer Science","Art","Music","Physical Education","Programming","Literature","Psychology","Philosophy","Economics","Sociology","Physics Lab","Chemistry Lab","Biology Lab"]},{"param_name": "#{status}", "value": ["Not started","In progress"]},{"param_name": "#{statusCode}","value": [0,1]}], "explanation": "コース名 (course_name)、コース時間 (course_time)、およびコース場所 (course_location) を出力します。注:status は定数マッピングタイプです。変数マッピングフィールドは statusCode です。"}]

    What are the national standards planned for release in year #{issueDate} with project status #{projectStat}?

    What are the national standards planned for release in [Year] with [Project Status]?

    SELECT DISTINCT planNum, projectCnName, projectStat 
    FROM sy_cd_me_buss_std_gjbzjh 
    WHERE 
    `planNum` IS NOT NULL 
    AND `dataStatus` != 3 
    AND `isValid` = 1 
    AND projectStat=#{projectStat} 
    AND DATE_FORMAT(`issueDate`, '%Y')=#{issueDate}

    [{"table_name":"sy_cd_me_buss_std_gjbzjh","param_info":[{"param_name":"#{issueDate}","value":[2009,2010,2011,2012]},{"param_name":"#{projectStat}","value":["Seeking comments","Published","Under review"]}],"explanation":"標準名 (projectCnName)、計画番号、およびプロジェクトステータスを出力します。"}]

    What are the trademarks with category #{category} and international classification #{intCls}?

    What are the trademarks for [Trademark Type] in [International Classification]?

    SELECT DISTINCT tmName, regNo, status 
    FROM sy_cd_me_buss_ip_tdmk_new 
    WHERE 
    dataStatus!=3 
    AND isValid = 1 
    AND category=#{categoryCode} 
    AND intCls=#{intClsCode}

    [{"table_name":"sy_cd_me_buss_ip_tdmk_new","param_info":[{"param_name":"#{intCls}","value":["Chemical raw materials","Paints","Cosmetics and cleaning preparations","Fuels and lubricants","Pharmaceuticals"]},{"param_name":"#{category}","value":["ordinary trademark","special trademark","collective trademark"]},{"param_name":"#{intClsCode}","value":[1,2,3,4,5]},{"param_name":"#{categoryCode}","value":[0,1,2]}],"explanation":"商標名 (tmName)、出願/登録番号 (regNo)、および商標ステータス (status) を出力します。注:category は定数マッピングタイプです。変数マッピングフィールドは categoryCode です。intCls は定数マッピングタイプです。変数マッピングフィールドは intClsCode です。"}]

    例えば、上の表に示した最初のテンプレート質問を作成するには、次の SQL を実行します。

    INSERT INTO `polar4ai_nl2sql_pattern` (`pattern_question`,`pattern_description`,`pattern_sql`,`pattern_params`) VALUES ('Query for courses with course name #{courseName} and teaching status #{status}','What are the courses with [Course Name] and [Teaching Status]?','SELECT course_name, course_time, course_location FROM courses WHERE course_name=#{courseName} AND status=#{statusCode}','[{"table_name":"courses","param_info":[{"param_name":"#{courseName}","value":["Mathematics","Physics","Chemistry","English","History","Geography","Biology","Computer Science","Art","Music","Physical Education","Programming","Literature","Psychology","Philosophy","Economics","Sociology","Physics Lab","Chemistry Lab","Biology Lab"]},{"param_name": "#{status}", "value": ["Not started","In progress"]},{"param_name": "#{statusCode}","value": [0,1]}], "explanation": "コース名 (course_name)、コース時間 (course_time)、およびコース場所 (course_location) を出力します。注:status は定数マッピングタイプです。変数マッピングフィールドは statusCode です。"}]');
  2. 質問テンプレートインデックス テーブルの作成

    インデックス テーブルには、データベースの命名規則に準拠していれば、カスタムの名前を使用できます。この例では pattern_index を使用します。次の SQL を実行して、質問テンプレートインデックス テーブルを作成します:

    /*polar4ai*/CREATE TABLE pattern_index(id integer, pattern_question text_ik_max_word, pattern_description text_ik_max_word, pattern_sql text_ik_max_word, pattern_params text_ik_max_word, pattern_tables text_ik_max_word, vecs vector_768, PRIMARY KEY (id));
    説明
    • 質問テンプレートインデックス テーブルは、データベースオブジェクトのリストには表示されません。表示するには、 /*polar4ai*/SHOW TABLES; を実行します。

    • 例えば pattern_index などの質問テンプレートインデックス テーブルを削除するには、SQL ステートメント /*polar4ai*/DROP TABLE IF EXISTS pattern_index; を実行します。

  3. インデックス テーブルへのデータのインポート

    説明

    質問テンプレートテーブルは空にできません。データをインポートする SQL を実行する前に、少なくとも 1 件のレコードを追加してください。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern') INTO pattern_index;

    パラメーター

    • _polar4ai_text2vec はテキストベクトル化モデルです。

    • INTO の後に、手順 2 で作成した質問テンプレートインデックス テーブルの名前を指定します。

    • WITH() 句では、複数のパラメーターを設定できます:

      パラメーター

      必須

      説明

      mode

      はい

      書き込みモードを指定します。非同期モードの場合は async を指定します。

      resource

      はい

      リソースタイプを指定します。質問テンプレート情報をベクトル化するには、 pattern を指定します。

      pattern_table_name

      いいえ

      ベクトル化する質問テンプレートテーブル名です。これは 手順 1 のテーブル名です。

      デフォルト値は polar4ai_nl2sql_pattern で、polar4ai_nl2sql_pattern テーブルに対してベクトル化を実行することを意味します。このパラメーターを設定する場合は、polar4ai_nl2sql_pattern で始まるテーブル名を指定する必要があります。

      シナリオやビジネスドメインごとに異なる質問テンプレートインデックス テーブルを管理する場合は、作成時に異なるテーブル名を指定できます。例えば、ユーザー関連のシナリオ用に polar4ai_nl2sql_pattern_user テーブルを作成する場合は、手順 2 でインデックス名を pattern_index_user に設定できます。情報をインポートする際は、次の SQL ステートメントを使用します:

      /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern', pattern_table_name='polar4ai_nl2sql_pattern_user') INTO pattern_index_user;
  4. タスクステータスの確認

    インポートステートメントを実行すると、システムは task_id (例: bce632ea-97e9-11ee-bdd2-492f4dfe0918) を返します。次のコマンドを実行して、タスクステータスを確認できます。

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;

    タスクステータスが finish になると、インポートは完了し、モデルは質問テンプレート情報を参照できます。次の SQL ステートメントを実行すると、質問テンプレートインデックス情報を確認できます:

    /*polar4ai*/SELECT * FROM pattern_index;
    説明

    polar4ai_nl2sql_pattern テーブル内のデータが変更された場合は、手順 3 を再実行する必要があります。

  5. 質問テンプレートを使用したオンラインクエリの実行

    次の SQL ステートメントを実行して、LLM ベースの NL2SQL と質問テンプレートを使用したオンラインクエリを実行します:

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Query for courses with the course name Mathematics and status in progress') WITH (basic_index_name='schema_index', pattern_index_name='pattern_index');
    SELECT course_name, course_time, course_location FROM courses WHERE course_name='Mathematics' AND status=1;

    パラメーター

    • SELECT の後に、SQL に変換する質問を入力します。

    • basic_index_name は、現在のデータベースの検索インデックス テーブル名です。

    • pattern_index_name は、質問テンプレートインデックス テーブル名です。

    • WITH() 句では、複数のパラメーターを設定できます。その他のパラメーターの説明については、「Run an online query with LLM-based NL2SQL」をご参照ください。

      パラメーター

      説明

      値の範囲

      pattern_index_top

      リコールする最も近い質問テンプレートの数です。

      値の範囲: [1,10]。

      デフォルト値は 2 で、現在の質問に対して上位 2 件のテンプレートのみがリコールされることを意味します。

      pattern_index_threshold

      質問テンプレートをリコールするための類似度のしきい値です。

      値の範囲: (0,1]。

      デフォルト値は 0.85 で、ベクトル類似度スコアが 0.85 を超える場合にのみテンプレートが選択されることを意味します。

設定テーブルの作成

設定テーブルを使用して、質問の前処理や生成された SQL の後処理を行います。

ユースケース

  • シナリオ1:名前、専門用語、製品名など、質問内の特定の用語を置換します。

    たとえば、Zhang San を含むすべての質問に対して、Zhang SanZS001 に置換します。この場合、「What were Zhang San's sales last month?」 および 「What are Zhang San's total sales for this year?」 という質問は、大規模言語モデルを最終的に呼び出す前に、設定テーブルを使用して 「What were ZS001's sales last month?」 および 「What are ZS001's total sales for this year?」 に前処理できます。

  • シナリオ2:特定の用語を含む質問に追加のコンテキストを付加します。

    たとえば、Total Sales を含むすべての質問には、計算式 Total Sales = SUM(Sales) を追加する必要があります。この情報は、大規模言語モデルを最終的に呼び出す前に設定テーブルによって追加でき、質問が対応する条件を満たした際に付加されます。

  • シナリオ3:最終的な SQL 内の特定のテーブルまたは列の値をマッピングして置換します。

    たとえば、最終的に student_courses テーブルを含むすべての SQL ステートメントに対して、カラム値のマッピングのフォールバック手段として、status = 'on leave'status = 0 に置換します。

構文

次の SQL ステートメントを使用して設定テーブルを作成します。テーブル名 polar4ai_nl2sql_llm_config は固定であり、変更できません。

DROP TABLE IF EXISTS `polar4ai_nl2sql_llm_config`;
CREATE TABLE `polar4ai_nl2sql_llm_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'プライマリキー',
  `is_functional` int(11) NOT NULL DEFAULT '1' COMMENT 'この設定行が有効かどうかを示します',
  `text_condition` text COMMENT '前処理用のテキスト条件',
  `query_function` text COMMENT 'クエリ処理用の関数',
  `formula_function` text COMMENT '数式情報用の関数',
  `sql_condition` text COMMENT '後処理用のSQL条件',
  `sql_function` text COMMENT 'SQL処理用の関数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
説明

polar4ai_nl2sql_llm_config テーブルのデータ変更は即時に有効になります。追加の操作は不要です。

パラメーター

パラメーター

説明

is_functional

この行のルールが有効かどうかを示します。

デフォルトでは、設定テーブル内のすべてのルールがすべての NL2SQL クエリに適用されます。設定ルールを削除せずに一時的に無効にするには、is_functional を 0 に設定します。
  • 1 (デフォルト):有効

  • 0:無効

  • is_functional = 1 の場合、設定は有効です。

  • is_functional = 0 の場合、設定は無効です。

text_condition

前処理:質問テキストに対する条件を評価します。

条件が満たされると、query_function および formula_function 列の関数が適用されます。
  • 3つの論理演算子、&& (AND)、|| (OR)、!! (NOT) をサポートします。

  • text_condition が空または空文字列の場合、条件はすべての質問に一致します。

text_conditionJohn||Lisa&&!!Wang の場合、質問に「John」が含まれるか、または「Lisa」が含まれ「Wang」が含まれない場合に、条件が一致します。

例えば:

  • 質問:What are John's total sales this year? 回答:条件に一致します。

  • 質問:What are Lisa's total sales this year? 回答:条件に一致します。

  • 質問:What are Lisa and Wang's total sales this year? 回答:条件に一致しません。

query_function

前処理:質問テキストを変換します。

この関数は、text_condition が一致する場合に適用されます。
  • サポートされているメソッド:appenddeletereplace

  • 値は JSON 文字列である必要があります。

query_function{"append":["一","二"],"delete":["?"],"replace":{"Zhang San":"a","Li Si":"b"}} の場合、text_condition が一致すると、質問の末尾に「一」と「二」が追加され、「?」が削除されます。さらに、質問内の「Zhang San」が「a」に、「Li Si」が「b」に置換されます。

例:

  • 質問:Zhang San this year total sales is how much? text_condition が一致した場合、最終的に a this year total sales is how much 一 二 として処理されます。

  • 質問:What is Li Si's total sales for this year? text_condition が一致した場合、最終的に b what is the total sales for this year 一 二 として処理されます。

formula_function

前処理:質問内のビジネス固有の概念に、数式などのコンテキスト情報を追加します。

この関数は、text_condition が一致する場合に適用されます。

-

formula_functionTotal Sales: SUM(Sales Amount) の場合、処理時に、質問内の総売上高が、追加情報として SUM(Sales Amount) という数式と共に処理されます。

sql_condition

後処理:モデルが生成した SQL ステートメントに対する条件を評価します。

条件が満たされると、sql_function 列の関数が適用されます。

  • 3つの論理演算子、&& (AND)、|| (OR)、!! (NOT) をサポートします。

  • sql_condition が空または空文字列の場合、条件は生成されたすべての SQL ステートメントに一致します。

sql_conditionstudents||student_courses&&!!courses の場合、SQL ステートメントが students テーブルまたは student_courses テーブルを参照し、かつ courses テーブルを参照していない場合に条件が一致します。

例:

  • SQL ステートメント SELECT * FROM student_courses:一致します。

  • SQL ステートメント SELECT c.course_name FROM student_courses sc JOIN courses c ON sc.courses_id = c.id;:一致しません。

sql_function

後処理:生成された SQL を変換します。これは、ビジネスロジックに基づいて値のマッピングを適用する場合に便利です。

この関数は、sql_condition が一致する場合に適用されます。

  • 現在、replace メソッドのみがサポートされています。

  • 値は JSON 文字列である必要があります。

sql_function{"replace":{"status = 'on leave'":"status = 0","status = 'on duty'":"status = 1"}} に設定されている場合、sql_condition が一致すると、SQL 内の status = 'on leave'status = 0 に、status = 'on duty'status = 1 に置換されます。

is_functional

text_condition

query_function

formula_function

sql_condition

sql_function

1

Zhang San||Li Si&&!!Wang Wu

{"append":["一","二"],"delete":["?"],"replace":{"Zhang San":"a","Li Si":"b"}}

1

Total Sales: SUM(Sales Amount)

1

students||student_courses&&!!courses

{"replace":{"status = 'on leave'":"status = 0","status = 'on duty'":"status = 1"}}

  1. 設定テーブルなしでクエリを実行すると、次のようになります。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '筛选出2个请假次数最多的学生,按照学生的请假次数降序排列,显示学生的名字和请假次数。') WITH (basic_index_name='schema_index');
    SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
  2. 構文」セクションの説明に従って、設定テーブルを作成します。

  3. 設定レコードを追加します。このルールでは、SQL ステートメントが students テーブルまたは student_courses テーブルを参照し、かつ courses テーブルを参照しない場合に、システムが status = 0status = 10 に置換するように指定します。

    INSERT INTO `polar4ai_nl2sql_llm_config` (`is_functional`,`sql_condition`,`sql_function`) VALUES (1,'students||student_courses&&!!courses','{"replace":{"status = 0":"status = 10"}}');
  4. ステップ1のクエリを再度実行します。生成された SQL の status 値が、ルールで指定されたとおりに置換されます。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '筛选出2个请假次数最多的学生,按照学生的请假次数降序排列,显示学生的名字和请假次数。') WITH (basic_index_name='schema_index');
    SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 10 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;

テーブルとカラムのコメントのカスタマイズ

データテーブルの準備」で説明されているように、テーブルまたはカラムの元のコメントを変更できない場合は、polar4ai_nl2sql_table_extra_info テーブルにカスタムコメントを追加できます。 LLM ベースの NL2SQL を使用すると、これらのコメントは元のコメントをオーバーライドします。

構文

次の SQL ステートメントは、カスタムコメントテーブルを作成します。テーブル名 polar4ai_nl2sql_table_extra_info は変更できません。

DROP TABLE IF EXISTS `polar4ai_nl2sql_table_extra_info`;
CREATE TABLE `polar4ai_nl2sql_table_extra_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'プライマリキー',
  `table_name` text COMMENT 'テーブル名',
  `table_comment` text COMMENT 'テーブルの説明',
  `column_name` text COMMENT 'カラム名',
  `column_comment` text COMMENT 'カラムの説明',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
説明

polar4ai_nl2sql_table_extra_info テーブルのデータを変更した場合は、変更を有効にするために、「データテーブル情報をスキーマインデックスにインポートする」ステップを再実行する必要があります。

  1. カスタムコメントテーブルを作成します。

  2. student_courses テーブルの status カラムのコメントを更新します。この例では、新しいオプションマッピング: 2-欠席 を追加します。

    INSERT INTO `polar4ai_nl2sql_table_extra_info` (`table_name`,`table_comment`,`column_name`,`column_comment`) VALUES ('student_courses','学生とコースの情報テーブル','status','学生のステータス: 0-休暇中、1-正常、2-欠席。');
  3. データテーブル情報をスキーマインデックスにインポートする」ステップを再実行します。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;
  4. タスクステータスを確認します。

    インポートステートメントを実行すると、システムは bce632ea-97e9-11ee-bdd2-492f4dfe0918 のような task_id を返します。次のコマンドを使用してインポートステータスを確認します。taskStatusfinish の場合、タスクは完了しています。

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  5. LLM ベースの NL2SQL を使用してクエリを実行します。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Show the names and number of absences for the 2 students with the most absences, sorted in descending order.') WITH (basic_index_name='schema_index');
    SELECT s.student_name, COUNT(sc.id) AS absence_count FROM student_courses sc JOIN students s ON sc.student_id = s.id WHERE sc.status = 2 GROUP BY s.student_name ORDER BY absence_count DESC LIMIT 2;

    出力は、LLM ベースの NL2SQL モデルが student_courses テーブルの status カラムにおいて、欠席値 2 に正しくマッピングしたことを示しています。

ワイドテーブルへの対応

データテーブルに多くのカラムを持つワイドテーブルが含まれている場合、または LLM ベースの NL2SQL の使用中に Please use column index to avoid oversize table information. エラーが発生した場合は、この手順に従ってください。

説明

オンラインで LLM ベースの NL2SQL を使用する場合、WITH() 句の basic_index_namepattern_index_name は両方とも同じ column_index_name を使用できます。スキーマまたはパターンのインデックス作成とは異なり、この方法は情報の簡略化にのみ使用されます。

ほとんどのリクエストでは、column_index_name パラメーターは効果がありません。これは、長さ制限をトリガーする NL2SQL リクエストの場合にのみ必要です。このような場合、column_index_name はテーブル情報を簡略化します。これにより、精度が多少低下する可能性がありますが、長すぎるプロンプトによって引き起こされる LLM ベースの NL2SQL モデルのエラーを効果的に防ぎます。

  1. 列インデックステーブルを作成します。

    列インデックステーブルにはカスタム名を使用できますが、データベースの命名規則に従い、既存のテーブルの名前と競合しないようにする必要があります。データベースごとに必要な列インデックステーブルは 1 つだけです。次の CREATE TABLE ステートメントを使用してください。

    /*polar4ai*/CREATE TABLE column_index(id integer, table_name varchar, table_comment text_ik_max_word, column_name text_ik_max_word, column_comment text_ik_max_word, is_primary integer, is_foreign integer, vecs vector_768, ext text_ik_max_word, PRIMARY KEY (id));
    説明
    • 列インデックステーブルはデータベースに直接表示されません。その情報を表示するには、SQL ステートメント /*polar4ai*/SHOW TABLES; を実行してください。

    • たとえば column_index のような列インデックステーブルを削除するには、SQL ステートメント /*polar4ai*/DROP TABLE IF EXISTS column_index; を実行してください。

  2. データテーブルから列レベルの情報を列インデックステーブルにインポートしてください。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, select '') WITH (mode='async', resource='column') into column_index;
  3. タスクステータスを確認してください。

    インポートステートメントを実行すると、システムは task_id (例: bce632ea-97e9-11ee-bdd2-492f4dfe0918) を返します。次のコマンドを実行して、インポートステータスを表示できます。taskStatusfinish の場合、タスクは完了です。

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  4. LLM ベースの NL2SQL をワイドテーブルとあわせてオンラインで使用してください。

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '教師名をアルファベット昇順でソートし、教師名と担当するコース名を表示します。') WITH (basic_index_name='schema_index', column_index_name='column_index');

よくある質問

AI SQL の構文エラー

DMS で PolarDB for AI 機能を使用して AI SQL クエリ (/*polar4ai*/ が先頭に付いた SQL ステートメント) を実行すると、次のエラーが発生する場合があります: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xxx' at line xxx。 このエラーは、DMS 接続がお客様の PolarDB クラスターの クラスターのエンドポイント に設定されていないことが原因で発生します。

PolarDB for AI 機能は AI ノードで実行されますが、DMS はデフォルトで プライマリアドレス を使用して PolarDB クラスターに接続します。このため、DMS の接続アドレスを変更する必要があります。

  1. DMS でクラスターに接続した後、左側のナビゲーションペインでデータベースインスタンス > [ログイン中のインスタンス] リストに移動し、対象のクラスターを右クリックして[インスタンスの編集]を選択します。

  2. [インスタンスの編集] ダイアログボックスの 概要 で、[接続方法]Connection String に変更します。次に、クラスターのエンドポイント を入力し、[保存] をクリックします。

  3. 元の SQL ウィンドウは、引き続き プライマリアドレス を使用しています。Connection String を変更した後、元の SQL ウィンドウを閉じて新しいウィンドウを開く必要があります。この操作により、新しい接続設定が適用されます。