Vanna est un package Python qui utilise le RAG (Retrieval Augmented Generation) pour vous générer des requêtes SQL précises pour votre base de données en utilisant un modèle d’IA Générative (LLM : Large Langage Model). . Vanna est aussi capable d’interpréter le résultat de la requête. Il peut répondre sous forme de phrases, graphiques, tableaux, etc.
Vanna fonctionne simplement en deux phases :
- Une première phase de “train” où on va fournir toutes les informations nécessaires (DDL, Documentation, Requêtes SQL type) pour que le modèle LLM puisse générer le code SQL attendu.
- Une seconde phase “ask” en 3 étapes qui consiste à :
- Étape 1 - Préparation du prompt pour la création de la requête SQL : Récupérer la question de l’utilisateur final en langage naturel et la traduire en requête SQL grâce à l’apprentissage fait précédemment
- Étape 2 - Exécution de la requête : Exécuter la requête SQL obtenue sur notre base de données et récupérer le résultat tabulaire.
- Étape 3 - Traitement post-exécution de la requête et génération de la réponse : Générer la réponse en langage naturel à l’utilisateur final avec potentiellement une visualisation graphique.
Dans cet article nous allons nous concentrer sur la partie “Ask” de Vanna car c’est à cette étape que l’on va interagir avec l’intelligence artificielle. Le but est de comprendre ce qu’il se passe réellement pour générer le code SQL.
Mise en contexte
L’utilisation de Vanna nécessite les prérequis suivants :
- Une base de données SQL : Cible à interroger
- Un modèle LLM embedding : Modèle capable de générer des vecteurs à partir d’éléments textuel pour constituer la base de connaissance
- Une base vecteur : Système de base de données spécifique pour le stockage vectoriel des données d'entraînement : le schéma/DDL de la base de données cible avec sa documentation ainsi que les requêtes SQL type. Cette base sera alimentée par la suite au fil de l’utilisation.
- Un modèle LLM text : Modèle capable de générer du code SQL à partir d’un prompt en langage naturel
Pour cela, la librairie Vana fournit un certain nombre de connecteurs pour chaque prérequis. Exemples :
- Base de données SQL : Snowflake, PostgreSQL, MySql, Oracle, …
- Modèles LLM : OpenAI, Gemini, AzureOpenAI, …
- Base vecteur : Milvus, ChromaDB, FAISS
Maintenant, posons-nous une question. Que se passe-t-il lorsque l’on pose une question à Vanna ? Comment la requête SQL est-elle générée et convertie en langage naturel à l'utilisateur ?
Comment ça marche ?
Lorsque l’utilisateur pose sa question, plusieurs étapes vont être effectuées pour préparer une requête SQL.
Étape 1 : Préparation du prompt pour la création de la requête SQL
- Point d'entrée : Fonction "ask"
- Prend en argument la question de l'utilisateur
- Génération de la requête SQ
- Appel de la fonction generate_sql
- Initialisation du prompt initial
- Une fonction récupère le prompt initial si la configuration est disponible.
- Exécution de trois sous-fonctions :
- get_similar_question_sql : Trouve des questions similaires et leurs requêtes SQL correspondantes
- get_related_ddl : Récupère les DDL (Data Definition Language) pertinents
- get_related_documentation : Obtient la documentation associée
- Création du prompt initial
- Un prompt SQL est construit avec get_sql_prompt, en incluant le prompt initial, la question, et les informations récupérées ci-dessus.
Étape 2 : Exécution de la requête
Interaction avec le LLM grâce au prompt obtenu à la fin de l’étape 1.
- Envoi du prompt enrichi au modèle de langage avec la méthode ‘submit_prompt’
- Le LLM interprète la question et génère une réponse contenant du texte et du SQL. Le SQL généré est passé dans la variable ‘intermediate_sql’.
À ce niveau, deux contrôles sont réalisés et qui conditionnent la suite du traitement. Pour avancer, le LLM doit retourner une réponse contenant une requête SQL. Si c’est le cas, deux cas de figures sont possibles :
- Cas 1 : Nous autorisons la prise en compte des données retournées par la requête pour que le LLM s’en serve pour la validation de la requête. Ce résultat est ajouté au prompt, et un second prompt est envoyé au LLM pour affiner la requête SQL finale.
- Cas 2 : Nous n’autorisons pas la prise en compte des données retournées, la première requête passé dans ‘intermediate_sql’ est exécutée par la fonction run_sql .
Cas 1 : Exécution intermédaire de la requête SQL pour prendre en compte les données retournées dans la validation de la requête
À la fin de cette condition, on extrait le SQL généré par la nouvelle réponse du LLM pour ensuite l'exécuter grâce à la méthode run_sql.
Cas 2 : Exécution finale de la requête SQL
Utilisation de la fonction run_sql pour exécuter la requête dans la base de données connectée.
Étape 3 : Traitement post-exécution de la requête et génération de la réponse
- Traitement post-exécution
- Option d'utiliser la question ainsi que le résultat comme donnée d'entraînement pour enrichir la base de connaissances
- Possibilité de générer un graphique basé sur les résultat
- Génération du résumé
- Utilisation de la fonction generate_summary pour :
- Mettre en forme les résultats
- Traduire le résultat en langage naturel
- Intégrer éventuellement des graphiques ou figures
- Utilisation de la fonction generate_summary pour :
- Présentation à l'utilisateur
- Affichage d'une réponse claire et compréhensible en langage naturel
Pour conclure
Ce processus permet à Vanna AI de transformer une question en langage naturel en une requête SQL exécutable, puis de présenter les résultats de manière compréhensible pour l'utilisateur final. Il ne faut pas négliger l’étape de “Train” de Vanna qui est cruciale dans la qualité des réponses. Plus l’on entraîne un modèle, plus les réponses seront pertinentes. Pour pousser plus loin Vanna, il faudrait tester sur des modèles relationnels plus complexes. Les pistes d’amélioration de la qualité de la réponse pourraient se situer autour d’une meilleure gestion des valeurs DISTINCT pour les champs texte, cela afin d'améliorer les résultats. Il faudrait aussi tester Vanna avec les nouvelles approches, comme les agents combinés à des outils (Agentic Text-to-SQL), cela pourrait ouvrir de nouvelles perspectives et renforcer la pertinence de l’outil.
Nos développeurs Next Decision ont les compétences techniques et les environnements de travail parfaits pour répondre à vos besoins sur VannaAI. Contactez-nous pour nous parler de votre projet !