Skip to content

Construire l'outil SQL paramétré

Une fonction-outil, pas une étape de script

Section titled “Une fonction-outil, pas une étape de script”

Un outil d’agent va chercher un fait précis dans une source externe, avec une interface claire (des paramètres en entrée, un résultat structuré en sortie) — pas une simple étape de script écrite en dur pour un seul scénario.

def offer_search_tool(conn, salaire_min=None, remote=None, ville=None):
conditions, params = ["places_restantes > 0"], []
if salaire_min is not None:
conditions.append("salaire_max >= ?")
params.append(salaire_min)
if remote is not None:
conditions.append("remote = ?")
params.append(remote)
if ville is not None:
conditions.append("ville = ?")
params.append(ville)
sql = f"SELECT * FROM offres WHERE {' AND '.join(conditions)} ORDER BY salaire_max DESC"
return pd.read_sql_query(sql, conn, params=params)

Remarquez que les valeurs (salaire_min, remote, ville) ne sont jamais insérées directement dans la chaîne SQL : elles passent par des ? (place-holders) et une liste params séparée, transmise à pd.read_sql_query. C’est le pilier de la défense contre l’injection SQL : le moteur de base de données traite chaque valeur comme une donnée, jamais comme du code SQL exécutable, même si elle contient des caractères spéciaux.

# Meme une tentative d'injection ne casse rien : la valeur est comparee
# telle quelle, jamais executee comme instruction SQL.
resultats = offer_search_tool(conn, ville="Paris'; DROP TABLE offres; --")

Une requête construite par concaténation de chaînes (f"WHERE ville = '{ville}'") serait, elle, vulnérable : une valeur malveillante pourrait terminer la chaîne de caractères attendue et injecter des instructions SQL arbitraires.

Cette même fonction sert aussi bien une recherche large (aucun paramètre, toutes les offres disponibles) qu’une recherche ciblée (tous les paramètres combinés) — la boucle de décision de la leçon 4 l’appellera plusieurs fois, avec des combinaisons de critères différentes à chaque tentative.

👉 Construire l’outil de recherche sémantique


Junior TSAFACK – 12/09/2026