$3b
Pattern publié par Yao et al. 2023 (Princeton + Google DeepMind, NeurIPS 2023). Le papier "Tree of Thoughts: Deliberate Problem Solving with Large Language Models" généralise Chain-of-Thought en arbre de raisonnement avec exploration et backtracking.
| Approche | Structure | Avantage | Limite |
|---|---|---|---|
| Direct prompting | Question → Réponse | Rapide, simple | Pas de raisonnement intermédiaire |
| Chain-of-Thought (CoT) | Question → Pensée1 → Pensée2 → ... → Réponse | Raisonnement explicite | Linéaire, pas de backtrack |
| Self-Consistency | N chaînes CoT en parallèle → vote majoritaire | Diversité | N appels indépendants, pas d'élagage |
| Tree-of-Thoughts | Arbre de pensées avec évaluation et backtracking | Exploration + élagage actif | Plus coûteux, plus lent |
Gain mesuré dans le papier :
[PROBLÈME]
│
▼
┌──────────────────┐
│ DÉCOMPOSITION │
│ Étape 1, 2, 3..│
└─────────┬────────┘
│
┌───────────┼───────────┐
│ │ │
▼ ▼ ▼
[Pensée 1A] [Pensée 1B] [Pensée 1C]
│ │ │
[eval=8] [eval=3] [eval=6]
│ X │
▼ ▼
[Pensée 2A] [Pensée 2C]
│ │
[eval=9] [eval=4]
│ X
▼
[SOLUTION]
L'élagage (X) supprime les branches faibles. L'algorithme peut être BFS, DFS, ou beam search.
Décompose le problème en étapes intermédiaires.
Génère plusieurs pensées candidates par étape.
Score chaque état partiel.
def tree_of_thoughts(problem, max_depth=4, beam_width=3):
initial_state = State(problem=problem, history=[])
beam = [initial_state]
for depth in range(max_depth):
candidates = []
for state in beam:
# Generator : propose K thoughts depuis cet état
next_thoughts = generate_thoughts(state, k=5)
for thought in next_thoughts:
new_state = state.extend(thought)
# Evaluator : score
score = evaluate(new_state)
candidates.append((score, new_state))
# Élagage : garde top beam_width
candidates.sort(reverse=True)
beam = [s for _, s in candidates[:beam_width]]
# Termination
if any(s.is_solved() for s in beam):
return next(s for s in beam if s.is_solved())
return max(beam, key=lambda s: evaluate(s))
Trouver une expression mathématique avec les nombres [4, 9, 10, 13] qui donne 24.
[4, 9, 10, 13]
│
├── Thought1: 13 - 9 = 4 → state [4, 4, 10]
│ ├── Thought2: 10 - 4 = 6 → state [4, 6]
│ │ └── Thought3: 4 × 6 = 24 ✓ FOUND
│ └── Thought2: 4 × 4 = 16 → state [10, 16] eval=2
│
├── Thought1: 10 - 4 = 6 → state [6, 9, 13]
│ └── ... eval=4
│
└── Thought1: 9 + 13 = 22 → state [4, 10, 22]
└── ... eval=2
Solution trouvée : (13 - 9) × (10 - 4) = 4 × 6 = 24
✅ Bons cas pour ToT :
❌ Mauvais cas (overkill) :
ToT consomme N × M × D appels LLM où :
Pour beam=3, M=5, D=4 → ~60 appels LLM. À comparer avec 1 appel CoT.
Règle : si CoT atteint >70% de succès, ToT est rarement rentable.
| Variante | Différence avec ToT | Quand l'utiliser |
|---|---|---|
| Graph-of-Thoughts (GoT) | Pensées peuvent fusionner (DAG au lieu d'arbre) | Refinement et combinaison de pensées |
| Algorithm-of-Thoughts (AoT) | Pensées dans un seul prompt, in-context tree | Réduit le coût en gardant l'exploration |
| Skeleton-of-Thoughts (SoT) | Génère le squelette puis remplit en parallèle | Latence réduite via parallélisme |
| Forest-of-Thoughts | Plusieurs ToT en parallèle, vote final | Tâches critiques où la robustesse compte |
react-pattern (ce plugin)reflexion-pattern (ce plugin)prompt-engineer (ce plugin)cost-aware-llm-pipeline (ce plugin)