Les grands modèles de langage (LLM) et leurs variantes améliorées, les modèles de langage augmentés (ALM), sont devenus la pièce maîtresse des systèmes d’IA modernes. En combinant une puissante génération de langage avec des techniques externes de récupération de connaissances comme la génération augmentée par récupération (RAG), ils fournissent un raisonnement avancé, des réponses aux questions et une automatisation dans divers domaines. Cependant, malgré leurs capacités remarquables, ces modèles rencontrent souvent des difficultés lorsqu’ils doivent traiter des tâches complexes : robustesse incohérente entre les systèmes, utilisation élevée des tokens, temps de réponse lent et inefficacités causées par des prompts répétitifs et un contexte redondant. Ces limitations augmentent les coûts opérationnels et entravent l’évolutivité et les performances en temps réel.
Pour surmonter ces problèmes, le framework ReWOO (rationalisation sans observation) offre une approche novatrice qui vise à découpler le raisonnement de la récupération externe de connaissances. Au lieu d’avoir un seul LLM qui essaie de raisonner et d’observer de manière dissociée, ReWOO sépare ces préoccupations en modules distincts, chacun potentiellement alimenté par un LLM, mais avec un rôle spécifique. En structurant le processus en étapes distinctes de planification, de collecte de preuves et de synthèse, ReWOO améliore l’efficacité et la précision des tokens. Il facilite également le débogage du système et permet des workflows d’IA plus rationalisés et plus efficaces.
Le workflow de ReWOO s’articule autour de trois composants principaux : le raisonnement par étapes, les appels d’outils et la synthèse. Ces composants sont implémentés dans une structure modulaire composée de trois parties : le planificateur, le worker et le solveur.
Le planificateur décompose la tâche principale en une séquence de sous‑questions ciblées, créant ainsi un schéma directeur clair. Au lieu de demander au LLM de répondre à une question complexe en même temps, ce qui peut conduire à une utilisation massive des tokens et à des réponses confuses, le planificateur crée un schéma directeur ou une feuille de route. Cette répartition étape par étape guide le workflow et maintient la structure du processus de raisonnement.
Le worker appelle des outils externes tels que des moteurs de recherche ou des bases de données pour récupérer les informations et les preuves pertinentes nécessaires pour répondre aux sous‑questions. Il utilise le LLM pour formuler des réponses claires et concises basées uniquement sur ces informations récupérées. Cette phase d’observation externe est séparée du processus de raisonnement afin d’éviter une répétition inutile des prompts et de réduire la consommation de tokens.
Le solveur synthétise toutes les informations recueillies pour générer une réponse finale récente et bien structurée. Cette séparation modulaire permet de garantir un raisonnement efficace, précis et évolutif avec de grands modèles de langage.
Des frameworks comme LangChain et LangGraph offrent des outils puissants pour mettre en œuvre l’architecture ReWOO en utilisant des modèles d’OpenAI, IBM Granite ou des outils spécialisés comme Serper et Tavily pour la recherche.
Dans ce tutoriel, vous découvrirez comment créer un agent ReWOO qui effectue la tâche de synthèse de contenu. Cet agent peut :
Cette architecture est utile pour :
Ce tutoriel étape par étape s’appuie sur des technologies d’IA de pointe, notamment :
Ce tutoriel vous guide tout au long du processus de configuration de votre environnement de développement local afin d’exécuter un pipeline de raisonnement de type ReWOO à l’aide de Jupyter Notebook. Vous utiliserez le modèle de langage IBM Granite et Serper.dev pour la récupération des recherches Web en direct.
Remarque : aucun GPU n’est nécessaire, mais l’exécution peut être plus lente sur les systèmes basés sur CPU. Cette étape ouvre un environnement de notebook dans lequel vous pouvez copier le code de ce tutoriel. Ce tutoriel est également disponible sur GitHub.
Ces bibliothèques sont nécessaires pour exécuter le pipeline ReWOO et interagir avec des outils externes :
transformers : charge et exécute le grand modèle de langage IBM Granite.
torch : framework d’apprentissage profond nécessaire au bon fonctionnement du modèle.
accelerate : optimise les performances du modèle sur l’ensemble du matériel (en option).
requests : envoie des requêtes HTTP POST aux API externes (comme Serper).
Dans cette étape, nous importons les bibliothèques Python nécessaires à la création des composants principaux du pipeline ReWOO.
transformers.AutoTokenizer : charge le tokeniseur qui convertit le texte en tokens compatibles avec le modèle de langage.
transformers.AutoModelForCausalLM : charge le modèle de langage pré-entraîné IBM Granite pour générer des réponses.
transformers.pipeline : fournit une interface de premier niveau pour créer rapidement un pipeline de génération de texte à l’aide du tokeniseur et du modèle.
Lors de cette étape, nous chargeons le modèle de langage IBM Granite et nous initialisons un pipeline de génération de texte à l’aide de la bibliothèque de transformers de Hugging Face. Consultez le modèle d’instruction Granite 3.2 2B sur Hugging Face ici.
model_id = "ibm-granite/granite-3.2-2b-instruct" : indique le nom du point de contrôle du modèle IBM Granite hébergé sur Hugging Face. Ce modèle est optimisé pour les tâches qui suivent des instructions.
AutoTokenizer.from_pretrained(model_id) : charge le tokeniseur associé au modèle spécifié. Assure la conversion du texte d’entrée en tokens et le décodage des tokens de sortie en texte.
AutoModelForCausalLM.from_pretrained(model_id) : charge le modèle de langage (instruction Granite 3.2 2B) pour les tâches de génération de texte telles que les réponses aux questions ou la synthèse.
pipeline("text-generation", model=model, tokenizer=tokenizer) : crée un pipeline de génération de texte de premier niveau qui combine le modèle et le tokeniseur, ce qui facilite la génération de réponses à partir de prompts.
Dans cette étape, nous définissons une fonction qui agit comme le worker dans l’architecture ReWOO. Ce worker utilise un outil de recherche Web, Serper.dev, pour récupérer des informations pertinentes et à jour sur Internet afin de soutenir le raisonnement et la génération de réponses. Serper.dev est une API rapide et légère qui fournit des résultats de recherche Google dans un format structuré, idéale pour récupérer des informations en temps réel dans les workflows d’IA.
Cette configuration permet au système ReWOO d’« observer » le monde réel en interrogeant des sources de connaissances externes avant que le LLM ne prenne des décisions finales.
Pour utiliser Serper dans le pipeline ReWOO :
SERPER_API_KEY = "<YOUR_API_KEY>" # Replace this with your actual key
Remarque : ne remplacez jamais votre clé API sur des référentiels publics. Pour les paramètres de production ou d’équipe, utilisez des fichiers .env ou des variables d’environnement pour les sécuriser.
def query_serper(question, num_results=3) : définit une fonction qui prend une question de recherche et renvoie des extraits pertinents à partir des principaux résultats de recherche.
payload = {"q": question, "num": num_results} : prépare la charge utile de la requête avec le terme de recherche et le nombre de résultats à renvoyer.
réponse = Requests.post (...) : envoie une requête POST à l’API Serper avec votre requête et vos en-têtes.
response.raise_for_status() : déclenche une erreur si la réponse de l’API est non valide ou échoue.
snippets = [...] : récupère un extrait de texte à partir des résultats de recherche organique.
return "\n".join(snippets) : relie et renvoie les extraits sous forme de chaîne unique, servant de contexte pour le modèle de langage.
Remarque : cette fonction est l’élément central de l’étape « observation » de ReWOO, où des preuves externes sont collectées pour un raisonnement plus approfondi. Assurez-vous que votre clé API est valide et non limitée en débit lors du test.
Dans cette étape, nous définissons la fonction expert(), qui sert de solveur dans l’architecture ReWOO. Le solveur synthétise les preuves externes récupérées et génère une réponse finale à l’aide du modèle de langage.
def expert(question: str) -> str : la fonction expert() prend une question (chaine) et renvoie une réponse (chaine) générée par le modèle Granite. Elle effectue une recherche sur le Web avec Serper.dev, recueille des informations pertinentes et les utilise pour générer une réponse claire et complète.
context = query_serper(question) : utilise l’outil de recherche Web Serper pour récupérer les informations pertinentes (worker).
prompt = f"""...""" : crée un prompt qui indique au modèle de répondre en utilisant uniquement le contexte récupéré.
générator(...) : appelle le modèle Granite pour générer une réponse basée sur le prompt d’entrée.
for _ in range(5) : cette boucle permet au modèle de générer une réponse divisée en fragments, jusqu’à 5 fois. Elle est utile si la réponse est longue et ne peut pas être envoyée en une seule fois.
generated_text += new_text : ajoute chaque nouveau fragment de texte pour former la réponse complète.
if new_text.endswith(...) : met fin à la boucle si la réponse semble complète (se termine par un point, un point d’interrogation ou un point d’exclamation) et comporte suffisamment de mots (plus de 50).
return generated_text.strip() : renvoie la réponse finale nettoyée.
Remarque : le format du prompt est important, il garantit que le modèle n’« hallucine » pas ou ne s’écarte pas du sujet. Il doit s’en tenir au contexte. Nous limitons chaque fragment de génération à 120 tokens afin de contrôler la longueur de sortie et gérer efficacement l’utilisation des ressources tout en empêchant l’utilisation excessive de tokens.
À cette étape, nous définissons la fonction Planner, qui décompose une tâche d’entrée large en sous‑questions plus petites et bien définies, un principe fondamental du raisonnement par étapes de ReWOO.
def planner(task: str) : définit une fonction nommée planner qui accepte une tâche à un seul argument (une chaîne décrivant la tâche à effectuer).
topic = task.replace("Summarize", "").replace("the novella", "").strip() : extrait l’objet principal de la tâche (par exemple, le titre ou le thème). Nettoie l’entrée en supprimant les expressions de prompt courantes telles que « Résumer » et « le roman », puis élimine les espaces blancs de début et de fin pour isoler le sujet principal.
return [ ... ] : renvoie une liste de questions spécifiques qui guident le module Worker.
Remarque : vous pouvez élargir cette liste avec des sous‑questions plus spécifiques en fonction de la profondeur et du thème de l’entrée.
À cette étape, nous définissons la fonction final_summarizer, qui agit comme le solveur dans le pipeline ReWOO. Cette fonction prend les sous‑réponses (preuves) fournies par le worker et génère un résumé nouvellement écrit et cohérent en utilisant le modèle de langage.
def final_summarizer(task: str, sub_answers: dict) -> str : définit la fonction qui reçoit la tâche d’origine et les sous‑réponses, et renvoie un résumé concis.
insights = "\n".join(sub_answers.values()) : combine toutes les réponses en une seule chaîne séparée par des nouvelles lignes pour l’inclusion dans le prompt.
base_prompt = f"""...""" : construit le prompt de base demandant au modèle de résumer les informations fournies. Guide le modèle pour générer un résumé actualisé basé uniquement sur les sous‑réponses.
max_total_tokens = 400 : définit une limite supérieure pour le nombre de jetons générés afin d’éviter les sorties excessivement longues.
max_loops = 5 : permet d’effectuer jusqu’à 5 itérations de génération pour construire progressivement le résumé.
for in range(maxloops) : boucles permettant de générer des fragments de texte à l’aide du modèle de langage.
response = generator(..., max_new_tokens=100, ...) : utilise le générateur (objet pipeline) pour générer jusqu’à 100 nouveaux tokens dans chaque boucle. Le mode Sampling (do_sample=True) permet la variation et la créativité dans la réponse.
if summary.endswith(...) or total_tokens_used >= max_total_tokens : met fin à la boucle si le résumé se conclut par la ponctuation appropriée ou atteint la limite du token.
return summary.strip() : renvoie le résumé final et peaufiné, sans espaces de fin.
Dans cette étape, nous définissons la fonction Solver, qui représente l’étape finale du pipeline ReWOO. Elle orchestre le processus complet en utilisant le planificateur, en appelant l’expert (worker) et en générant un résumé à l’aide du final_summarizer (solveur). L’architecture ReWOO permet un raisonnement à plusieurs étapes en décomposant la tâche principale en sous‑questions à l’aide d’un planificateur. Chaque sous‑question est traitée indépendamment par un module expert, et le synthétiseur final synthétise toutes les réponses en une réponse cohérente. Cette approche modulaire permet au système de s’attaquer plus efficacement à des tâches complexes.
def solver(task: str) : définit la fonction de contrôleur principal pour l’exécution du workflow ReWOO complet.
subquestions = planner(task) : utilise le planificateur pour diviser la tâche d’entrée en sous‑questions ciblées.
ans = expert(q) : pour chaque sous‑question, appelle la fonction experte pour récupérer des preuves sur le Web et générer une réponse pertinente. Chaque sous‑question générée par le planificateur est transmise à l’expert en tant qu’entrée d’outil. Le module expert traite l’entrée à l’aide d’un modèle de langage. Cela peut être considéré comme exécuter un outil pour une sous‑tâche spécifique.
answers[q] = ans : stocke chaque réponse associée à sa question correspondante pour un résumé ultérieur.
final_summary = final_summarizer(task, answers) : insère toutes les réponses collectées dans le final_summarizer pour générer un résumé clair et cohérent.
print(final_summary) and return final_summary : affiche et renvoie le résumé terminé pour la tâche d’origine.
Remarque : le temps total nécessaire à la fonction solver() peut varier d’un système à l’autre en raison des différences de vitesse du processeur, de la mémoire RAM disponible et de l’efficacité avec laquelle le modèle s’exécute sur différentes configurations matérielles. Comme le code utilise une stratégie de génération en boucle avec un modèle de langage, les systèmes dotés d’une puissance de traitement ou d’une mémoire plus faible peuvent prendre beaucoup plus de temps. La récupération basée sur le réseau et les tailles de prompt importantes peuvent également contribuer aux retards. Pour améliorer les performances, envisagez de réduire max_loops en utilisant un modèle plus petit ou quantifié, en optimisant le pipeline de tokenisation et de génération ou en exécutant le code dans un environnement compatible GPU tel que Google Colab ou Kaggle Notebooks.
Dans cette dernière étape, nous exécutons le pipeline ReWOO complet en appelant la fonction solver avec une tâche spécifique.
solver("Summarize the novella The Metamorphosis") : déclenche l’ensemble du processus ReWOO; planification, récupération des preuves et génération d’un résumé pour la tâche d’entrée : résumé de l’ensemble de données The Metamorphosis.
Cette étape génère le résumé final et montre comment les composants ReWOO fonctionnent ensemble de bout en bout pour un cas d’utilisation réel.
Remarque : pour améliorer les performances et la fiabilité du pipeline ReWOO, il est important d’améliorer les indicateurs d’évaluation tels que la qualité du résumé, la cohérence et la latence de génération. Ces indicateurs permettent d’évaluer les performances du système sur différentes tâches et configurations matérielles. L’architecture peut être étendue en intégrant des algorithmes intelligents, qui permettent de diviser les grandes questions en questions plus petites et de trier les réponses les plus utiles. Ces améliorations devaient permettre un raisonnement plus précis et plus efficace, réduire le temps de génération et améliorer la qualité globale des résultats finaux.
Créez, déployez et gérez de puissants assistants et agents IA qui automatisent les workflows et les processus grâce à l’IA générative.
Construisez l’avenir de votre entreprise avec des solutions d’IA en lesquelles vous pouvez avoir confiance.
IBM Consulting et ses services d'IA accompagnent les entreprises dans la redéfinition de leurs activités avec l'intelligence artificielle pour mener leur transformation.