Tous les produits
Search
Centre de documentation

PolarDB:Natural language to SQL with an LLM

Dernière mise à jour :Aug 11, 2026

Pour rendre l'analyse des données accessible aux utilisateurs non familiers avec le SQL, PolarDB for AI intègre un modèle d'IA propriétaire dédié à la conversion du langage naturel en SQL via un grand modèle de langage (LLM-based NL2SQL). Contrairement aux méthodes NL2SQL traditionnelles, le modèle LLM-based NL2SQL offre une compréhension linguistique supérieure et génère des instructions SQL prenant en charge davantage de fonctions, telles que l'arithmétique sur les dates. Il interprète même des relations de mappage simples, comme valid->isValid=1. Une fois affiné correctement, il assimile vos schémas SQL récurrents, par exemple en appliquant automatiquement des conditions telles que datastatus=1.

Exemple

/*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');
output: 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;

Flux de travail NL2SQL

Pour vous accompagner dans la mise en œuvre d'applications NL2SQL, nous avons structuré le processus en trois phases : démarrage rapide, optimisation et ajustement, puis déploiement en production.

  • Phase de démarrage rapide : cette étape permet de mettre en place rapidement les capacités NL2SQL fondamentales.

  • Phase d'optimisation et d'ajustement : elle se concentre sur l'optimisation approfondie adaptée à vos scénarios métier spécifiques.

  • Phase de déploiement en production : elle concerne le déploiement de votre système NL2SQL dans l'environnement de production.

image

Prérequis

  • Ajoutez un nœud d'IA et créez un compte de base de données associé. Pour plus d'informations, consultez Activer la fonctionnalité PolarDB for AI.

    Remarque
    • Si vous avez ajouté un nœud d'IA lors de l'achat du cluster, vous pouvez directement créer un compte de base de données pour ce nœud.

    • Le compte de base de données du nœud d'IA doit disposer des autorisations Read/Write afin de lire et écrire dans la base de données cible.

  • Connectez-vous au cluster PolarDB en utilisant le Cluster Endpoint. Pour plus d'informations, consultez Se connecter à PolarDB for AI.

    Important
    • Lors d'une connexion au cluster via la ligne de commande, ajoutez l'option -c.

    • Lorsque vous utilisez PolarDB for AI dans Data Management (DMS), la connexion au cluster PolarDB s'effectue par défaut via l'Primary address, ce qui empêche le routage des instructions SQL vers le nœud d'IA. Modifiez donc manuellement l'adresse de connexion pour utiliser le Cluster Endpoint.

Remarques

  • Formulation des questions : une question bien formulée comprend une condition, des valeurs de colonnes cibles et éventuellement un nom de colonne. Par exemple :

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

    Dans cet exemple, 'with more than one room' constitue la condition, 'house' et 'apartment' sont les valeurs de colonnes, tandis que 'property name' représente un nom de colonne possible.

  • Précision des résultats de requête : les performances du modèle LLM-based NL2SQL dépendent de plusieurs facteurs. Pour garantir des résultats conformes à vos attentes, tenez compte des éléments suivants :

    • Richesse des commentaires de tables et de colonnes : ajouter des commentaires détaillés à chaque table et colonne améliore la précision des requêtes.

    • Adéquation entre la question et les commentaires de colonnes : plus la correspondance sémantique entre les mots-clés de votre question et les commentaires de colonnes est étroite, plus la requête sera précise.

    • Longueur de l'instruction SQL générée : moins il y a de colonnes impliquées et plus les conditions sont simples, plus la requête gagne en précision.

    • Complexité logique de l'instruction SQL générée : une syntaxe moins avancée contribue également à améliorer la précision de la requête.

Utilisation

Normaliser les tables de données

Pour que le modèle LLM-based NL2SQL fonctionne correctement, il doit comprendre vos tables de données ainsi que leurs colonnes. Avant de commencer, ajoutez donc des commentaires à vos tables et colonnes les plus utilisées.

  • Commentaires de table

    Les commentaires de table aident le modèle LLM-based NL2SQL à comprendre le contenu d'une table, ce qui lui permet de localiser précisément les tables nécessaires à une requête. Un bon commentaire résume succinctement les données de la table (par exemple, « commandes » ou « inventaire »), ne dépasse pas dix mots et évite les détails superflus.

  • Commentaires de colonne

    Les commentaires de colonne doivent être des noms communs ou des expressions décrivant fidèlement les données de la colonne, tels que « ID de commande », « Date » ou « Nom du magasin ». Vous pouvez également inclure des exemples de données ou des mappages de valeurs dans le commentaire. Par exemple, pour une colonne nommée isValid, le commentaire peut être Indicates whether the item is valid. 0: No. 1: Yes..

Remarque

Si vous ne pouvez pas modifier les commentaires existants, utilisez la fonctionnalité de commentaires personnalisés pour les tables et les colonnes afin de les remplacer. Pour plus d'informations, consultez Utilisation avancée - Commentaires personnalisés pour les tables et les colonnes.

Préparation des données

Remarque

Vous pouvez préparer des données de test reflétant votre scénario métier. Les exemples de cette rubrique utilisent le jeu de données de test suivant : Test Dataset.sql.

  1. Créer une table d'index de recherche

    Pour extraire des données d'une table, créez une table d'index de recherche correspondante. Vous pouvez spécifier un nom de table personnalisé conforme aux conventions de nommage de la base de données. Cette rubrique utilise schema_index comme exemple. L'instruction SQL suivante crée une table d'index de recherche :

    /*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));
    Remarque
    • La table d'index de recherche n'apparaît pas dans la liste standard des tables. Pour consulter ses informations, exécutez l'instruction /*polar4ai*/SHOW TABLES;.

    • Pour supprimer une table d'index de recherche, telle que schema_index, exécutez l'instruction /*polar4ai*/DROP TABLE IF EXISTS schema_index;.

  2. Importer les informations des tables de données dans la table d'index de recherche

    L'instruction suivante demande à PolarDB for AI de vectoriser toutes les tables de la base de données actuelle. Par défaut, l'échantillonnage des valeurs de colonnes est désactivé.

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

    Paramètres

    • _polar4ai_text2vec correspond au modèle d'intégration de texte.

    • Après INTO, indiquez le nom de la table d'index de recherche créée à l'Étape 1 : Créer une table d'index de recherche.

    • Configurez les paramètres suivants dans la clause WITH() :

      Parameter

      Required

      Description

      mode

      Yes

      Mode d'écriture des données. Définissez ce paramètre sur async pour activer le mode asynchrone.

      resource

      Yes

      Type de ressource. Définissez ce paramètre sur schema pour indiquer que la vectorisation porte sur les informations des tables de données.

      tables_included

      No

      Spécifie les tables à vectoriser.

      La valeur par défaut est '', ce qui signifie que toutes les tables sont vectorisées. Pour cibler plusieurs tables, fournissez leurs noms sous forme de chaîne unique séparée par des virgules.

      to_sample

      No

      Détermine s'il faut échantillonner les valeurs de colonnes. L'échantillonnage augmente le temps d'importation des données, mais peut améliorer la qualité du SQL généré pour les tables comportant moins de 15 colonnes. Valeurs valides :

      • 0 (par défaut) : aucun échantillonnage des valeurs de colonnes.

      • 1 : active l'échantillonnage des valeurs de colonnes.

      columns_excluded

      No

      Spécifie les colonnes à exclure des opérations LLM-based NL2SQL.

      La valeur par défaut est '', ce qui signifie que toutes les colonnes de toutes les tables impliquées dans la conversion vectorielle participent à l'opération LLM-based NL2SQL ultérieure. Lorsque vous définissez ce paramètre, concaténez les colonnes à exclure de l'opération LLM-based NL2SQL ultérieure en une chaîne au format table_name1.column_name1,table_name1.column_name2,table_name2.column_name1.

      Exemple : cette instruction vectorise les tables graph_info, image_info et text_info de la base de données actuelle, tout en activant l'échantillonnage des valeurs de colonnes. Elle exclut également la colonne time de la table graph_info ainsi que la colonne ext de la table text_info des opérations LLM-based 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. Vérifier l'état de la tâche

    L'instruction d'importation renvoie un task_id, tel que bce632ea-97e9-11ee-bdd2-492f4dfe0918. Utilisez cet identifiant avec la commande suivante pour vérifier l'état de la tâche. Celle-ci est terminée lorsque l'état affiche finish.

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

    Exécutez l'instruction SQL suivante pour consulter les informations de l'index de recherche :

    /*polar4ai*/SELECT * FROM schema_index;

Utiliser LLM-based NL2SQL

Syntaxe

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

Paramètres

  • Remplacez <question> par votre question en langage naturel. Le tableau suivant fournit des exemples.

    Exemples de la rubrique

    Autres scénarios

    Afficher les noms des enseignants et les cours qu'ils dispensent, triés par ordre alphabétique croissant selon le nom de l'enseignant.

    Trouver les 10 étudiants ayant le plus de demandes d'absence, les trier par ordre décroissant selon le nombre d'absences, puis afficher leurs noms et le nombre d'absences.

    Rechercher les noms et les lieux des cours organisés entre le 1er octobre 2023 et le 3 octobre 2023.

    Pour les étudiants inscrits à plus de deux cours, afficher leurs noms et le nombre de cours, triés par ordre décroissant selon ce nombre.

    Trouver les noms et numéros de téléphone des étudiants dont l'adresse contient « Beijing » ou « Shanghai ».

    Quels sont les identifiants, rôles et noms des professionnels ayant effectué au moins deux traitements ?

    Quel est le nom de la race de chien la plus couramment détenue ?

    Quel propriétaire a payé le plus cher pour le traitement de son chien ? Indiquez l'identifiant et le nom de famille du propriétaire.

    Donnez-moi l'identifiant et le nom de famille du propriétaire ayant dépensé le plus pour le traitement de son chien.

    Quelle est la description du type de traitement présentant le coût total le plus faible ?

  • Configurez les paramètres suivants dans la clause WITH() :

    Parameter

    Required

    Description

    basic_index_name

    Yes

    Nom de la table d'index de recherche dans la base de données actuelle.

    to_optimize

    No

    Indique s'il faut optimiser le SQL. Valeurs valides :

    • 0 (par défaut) : aucune optimisation n'est effectuée.

    • 1 : active l'optimisation SQL. PolarDB for AI réécrit le SQL généré afin d'en améliorer les performances.

    basic_index_top

    No

    Nombre maximal de tables pertinentes à rappeler. Doit être un entier compris entre 1 et 10.

    • La valeur par défaut est 3. Une valeur de 1 suffit généralement pour les requêtes portant sur une seule table.

    • Si une requête implique plusieurs tables, définissez cette valeur à 4 ou plus afin d'élargir le rappel et d'améliorer les résultats.

    basic_index_threshold

    No

    Seuil de similarité pour le rappel des tables. La valeur doit se situer dans l'intervalle (0,1].

    La valeur par défaut est 0,1. Une table n'est rappelée que si son score de pertinence dépasse ce seuil.

Exemples

  • Exemple 1 : requête simple avec tri

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Show the names of teachers and the courses they teach, sorted in ascending alphabetical order by teacher name.') 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;
  • Exemple 2 : requête conditionnelle avec limitation et tri

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Find the 2 students with the most leave requests, sort them in descending order by the number of leave requests, and show their names and the leave count.') 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;

Utilisation avancée

PolarDB for AI propose quatre scénarios d'utilisation avancée. Si vous rencontrez les problèmes suivants, reportez-vous aux instructions correspondantes.

  • Configurer des modèles de questions : configurez des modèles de questions génériques afin que le modèle puisse générer des instructions SQL basées sur des connaissances spécifiques.

  • Créer une table de configuration : prétraitez les questions ou post-traitez les instructions SQL générées.

  • Personnaliser les commentaires de tables et de colonnes : si vous ne pouvez pas modifier les commentaires d'origine des tables ou des colonnes, ajoutez de nouveaux commentaires pour les remplacer.

  • Prise en charge des tables larges : lorsqu'une table contient trop de colonnes ou si vous rencontrez l'erreur Please use column index to avoid oversize table information., créez une table d'index de colonnes pour permettre au modèle de traiter ces tables larges.

Configurer des modèles de questions

Les modèles de questions aident le modèle à comprendre les questions des utilisateurs dans des domaines de connaissances spécifiques. Configurez des modèles de questions généraux pour fournir au modèle des connaissances précises, qu'il utilisera ensuite pour générer du SQL.

Procédure

  1. Créer une table de modèles de questions

    Le nom de la table de modèles de questions doit commencer par polar4ai_nl2sql_pattern, et son schéma doit inclure les cinq colonnes définies dans l'instruction CREATE TABLE suivante.

    DROP TABLE IF EXISTS `polar4ai_nl2sql_pattern`;
    CREATE TABLE `polar4ai_nl2sql_pattern` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',
      `pattern_question` text COMMENT 'Template question',
      `pattern_description` text COMMENT 'Template description',
      `pattern_sql` text COMMENT 'Template SQL',
      `pattern_params` text COMMENT 'Template parameters',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

    Description des colonnes

    Parameter

    Description

    template question

    Question paramétrée servant d'entrée au modèle LLM-based NL2SQL.

    Dans la question modèle, écrivez les paramètres au format #{XXX}.

    template description

    Résumé de la question modèle, où les entités telles que les dates, années ou organisations sont extraites sous forme de paramètres. Ces entités correspondent généralement à des colonnes spécifiques d'une table.

    Dans la description du modèle, écrivez les paramètres au format [XXX], et respectez l'ordre des paramètres de la question modèle.

    template SQL

    Instruction SQL correcte correspondant à la question modèle. Dans ce SQL, les paramètres de la question modèle sont traités comme des variables.

    Remarque

    Les paramètres de la question modèle et du SQL modèle n'ont pas besoin d'être identiques, mais ils doivent être liés. Par exemple, les paramètres peuvent partager un préfixe commun et leurs valeurs peuvent avoir un mappage un à un. Avec #{category} et #{categoryCode}, lorsque les valeurs de paramètre pour category sont « ordinary trademark », « special trademark » et « collective trademark », les valeurs correspondantes de categoryCode sont respectivement 0, 1 et 2. Pour plus de détails, consultez l'exemple ci-dessous.

    template parameters

    Chaîne JSON composée de trois paramètres : table_name, param_info et explanation.

    • table_name string : nom de la table utilisée dans le SQL modèle.

    • param_info array : description des paramètres dans le SQL modèle.

      • param_name string : nom du paramètre.

      • value array : exemples de valeurs pour le paramètre.

        Remarque
        • Si le paramètre possède un ensemble fini de valeurs énumérées, listez-les toutes dans le tableau value si possible.

        • Si vous ne fournissez que des exemples de valeurs, indiquez-en 2 à 4.

        • Si les paramètres sont interdépendants, mappez-les à l'aide de l'index du tableau. Par exemple, avec #{category} et #{categoryCode}, « ordinary trademark » dans category correspond à 0 dans categoryCode, et « special trademark » correspond à 1 dans categoryCode. Pour plus de détails, consultez l'exemple ci-dessous.

    • explanation string : notes supplémentaires décrivant généralement les exigences relatives au SQL généré, telles que les informations à retourner ou la manière d'interpréter certains champs.

    Remarque

    Si les paramètres du modèle ne sont pas nécessaires, définissez la valeur sur l'une des options suivantes :

    • NULL

    • Une chaîne vide

    • Une chaîne de liste vide : []

    Exemple

    Template question

    Template description

    Template SQL

    Template parameters

    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": "Output the course name (course_name), course time (course_time), and course location (course_location). Note: status is a constant mapping type. The variable mapping field is statusCode."}]

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

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

    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":"Output standard name (projectCnName), plan number, and project status."}]

    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":"Output trademark name (tmName), application/registration number (regNo), and trademark status (status). Note: category is a constant mapping type. The variable mapping field is categoryCode. intCls is a constant mapping type. The variable mapping field is intClsCode."}]

    Par exemple, pour créer la première question modèle présentée dans le tableau ci-dessus, exécutez le SQL suivant :

    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】【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": "Output the course name (course_name), course time (course_time), and course location (course_location). Note: status is a constant mapping type. The variable mapping field is statusCode."}]');
  2. Créer une table d'index de modèles de questions

    Vous pouvez utiliser un nom personnalisé pour la table d'index, à condition qu'il respecte les conventions de nommage de la base de données. Cet exemple utilise pattern_index. Exécutez le SQL suivant pour créer la table d'index de modèles de questions :

    /*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));
    Remarque
    • La table d'index de modèles de questions n'apparaît pas dans la liste des objets de la base de données. Pour la consulter, exécutez /*polar4ai*/SHOW TABLES;.

    • Pour supprimer la table d'index de modèles de questions, par exemple pattern_index, exécutez l'instruction SQL /*polar4ai*/DROP TABLE IF EXISTS pattern_index;.

  3. Importer des données dans la table d'index

    Remarque

    La table de modèles de questions ne peut pas être vide. Avant d'exécuter le SQL d'importation, ajoutez au moins un enregistrement.

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

    Paramètres

    • _polar4ai_text2vec est le modèle de vectorisation de texte.

    • Après INTO, spécifiez le nom de la table d'index de modèles de questions créée à l'Étape 2.

    • Configurez plusieurs paramètres dans la clause WITH() :

      Parameter

      Required

      Description

      mode

      Yes

      Spécifie le mode d'écriture. Définissez-le sur async pour le mode asynchrone.

      resource

      Yes

      Spécifie le type de ressource. Définissez-le sur pattern pour vectoriser les informations des modèles de questions.

      pattern_table_name

      No

      Nom de la table de modèles de questions à vectoriser. Il s'agit du nom de table issu de l'Étape 1.

      La valeur par défaut est polar4ai_nl2sql_pattern, ce qui signifie que la vectorisation est effectuée sur la table polar4ai_nl2sql_pattern. Si vous définissez ce paramètre, spécifiez un nom de table commençant par polar4ai_nl2sql_pattern.

      Si vous souhaitez maintenir différentes tables d'index de modèles de questions pour divers scénarios ou domaines métier, spécifiez différents noms de tables lors de leur création. Par exemple, si vous créez une table polar4ai_nl2sql_pattern_user pour des scénarios liés aux utilisateurs, définissez le nom de l'index sur pattern_index_user à l'étape 2. Lors de l'importation des informations, utilisez l'instruction SQL suivante :

      /*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. Vérifier l'état de la tâche

    Après l'exécution de l'instruction d'importation, le système renvoie un task_id, tel que bce632ea-97e9-11ee-bdd2-492f4dfe0918. Exécutez la commande suivante pour vérifier l'état de la tâche.

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

    Lorsque l'état de la tâche est finish, l'importation est terminée et le modèle peut référencer les informations du modèle de questions. Exécutez l'instruction SQL suivante pour consulter les informations de l'index de modèles de questions :

    /*polar4ai*/SELECT * FROM pattern_index;
    Remarque

    Si les données de la table polar4ai_nl2sql_pattern changent, réexécutez la procédure décrite à l'Étape 3.

  5. Exécuter une requête en ligne avec des modèles de questions

    Exécutez l'instruction SQL suivante pour effectuer une requête en ligne utilisant LLM-based NL2SQL et des modèles de questions :

    /*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;

    Paramètres

    • Après SELECT, saisissez la question à convertir en SQL.

    • basic_index_name correspond au nom de la table d'index de recherche de la base de données actuelle.

    • pattern_index_name correspond au nom de la table d'index de modèles de questions.

    • Configurez plusieurs paramètres dans la clause WITH(). Pour la description des autres paramètres, consultez Exécuter une requête en ligne avec LLM-based NL2SQL.

      Parameter

      Description

      Value range

      pattern_index_top

      Nombre de modèles de questions les plus proches à rappeler.

      Plage de valeurs : [1,10].

      La valeur par défaut est 2, ce qui signifie que seuls les 2 premiers modèles sont rappelés pour la question en cours.

      pattern_index_threshold

      Seuil de similarité pour le rappel d'un modèle de questions.

      Plage de valeurs : (0,1].

      La valeur par défaut est 0,85, ce qui signifie qu'un modèle n'est sélectionné que si son score de similarité vectorielle dépasse 0,85.

Créer une table de configuration

Utilisez une table de configuration pour prétraiter les questions ou post-traiter le SQL généré.

Cas d'utilisation

  • Scénario 1 : Remplacer des termes spécifiques dans une question, tels que des noms, du jargon industriel ou des noms de produits.

    Par exemple : pour toutes les questions impliquant Zhang San, remplacez Zhang San par ZS001. Ainsi, pour les questions What were Zhang San's sales last month? et What are Zhang San's total sales for this year?, utilisez une table de configuration pour les prétraiter en What were ZS001's sales last month? et What are ZS001's total sales for this year? avant l'appel final au grand modèle de langage.

  • Scénario 2 : Ajouter un contexte supplémentaire aux questions contenant des termes spécifiques.

    Par exemple, pour toutes les questions impliquant Total Sales, la formule de calcul Total Sales = SUM(Sales) doit être ajoutée. Avant l'appel final au grand modèle, intégrez ces informations via une table de configuration ; elles seront ajoutées lorsque la question remplit la condition correspondante.

  • Scénario 3 : Mapper et remplacer des valeurs pour des tables ou colonnes spécifiques dans le SQL final.

    Par exemple, pour toutes les instructions SQL impliquant finalement la table student_courses, remplacez status = 'leave' par status = 0 comme mesure de secours pour le mappage des valeurs de colonnes.

Syntaxe

Utilisez l'instruction SQL suivante pour créer la table de configuration. Le nom de la table polar4ai_nl2sql_llm_config est fixe et ne peut pas être modifié.

DROP TABLE IF EXISTS `polar4ai_nl2sql_llm_config`;
CREATE TABLE `polar4ai_nl2sql_llm_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `is_functional` int(11) NOT NULL DEFAULT '1' COMMENT 'Indicates if the configuration row is active',
  `text_condition` text COMMENT 'Text condition for pre-processing',
  `query_function` text COMMENT 'Query processing function',
  `formula_function` text COMMENT 'Formula information function',
  `sql_condition` text COMMENT 'SQL condition for post-processing',
  `sql_function` text COMMENT 'SQL processing function',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Remarque

Les modifications apportées aux données de la table polar4ai_nl2sql_llm_config prennent effet immédiatement. Aucune opération supplémentaire n'est requise.

Paramètres

Parameter

Description

Value

Example

is_functional

Indique si la règle de cette ligne est active.

Par défaut, toutes les règles de la table de configuration s'appliquent à chaque requête NL2SQL. Pour désactiver temporairement une règle de configuration sans la supprimer, définissez is_functional sur 0.
  • 1 (par défaut) : active

  • 0 : inactive

  • Si is_functional=1, la configuration est active.

  • Si is_functional=0, la configuration est inactive.

text_condition

Prétraitement : évalue une condition par rapport au texte de la question.

Si la condition est remplie, les fonctions des colonnes query_function et formula_function sont appliquées.
  • Prend en charge trois opérateurs logiques : && (ET), || (OU) et !! (NON).

  • Si text_condition est vide ou est une chaîne vide, la condition correspond à toutes les questions.

Si text_condition est John||Lisa&&!Wang, cela indique que la condition est remplie si la question contient John, ou si elle contient « Lisa » et ne contient pas « Wang ».

Par exemple :

  • Question : What are Zhang San's total sales this year? Réponse : la condition est remplie.

  • Question What are Li Si's total sales this year? : la condition est remplie.

  • Question What is the total sales amount for Lisi and Wangwu this year? : la condition n'est pas remplie.

query_function

Prétraitement : transforme le texte de la question.

Cette fonction est appliquée lorsque text_condition correspond.
  • Méthodes prises en charge : append, delete et replace.

  • La valeur doit être une chaîne JSON.

Si query_function est {"append":["一","二"],"delete":["?"],"replace":{"张三":"a","李四":"b"}}, cela signifie que lorsque text_condition correspond, 一 et 二 sont ajoutés à la fin de la question, et ? est supprimé de la question. Enfin, 张三 dans la question est remplacé par a, et 李四 est remplacé par b.

Par exemple :

  • Question Zhang San this year total sales is how much? : lorsque text_condition correspond, elle est finalement traitée comme a this year total sales is how much one two.

  • La question What is Li Si's total sales for this year? : lorsque text_condition correspond, elle est finalement traitée en b what is the total sales for this year one two.

formula_function

Prétraitement : ajoute des informations contextuelles, telles qu'une formule, pour des concepts métier spécifiques dans une question.

Cette fonction est appliquée lorsque text_condition correspond.

-

Si formula_function est Total Sales: SUM(Sales Amount), alors lors du traitement final, le montant total des ventes dans la question est traité avec la formule SUM(Sales Amount) comme information supplémentaire.

sql_condition

Post-traitement : évalue une condition par rapport à l'instruction SQL générée par le modèle.

Si la condition est remplie, la fonction de la colonne sql_function est appliquée.

  • Prend en charge trois opérateurs logiques : && (ET), || (OU) et !! (NON).

  • Si sql_condition est vide ou est une chaîne vide, la condition correspond à toutes les instructions SQL générées.

Si sql_condition est students||student_courses&&!!courses, la condition correspond si l'instruction SQL référence la table students ou la table student_courses, mais pas la table courses.

Par exemple :

  • Instruction SQL SELECT * FROM student_courses : correspond.

  • Instruction SQL SELECT c.course_name FROM student_courses sc JOIN courses c ON sc.courses_id = c.id; : ne correspond pas.

sql_function

Post-traitement : transforme le SQL généré. Cela est utile pour appliquer des mappages de valeurs basés sur la logique métier.

Cette fonction est appliquée lorsque sql_condition correspond.

  • Seule la méthode replace est actuellement prise en charge.

  • La valeur doit être une chaîne JSON.

Si sql_function est défini sur {"replace":{"status = 'on leave'":"status = 0","status = 'on duty'":"status = 1"}}, lorsque sql_condition correspond, status = 'on leave' dans le SQL est remplacé par status = 0, et status = 'on duty' est remplacé par status = 1.

Exemple

is_functional

text_condition

query_function

formula_function

sql_condition

sql_function

1

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

{"append":["one","two"],"delete":["?"],"replace":{"Zhangsan":"a","Lisi":"b"}}

1

Total Sales: SUM(Sales)

1

students||student_courses&&!!courses

{"replace":{"status = 'Leave'":"status = 0","status = 'Present'":"status = 1"}}

  1. Exécutée sans table de configuration, la requête suivante :

    /*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. Créez la table de configuration comme décrit dans la section Syntaxe.

  3. Ajoutez un enregistrement de configuration. Cette règle stipule que si une instruction SQL référence la table students ou la table student_courses, mais pas la table courses, le système remplace status = 0 par status = 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. Exécutez à nouveau la requête de l'étape 1. La valeur status dans le SQL généré est désormais remplacée conformément à la règle.

    /*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;

Personnaliser les commentaires de tables et de colonnes

Si vous ne pouvez pas modifier les commentaires d'origine d'une table ou d'une colonne comme décrit dans Préparer vos tables de données, ajoutez des commentaires personnalisés dans la table polar4ai_nl2sql_table_extra_info. Ces commentaires remplacent les commentaires d'origine lorsque vous utilisez LLM-based NL2SQL.

Syntaxe

L'instruction SQL suivante crée la table de commentaires personnalisés. Le nom de la table polar4ai_nl2sql_table_extra_info ne peut pas être modifié.

DROP TABLE IF EXISTS `polar4ai_nl2sql_table_extra_info`;
CREATE TABLE `polar4ai_nl2sql_table_extra_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',
  `table_name` text COMMENT 'Table name',
  `table_comment` text COMMENT 'Table description',
  `column_name` text COMMENT 'Column name',
  `column_comment` text COMMENT 'Column description',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Remarque

Si vous modifiez les données de la table polar4ai_nl2sql_table_extra_info, réexécutez l'étape consistant à importer les informations des tables de données dans l'index de schéma pour que les modifications prennent effet.

Exemple

  1. Créez la table de commentaires personnalisés.

  2. Mettez à jour le commentaire de la colonne status dans la table student_courses. Cet exemple ajoute un nouveau mappage d'options : 2-Absent.

    INSERT INTO `polar4ai_nl2sql_table_extra_info` (`table_name`,`table_comment`,`column_name`,`column_comment`) VALUES ('student_courses','Student-course information table','status','Student status: 0-On leave, 1-Normal, 2-Absent.');
  3. Réexécutez l'étape consistant à importer les informations des tables de données dans l'index de schéma.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;
  4. Vérifiez l'état de la tâche.

    Après l'exécution de l'instruction d'importation, le système renvoie un task_id, tel que bce632ea-97e9-11ee-bdd2-492f4dfe0918. Utilisez la commande suivante pour vérifier l'état de l'importation. Lorsque taskStatus est finish, la tâche est terminée.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  5. Exécutez une requête en utilisant LLM-based 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;

    Le résultat montre que le modèle LLM-based NL2SQL mappe désormais correctement Absent à la valeur 2 pour la colonne status dans la table student_courses.

Prise en charge des tables larges

Si vos tables de données incluent des tables larges comportant de nombreuses colonnes, ou si vous recevez l'erreur Please use column index to avoid oversize table information. lors de l'utilisation de LLM-based NL2SQL, suivez cette procédure.

Remarque

Lorsque vous utilisez LLM-based NL2SQL en ligne, basic_index_name et pattern_index_name dans la clause WITH() peuvent tous deux utiliser le même column_index_name. Contrairement à l'indexation schema ou pattern, cette méthode sert uniquement à simplifier les informations.

Pour la plupart des requêtes, le paramètre column_index_name n'a aucun effet. Il n'est requis que pour les requêtes NL2SQL qui déclenchent la limite de longueur. Dans ces cas-là, column_index_name simplifie les informations de la table. Cela peut entraîner une légère perte de précision, mais empêche efficacement les erreurs du modèle LLM-based NL2SQL causées par un prompt trop long.

  1. Créez une table d'index de colonnes.

    Vous pouvez utiliser un nom personnalisé pour la table d'index de colonnes, à condition qu'il respecte les conventions de nommage de la base de données et n'entre pas en conflit avec les noms des tables existantes. Une seule table d'index de colonnes est nécessaire par base de données. Utilisez l'instruction CREATE TABLE suivante :

    /*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));
    Remarque
    • La table d'index de colonnes n'est pas affichée directement dans la base de données. Pour consulter ses informations, exécutez l'instruction SQL /*polar4ai*/SHOW TABLES;.

    • Pour supprimer la table d'index de colonnes, par exemple column_index, exécutez l'instruction SQL /*polar4ai*/DROP TABLE IF EXISTS column_index;.

  2. Importez les informations au niveau des colonnes depuis les tables de données vers la table d'index de colonnes.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, select '') WITH (mode='async', resource='column') into column_index;
  3. Vérifiez l'état de la tâche.

    Après l'exécution de l'instruction d'importation, le système renvoie un task_id, tel que bce632ea-97e9-11ee-bdd2-492f4dfe0918. Exécutez la commande suivante pour consulter l'état de l'importation. La tâche est terminée lorsque taskStatus est finish.

    /*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
  4. Utilisez LLM-based NL2SQL en ligne avec des tables larges.

    /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Sort by teacher name in ascending alphabetical order, and display the teacher''s name and the names of the courses they teach.') WITH (basic_index_name='schema_index', column_index_name='column_index');

FAQ

Erreur de syntaxe avec AI SQL

L'exécution d'une requête AI SQL (une instruction SQL préfixée par /*polar4ai*/) avec la fonctionnalité PolarDB for AI dans DMS peut déclencher l'erreur suivante : 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. Cette erreur survient car la connexion DMS n'est pas configurée sur le Cluster Endpoint de votre cluster PolarDB.

La fonctionnalité PolarDB for AI s'exécute sur un nœud d'IA, mais DMS se connecte à un cluster PolarDB en utilisant l'Primary address par défaut. Modifiez donc l'adresse de connexion dans DMS.

  1. Dans DMS, après vous être connecté au cluster, accédez à la liste Database Instance > Logged-in Instances dans le volet de navigation de gauche. Cliquez avec le bouton droit sur le cluster cible et sélectionnez Edit Instance.

  2. Dans la boîte de dialogue Edit Instance, sous Overview, remplacez Entry Method par Connection String. Ensuite, saisissez le Cluster Endpoint et cliquez sur Save.

  3. La fenêtre SQL d'origine utilise toujours l'Primary address. Après avoir modifié la Connection String, fermez la fenêtre SQL d'origine et ouvrez-en une nouvelle. Cette action applique les nouveaux paramètres de connexion.