Exercices Projets guidés Routing intelligent des questions
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Routing intelligent des questions

Un agent intelligent ne traite pas toutes les questions de la meme facon. "Combien font 15% de 250 ?" devrait aller directement a la calculatrice, sans passer par une recherche web. "Qui est le president actuel ?" necessite une recherche. "Ecris un poeme sur Python" peut aller directement au LLM. Et "Compare les prix de AWS et GCP" necessite une recherche ET une synthese.

Ce mecanisme de tri s'appelle le routing. C'est le dispatcheur de ton agent : il analyse la question et decide quel pipeline utiliser. Un bon routing reduit les couts (pas de recherche web pour un calcul), ameliore la vitesse (moins d'etapes), et augmente la precision (le bon outil pour le bon probleme).

On va implementer un routeur a deux niveaux :
Niveau 1 : classification par mots-cles (rapide, gratuit, pas toujours precis)
Niveau 2 : classification par LLM (plus precis, mais coute des tokens)

Ecris une fonction classifier_question(question, regles) qui prend une question et un dictionnaire de regles. Chaque cle est un type de question, et la valeur est une liste de mots-cles. La fonction renvoie le type de la question selon le premier mot-cle trouve (comparaison insensible a la casse). Si aucun mot-cle ne correspond, elle renvoie "general".

Ecris aussi une fonction router_vers_pipeline(question, regles, pipelines) qui prend la question, les regles de classification, et un dictionnaire de pipelines (chaque cle est un type, la valeur est une fonction qui prend la question et renvoie un resultat). Elle classifie la question, puis execute le bon pipeline. Si le type n'a pas de pipeline associe, elle utilise le pipeline "general".

Exemple :

regles = {
"calcul": ["calcul", "combien font", "%", "pourcentage"],
"recherche": ["qui est", "quand", "actualite", "dernier"],
"code": ["ecris du code", "fonction python", "programme"],
}
classifier_question("Combien font 20% de 150 ?", regles)
renvoie "calcul"

pipelines = {
"calcul": lambda q: "Resultat calculatrice",
"recherche": lambda q: "Resultat recherche",
"general": lambda q: "Reponse directe du LLM",
}
router_vers_pipeline("Combien font 20% ?", regles, pipelines)
renvoie "Resultat calculatrice"

Tests (4/5)

Classification par mots-cles
regles = {
    "calcul": ["calcul", "combien font", "%"],
    "recherche": ["qui est", "actualite"],
}
assert classifier_question("Combien font 20% de 100 ?", regles) == "calcul"
assert classifier_question("Qui est le president ?", regles) == "recherche"
assert classifier_question("Raconte une blague", regles) == "general"
Classification insensible a la casse
regles = {"recherche": ["actualite", "dernier"]}
assert classifier_question("LES DERNIERES ACTUALITES", regles) == "recherche"
assert classifier_question("Derniere nouvelle", regles) == "recherche"
Router vers le bon pipeline
regles = {"calcul": ["combien", "calculer"]}
resultats = []
pipelines = {
    "calcul": lambda q: "pipeline_calcul",
    "general": lambda q: "pipeline_general"
}
assert router_vers_pipeline("Combien font 2+2 ?", regles, pipelines) == "pipeline_calcul"
assert router_vers_pipeline("Raconte une blague", regles, pipelines) == "pipeline_general"
Fallback sur pipeline general
regles = {"recherche": ["qui est"]}
pipelines = {
    "recherche": lambda q: "recherche",
    "general": lambda q: "general"
}
r = router_vers_pipeline("Quelle heure est-il ?", regles, pipelines)
assert r == "general", f"Sans correspondance, doit utiliser le pipeline general, pas {r}"

+ 0 tests cachés

Indices (3 disponibles)

solution.py