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.
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.
RemarqueSi 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.
ImportantLors 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 êtreIndicates whether the item is valid. 0: No. 1: Yes..
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
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.
-
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_indexcomme 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));RemarqueLa 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;.
-
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_text2veccorrespond 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
asyncpour activer le mode asynchrone.resource
Yes
Type de ressource. Définissez ce paramètre sur
schemapour 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 formattable_name1.column_name1,table_name1.column_name2,table_name2.column_name1.Exemple : cette instruction vectorise les tables
graph_info,image_infoettext_infode la base de données actuelle, tout en activant l'échantillonnage des valeurs de colonnes. Elle exclut également la colonnetimede la tablegraph_infoainsi que la colonneextde la tabletext_infodes 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; -
-
Vérifier l'état de la tâche
L'instruction d'importation renvoie un
task_id, tel quebce632ea-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 affichefinish./*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
-
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'instructionCREATE TABLEsuivante.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.
RemarqueLes 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 pourcategorysont « ordinary trademark », « special trademark » et « collective trademark », les valeurs correspondantes decategoryCodesont 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_infoetexplanation.-
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 » danscategorycorrespond à 0 danscategoryCode, et « special trademark » correspond à 1 danscategoryCode. 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.
RemarqueSi 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."}]'); -
-
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));RemarqueLa 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;.
-
Importer des données dans la table d'index
RemarqueLa 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_text2vecest 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
asyncpour le mode asynchrone.resource
Yes
Spécifie le type de ressource. Définissez-le sur
patternpour 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 tablepolar4ai_nl2sql_pattern. Si vous définissez ce paramètre, spécifiez un nom de table commençant parpolar4ai_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_userpour des scénarios liés aux utilisateurs, définissez le nom de l'index surpattern_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;
-
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 quebce632ea-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;RemarqueSi les données de la table
polar4ai_nl2sql_patternchangent, réexécutez la procédure décrite à l'Étape 3. -
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_namecorrespond au nom de la table d'index de recherche de la base de données actuelle.pattern_index_namecorrespond 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, remplacezZhang SanparZS001. Ainsi, pour les questionsWhat were Zhang San's sales last month?etWhat are Zhang San's total sales for this year?, utilisez une table de configuration pour les prétraiter enWhat were ZS001's sales last month?etWhat 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 calculTotal 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, remplacezstatus = 'leave'parstatus = 0comme 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;
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. |
|
|
|
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. |
|
Si text_condition est Par exemple :
|
|
query_function |
Prétraitement : transforme le texte de la question. Cette fonction est appliquée lorsque text_condition correspond. |
|
Si query_function est Par exemple :
|
|
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 |
|
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. |
|
Si sql_condition est Par exemple :
|
|
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. |
|
Si sql_function est défini sur |
Exemple
|
is_functional |
text_condition |
query_function |
formula_function |
sql_condition |
sql_function |
|
1 |
|
|
|||
|
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; Créez la table de configuration comme décrit dans la section Syntaxe.
-
Ajoutez un enregistrement de configuration. Cette règle stipule que si une instruction SQL référence la table
studentsou la tablestudent_courses, mais pas la tablecourses, le système remplacestatus = 0parstatus = 10.INSERT INTO `polar4ai_nl2sql_llm_config` (`is_functional`,`sql_condition`,`sql_function`) VALUES (1,'students||student_courses&&!!courses','{"replace":{"status = 0":"status = 10"}}'); -
Exécutez à nouveau la requête de l'étape 1. La valeur
statusdans 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;
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
Créez la table de commentaires personnalisés.
-
Mettez à jour le commentaire de la colonne
statusdans la tablestudent_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.'); -
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; -
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 quebce632ea-97e9-11ee-bdd2-492f4dfe0918. Utilisez la commande suivante pour vérifier l'état de l'importation. LorsquetaskStatusestfinish, la tâche est terminée./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`; -
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
statusdans la tablestudent_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.
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.
-
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));RemarqueLa 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;.
-
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; -
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 quebce632ea-97e9-11ee-bdd2-492f4dfe0918. Exécutez la commande suivante pour consulter l'état de l'importation. La tâche est terminée lorsquetaskStatusestfinish./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`; -
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');