Exercices IA & Data Science Premier graphe LangGraph
🎉

Bravo!

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

Premier graphe LangGraph

LangGraph est la librairie de LangChain pour construire des agents et des workflows complexes sous forme de graphes. Au lieu d'enchainer des appels de fonctions les uns apres les autres, tu definis des noeuds (les étapes) et des aretes (les transitions).

Le concept central c'est le State : un dictionnaire type qui circule entre les noeuds. Chaque noeud recoit l'état courant, fait son traitement, et renvoie les modifications a apporter a l'état.

Voici un exemple minimal :

from langgraph.graph import StateGraph, START, END
from typing import TypedDict

class State(TypedDict):
message: str

def mon_noeud(state):
return {"message": state["message"].upper()}

graph = StateGraph(State)
graph.add_node("transformer", mon_noeud)
graph.add_edge(START, "transformer")
graph.add_edge("transformer", END)
app = graph.compile()
résultat = app.invoke({"message": "bonjour"})

START et END sont des constantes speciales qui représentent le debut et la fin du graphe.

Écris une fonction build_pipeline() qui crée un graphe LangGraph avec 3 noeuds :
- "nettoyer" : met le texte en minuscules (cle "text" du state)
- "compter" : compte le nombre de mots et le stocke dans la clé "word_count"
- "resumer" : crée un resume dans la clé "summary" au format "X mots"
(ou X est le word_count)

Les noeuds s'enchainent : START -> nettoyer -> compter -> resumer -> END

Le State a 3 clés : text (str), word_count (int), summary (str).

La fonction renvoie le graphe compile (le résultat de graph.compile()).

Exemple :

app = build_pipeline()
result = app.invoke({"text": "BONJOUR LE MONDE", "word_count": 0, "summary": ""})
result["text"] vaut "bonjour le monde"
result["word_count"] vaut 3
result["summary"] vaut "3 mots"

Tests (1/1)

Tests
app = build_pipeline()
# Test basique
r = app.invoke({'text': 'BONJOUR LE MONDE', 'word_count': 0, 'summary': ''})
assert r['text'] == 'bonjour le monde', f'Le texte doit etre en minuscules, got {r["text"]}'
assert r['word_count'] == 3, f'Doit compter 3 mots, got {r["word_count"]}'
assert r['summary'] == '3 mots', f'Resume incorrect, got {r["summary"]}'
# Test avec un seul mot
r2 = app.invoke({'text': 'PYTHON', 'word_count': 0, 'summary': ''})
assert r2['text'] == 'python'
assert r2['word_count'] == 1
assert r2['summary'] == '1 mot'
# Test avec texte plus long
r3 = app.invoke({'text': 'Je Code En Python Tous Les Jours', 'word_count': 0, 'summary': ''})
assert r3['word_count'] == 7
assert r3['summary'] == '7 mots'

Indices (3 disponibles)

solution.py