Exercices AI Engineering Projet : mini agent autonome complet
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Projet : mini agent autonome complet

Tu as appris a valider les entrees, router les requetes, gerer la memoire, utiliser des outils, creer des pipelines, et tracer les appels. Il est temps d'assembler tout ca dans un mini agent autonome qui combine ces concepts.

C'est comme ca que fonctionnent les agents LLM en production : une couche de validation, un router, un cache, des outils, des guardrails, et de l'observabilite. Chaque brique que tu as construite dans les exercices precedents est un composant du systeme final.

Tu vas creer une classe MiniAgent qui integre :

__init__(self, outils, mots_cles_domaine) :
- outils : dictionnaire {nom: fonction}
- mots_cles_domaine : liste de mots-cles pour la validation
- Initialise aussi un cache (dictionnaire), un historique de conversation (liste) et un log d'appels (liste)

traiter(self, question) : le pipeline complet :
1. Validation : verifie que la question n'est pas vide et contient au moins un mot-cle du domaine (insensible a la casse). Si invalide, renvoie {"statut": "rejete", "raison": "..."}
2. Cache : si la question normalisee (strip + lower) est dans le cache, renvoie {"statut": "cache", "reponse": reponse_cachee}
3. Routing : si la question contient le nom d'un outil (cle du dictionnaire outils), appelle cet outil avec la question comme argument. Sinon, renvoie une reponse par defaut : "Je ne sais pas repondre a cette question."
4. Logging : enregistre dans le log {"question": question, "reponse": reponse, "source": "outil" ou "defaut"}
5. Cache : stocke la reponse dans le cache
6. Historique : ajoute la question et la reponse a l'historique
7. Renvoie {"statut": "ok", "reponse": reponse}

stats(self) : renvoie {"questions_traitees": n, "cache_hits": n, "rejets": n}

Exemple :

def chercher(question):
return "Paris est la capitale de la France"

agent = MiniAgent(
outils={"chercher": chercher},
mots_cles_domaine=["capitale", "pays", "geographie"]
)
agent.traiter("Quelle est la capitale de la France ?")
renvoie {"statut": "ok", "reponse": "Paris est la capitale de la France"}

agent.traiter("Quelle est la capitale de la France ?")
renvoie {"statut": "cache", "reponse": "Paris est la capitale de la France"}

agent.traiter("Raconte-moi une blague")
renvoie {"statut": "rejete", "raison": "Hors sujet"}

Tests (5/6)

Question valide traitee par outil
def search(q): return 'Resultat trouvé'
agent = MiniAgent({'search': search}, ['python', 'code'])
r = agent.traiter('Comment search du code Python ?')
assert r['statut'] == 'ok'
assert r['reponse'] == 'Resultat trouvé'
Question hors sujet rejetee
agent = MiniAgent({}, ['python'])
r = agent.traiter('Quelle heure est-il ?')
assert r['statut'] == 'rejete'
assert r['raison'] == 'Hors sujet'
Cache fonctionne
compteur = {'n': 0}
def llm(q):
    compteur['n'] += 1
    return 'Reponse'
agent = MiniAgent({'llm': llm}, ['python', 'llm'])
agent.traiter('Parle-moi de llm en Python')
r2 = agent.traiter('Parle-moi de llm en Python')
assert r2['statut'] == 'cache'
assert compteur['n'] == 1
Stats correctes
agent = MiniAgent({'tool': lambda q: 'R'}, ['python', 'tool'])
agent.traiter('Question sur tool python')
agent.traiter('Question sur tool python')
agent.traiter('Hors sujet')
s = agent.stats()
assert s['questions_traitees'] == 2
assert s['cache_hits'] == 1
assert s['rejets'] == 1
Question vide rejetee
agent = MiniAgent({}, ['python'])
assert agent.traiter('')['statut'] == 'rejete'
assert agent.traiter('   ')['statut'] == 'rejete'

+ 0 tests cachés

Indices (3 disponibles)

solution.py