Graph of Thoughts : modéliser un raisonnement LLM comme un graphe d'opérations
Official Implementation of "Graph of Thoughts: Solving Elaborate Problems with Large Language Models"
En bref
- De quoi s’agit-il ?
- L'implémentation officielle de l'article Graph of Thoughts transforme la résolution de problèmes par LLM en un graphe d'opérations exécuté par un Controller. Utile si vous voulez reproduire CoT ou ToT dans un même cadre, moins si vous cherchez une bibliothèque prête à l'emploi.
- À qui s’adresse-t-il ?
- Adoptez graph_of_thoughts si vous travaillez sur la structure du raisonnement lui-même et acceptez d'écrire vos propres Prompter et Parser. Évitez-le si vous cherchez une chaîne d'appels stable pour la production : la dernière release publiée est v0.0.2, datée du 26 septembre 2023.
- Puis-je l’utiliser commercialement ?
- À vérifier. La licence de ce dépôt n’entre pas dans les catégories que nous classons automatiquement : lisez son fichier LICENSE avant tout usage commercial.
- Est-il encore maintenu ?
- Oui. Les derniers commits datent d’il y a 175 jours.
- En quel langage est-il écrit ?
- Principalement Python, d’après les statistiques de langage de GitHub.
Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.
ANALYSE OPEN SOURCE APPROFONDIE
Le problème visé : sortir de la chaîne linéaire
Les approches de prompting séquentielles traitent une requête comme une suite d'étapes qui ne se rejoignent jamais. Le README du projet présente GoT comme un moyen de résoudre des problèmes complexes en les modélisant sous forme de Graph of Operations (GoO), exécuté automatiquement avec un LLM comme moteur. La cible est donc précise : des problèmes où une réponse unique produite en un passage n'est pas fiable, et où l'on veut combiner, noter ou agréger plusieurs pensées intermédiaires. Le README ajoute que le cadre permet aussi d'implémenter des GoO qui ressemblent à CoT ou ToT. C'est un point important pour situer l'outil : il ne remplace pas ces méthodes, il les absorbe comme des cas particuliers d'un même formalisme. Le public visé est celui qui veut manipuler cette structure, pas celui qui veut brancher un assistant sur une base documentaire. Les exemples fournis portent sur le tri d'une liste de nombres et sur le comptage de mots-clés, ce qui donne la mesure du terrain : des tâches vérifiables, avec une fonction de score objective, pas des tâches ouvertes.
GraphOfOperations, Controller et le rôle du Prompter
L'architecture visible dans le README tient en trois pièces. D'abord un objet GraphOfOperations, construit en enchaînant des appels à append_operation avec des opérations comme Generate, Score et GroundTruth. Ensuite un modèle de langage, instancié ici par language_models.ChatGPT à partir d'un fichier config.json. Enfin un Controller, qui reçoit le graphe, le modèle, un Prompter, un Parser et un dictionnaire décrivant l'état de pensée initial. Le flux est le suivant : le Controller parcourt le graphe, demande au Prompter de fabriquer les invites à partir de l'état courant, envoie ces invites au modèle, puis confie la réponse au Parser pour en extraire un nouvel état de pensée. L'opération Score applique une fonction de notation, dans l'exemple utils.num_errors, et GroundTruth vérifie le résultat final avec utils.test_sorting. La séparation Prompter, Parser, opérations est ce qui rend le cadre extensible : changer de tâche revient à fournir de nouveaux objets de ces trois types. Le README insiste sur ce point et renvoie aux README des modules Controller et Operations pour les détails, ce qui suggère que la documentation centrale reste volontairement mince et que l'essentiel se lit dans le code.
Installation et premier graphe en pratique
Deux chemins d'installation sont documentés, avec Python 3.8 ou plus récent comme prérequis. En utilisateur, pip install graph_of_thoughts. En développeur, un clone puis pip install -e . depuis la racine du dépôt. Le README précise qu'il faut activer son environnement Python avant l'une ou l'autre méthode. Vient ensuite la configuration du LLM, renvoyée vers graph_of_thoughts/controller/README.md, sans que le contenu de ce fichier soit repris dans le README principal. C'est une dépendance documentaire à connaître : sans lire ce fichier, on ne sait pas quels fournisseurs sont pris en charge ni quelles clés sont attendues. Le quick start, lui, est explicite. On importe SortingPrompter, SortingParser et utils depuis examples.sorting.sorting_032, puis controller, language_models et operations depuis graph_of_thoughts. On construit le graphe avec gop.append_operation(operations.Generate()), puis Score, puis GroundTruth. Le modèle est créé par language_models.ChatGPT("config.json", model_name="chatgpt"), le Controller reçoit l'état initial sous forme de dictionnaire contenant original, current et method, et l'exécution se termine par ctrl.run() suivi de ctrl.output_graph("output_cot.json"). La variante GoT remplace la construction manuelle du graphe par un appel à got() importé du même module d'exemple, et l'état initial contient cette fois une clé phase en plus.
Comparer CoT et GoT sur le même problème
Le README propose une manipulation concrète : exécuter les deux extraits sur la même liste de 32 nombres, puis comparer output_cot.json et output_got.json. Le critère annoncé est le score des états de pensée finaux, qui correspond au nombre d'erreurs dans la liste triée. C'est un choix pédagogique cohérent : le tri offre une vérité terrain calculable, donc un moyen de voir si la structure en graphe apporte quelque chose. Il faut noter que le README ne donne aucun chiffre de résultat pour cette comparaison. Il indique seulement que les scores finaux permettent de juger. Toute affirmation sur le gain réel de GoT par rapport à CoT demanderait d'exécuter les deux scripts soi-même, avec sa propre clé API et son propre modèle. Deux commandes permettent de lancer les exemples depuis la racine : python -m examples.sorting.sorting_032 et python -m examples.keyword_counting.keyword_counting. Le README signale que les résultats sont écrits dans le sous-répertoire de l'exemple concerné, ce qui évite de chercher les fichiers de sortie ailleurs.
Ce que la documentation ne couvre pas
Trois zones restent floues à la lecture du matériel fourni. La première est la licence : le dépôt est classé NOASSERTION, ce qui signifie qu'aucun identifiant SPDX reconnu n'a été détecté. Le README, lui, ne comporte aucune section licence. Avant toute réutilisation en entreprise, il faut lire le fichier de licence du dépôt et, si le cadre juridique de votre organisation l'exige, faire trancher la question par qui de droit. La deuxième zone est la gestion des erreurs et des coûts : le README ne décrit ni comportement en cas d'échec d'appel au modèle, ni mécanisme de reprise, ni estimation du nombre d'appels générés par un graphe. Or un graphe qui note et régénère des pensées multiplie les requêtes, et rien dans le README ne permet de savoir combien. La troisième est la stabilité de l'API. Les deux releases listées sont v0.0.2, datée du 26 septembre 2023, et v0.0.1, datée du 23 août 2023. Le rythme de publication est donc très faible, même si le dépôt n'est pas archivé et que le dernier push est daté du 24 mars 2026. Un projet actif sur le dépôt mais sans release depuis 2023 implique que le code de la branche main peut différer de ce que PyPI installe.
Quand préférer LangChain ou une boucle maison
L'alternative la plus directe n'est pas un autre cadre de graphes mais une bibliothèque d'orchestration généraliste comme LangChain, ou simplement une boucle Python écrite à la main. La différence tient à ce que chaque option met au centre. Graph of Thoughts met au centre l'objet GraphOfOperations et l'exécution par un Controller : la structure du raisonnement est un objet de première classe, que l'on peut inspecter, sérialiser via output_graph et comparer d'une exécution à l'autre. LangChain met au centre les composants et leur composition, avec un écosystème large de connecteurs, de mémoires et d'outils. Si votre besoin est d'enchaîner un prompt, un outil et une réponse, la boucle maison suffit et vous évite d'apprendre un formalisme. Si votre besoin est d'étudier plusieurs topologies de raisonnement sur une même tâche, avec un score comparable, le formalisme de GoT est précisément ce que vous cherchez. Le README ne prétend pas que GoT est plus rapide ou moins coûteux, et il n'avance aucune comparaison chiffrée avec d'autres bibliothèques.
Maintenance, coût d'adoption et périmètre raisonnable
Le coût d'adoption se mesure en trois postes. Le premier est l'écriture d'un Prompter et d'un Parser pour chaque nouvelle tâche : les exemples du dépôt en fournissent des modèles, mais ils sont liés à des problèmes jouets et devront être remplacés. Le deuxième est la configuration du LLM, qui passe par un config.json et par les instructions de graph_of_thoughts/controller/README.md ; le README principal ne détaille pas ce fichier, donc prévoyez de lire le code du contrôleur. Le troisième est le suivi des versions : avec une dernière release en septembre 2023, installer depuis PyPI et installer en editable depuis main peuvent donner deux comportements différents. Pour un usage en recherche, ce n'est pas bloquant. Pour un service en production, cela impose de figer une révision précise du dépôt plutôt que de dépendre de pip install graph_of_thoughts. Le dépôt n'étant pas archivé, il reste possible de suivre la branche main, mais aucune garantie de compatibilité ascendante n'apparaît dans le matériel disponible.
Conclusion éditoriale
Adoptez graph_of_thoughts si vous travaillez sur la structure du raisonnement lui-même et acceptez d'écrire vos propres Prompter et Parser. Évitez-le si vous cherchez une chaîne d'appels stable pour la production : la dernière release publiée est v0.0.2, datée du 26 septembre 2023. Avant tout essai, vérifiez la licence exacte du dépôt et la configuration attendue par graph_of_thoughts/controller/README.md.
Notes de la communauté