Des démos de conversion NL vers SQL à un assistant d’analyse IA en environnement isolé
Des démos de NL vers SQL à un assistant d’analyse IA en environnement isolé : listes d’autorisation de schémas, vérifications statiques, exécution isolée, limites de résultats et journaux d’audit pour chaque requête.
Sources: From “Natural Language to SQL” to a Secure AI Analytics Assistant: An Architecture Evolution
Permettre à un modèle de langage d’écrire et d’exécuter du code pour l’analyse est un problème de défense en profondeur, et non une astuce liée aux prompts.
Le problème de base
Les utilisateurs métier ont des questions — « prix moyen des maisons par ville », « dix propriétés les plus chères », « prix le plus élevé par pied carré » — mais ne possèdent pas de compétences en SQL. La solution évidente est la conversion du langage naturel en SQL : poser des questions en anglais, générer une requête et l’exécuter.
Version un : conversion directe du langage naturel en SQL
Les premières versions génèrent du SQL à partir de la question et l’exécutent sur le stockage de données. Les démonstrations sont impressionnantes. Puis quelqu’un demande un calcul que le SQL exprime mal, ou le modèle invente une colonne, ou encore un prompt bien conçu tente d’exécuter DROP TABLE.
SELECT city, AVG(house_price) AS avg_price
FROM house_pricing
GROUP BY city;
SELECT department, AVG(salary) FROM employees GROUP BY department;
result = (
df.groupby("department")["salary"]
.mean()
.reset_index()
)
import os
os.remove("file.csv")
import subprocess
subprocess.run(…)
Éloignement complet du SQL
Une approche plus flexible : permettre au modèle d’écrire du Python court en utilisant une API de tableau de données restreinte plutôt que des chaînes SQL brutes. Cela permet des analyses au style pandas, mais augmente également le risque en cas d’exécution non contrôlée.
Rendre les prompts fiables
Un prompt fiable signifie :
- des fiches schéma ne contenant que les tables/columnes autorisées
- des exemples de schémas sûrs basés sur peu d’exemples
- un refus explicite lorsque la question nécessite des champs interdits
- un résultat structuré (blocs de code ou JSON) que l’outil peut parser
Le problème le plus important : l’exécution de code généré par un LLM
L’exécution constitue la frontière de sécurité. Ne jamais exécuter le code du modèle dans le processus de l’application avec des privilèges complets. Utilisez un environnement isolé : pas de réseau, ressources CPU/mémoire limitées, imports autorisés uniquement, délais de timeout, et accès en lecture seule aux ensembles de données approuvés.
Superposition des mécanismes de protection
Stratégies de défense en profondeur :
- Firewall intelligent — rejette les tentatives de jailbreak et les demandes hors champ
- Liste blanche des schémas — le modèle ne voit que les champs approuvés
- Vérifications statiques — interdit les imports, l’I/O de fichiers,
evalet les sous-processus - Environnement d’exécution en sandbox — isole l’exécution
- Limits sur les résultats — plafonds de lignes et de octets avant retour à l’interface utilisateur
- Journal d’audit — identifie qui a demandé, quel code a été exécuté et quoi a été retourné
Créer une solution résiliente, pas seulement sûre
Poursuites en cas d’échecs temporaires, séquences déterministes là où c’est possible, fiches de schémas mémorisées, et escalade humaine lorsque le modèle ne peut pas répondre en toute sécurité. La sécurité sans résilience ne produit que des erreurs polies.
L’architecture qui en a résulté
Passerelle → politique → planificateur/invite → exécuteur en environnement isolé → formatteur → audit. SQL peut encore servir d’outil interne pour des filtres simples, mais Python-in-a-box gère les demandes analytiques complexes sans exposer l’ensemble du système à des instructions arbitraires.
Pourquoi ce projet s’est avéré plus intéressant
NL-to-SQL est une démonstration de traduction. Les assistants d’analyse sécurisés relèvent de l’ingénierie de produit : modèles de menaces, environnements isolés, listes d’autorisation, ainsi qu’une interface utilisateur qui explique les refus. C’est là le travail qui mérite d’être conservé.
Déployez un ensemble de tests complet : questions bénignes, questions permettant d’explorer le schéma, et tentatives d’importation malveillantes. Empêchez la compilation si un cas malveillant s’exécute en dehors de l’environnement isolé, ou si un cas bénin refuse à tort sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’installation échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’opération échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.
Envoyez une suite d’essai idéale : questions bénignes, questions de vérification du schéma et tentatives d’importation malveillantes. Laissez l’opération échouer si un cas malveillant s’exécute en dehors du sandbox ou si un cas bénin refuse faussement sans raison claire.