L'indexeur hiérarchique¶
Le coût résiduel¶
CSA2 réduit le nombre d'indexeurs exécutés : sur 40 couches, seules 8 possèdent un indexeur (les couches 2, 8, 14, 20, 24, 28, 32, 36), et les couches en mode Reuse n'en font tourner aucun.
Mais les indexeurs restants balaient l'intégralité du contexte visible. À un million de jetons, chaque requête doit être comparée à un demi-million d'entrées compressées, dans chacune des couches indexatrices. Ce coût reste linéaire en la longueur du contexte, et redevient le goulet d'étranglement du décodage long.
L'idée¶
Dans le décodeur, tous les indexeurs travaillent sur le même cache principal — celui produit par la couche 20 depuis \(H_{20}\). Ils scorent donc tous exactement les mêmes positions, avec des requêtes différentes.
DeepSeek en tire une observation simple : l'information produite par l'indexeur le plus superficiel peut servir à restreindre le domaine de recherche des indexeurs plus profonds, sans ajouter le moindre état supplémentaire.
Le mécanisme¶
Étape 1 — la couche 20 construit le vivier¶
La première couche du décodeur en mode Full score toutes les positions causalement visibles et fait deux choses :
- elle sélectionne ses propres 512 meilleurs indices, pour sa propre attention ;
- elle effectue une sélection par blocs : chaque bloc de 8 positions consécutives reçoit pour score le maximum des scores de ses positions ; les 2 048 blocs les mieux notés sont retenus.
Les positions couvertes par ces blocs forment le vivier de candidats :
Étape 2 — les couches Reindex cherchent dans le vivier¶
Les couches 24, 28, 32 et 36 ne scorent que ces 16 384 positions. Chacune y choisit ses propres 512 entrées.
Étape 3 — les couches Reuse ne cherchent pas¶
Elles emploient les derniers indices calculés contre le cache qu'elles réutilisent.
couche 20 ──► score sur TOUT le contexte ──► Top-512 + vivier de 16 384
│
couche 24 ──► score sur 16 384 positions ──► Top-512 ◄──────┤
couche 28 ──► score sur 16 384 positions ──► Top-512 ◄──────┤
couche 32 ──► score sur 16 384 positions ──► Top-512 ◄──────┤
couche 36 ──► score sur 16 384 positions ──► Top-512 ◄──────┘
Le gain asymptotique¶
Pour une taille de vivier fixée, le nombre de positions scorées par requête dans chaque indexeur profond devient borné indépendamment de la longueur du contexte. Le coût passe de linéaire à constant.
La couche 20, elle, continue de balayer tout le contexte. Le gain porte donc sur quatre indexeurs sur cinq dans le décodeur.
Concrètement, à un million de jetons, chaque indexeur profond passe de 1 000 000 de positions à 16 384 — un facteur 61. À 100 000 jetons, le facteur n'est plus que de 6. Le mécanisme est d'autant plus utile que le contexte est long, ce qui est exactement le régime visé.
Pourquoi seulement dans le décodeur
Dans l'encodeur, les trois couches Full produisent trois caches différents. Un vivier construit sur l'un n'aurait pas de sens pour les autres : les positions n'indexent pas le même contenu. Le mécanisme hiérarchique suppose un cache partagé, ce que seul le décodeur offre grâce au CED.
Un détail méthodologique important¶
Le rapport technique insiste sur un point que beaucoup d'optimisations d'inférence négligent :
Section 2.3.2
« Le mécanisme est conscient de l'entraînement et introduit lors du post-entraînement : la restriction aux candidats est appliquée à l'identique pendant l'entraînement et l'inférence, de sorte que les indexeurs profonds sont optimisés sous le même domaine de recherche que celui qu'ils utilisent à l'inférence. »
Autrement dit, l'indexeur hiérarchique n'est pas une optimisation appliquée après coup à un modèle entraîné sans elle. Les couches profondes ont appris à chercher dans un vivier restreint. C'est une différence de nature : elle rend l'approximation beaucoup moins risquée, mais elle signifie aussi qu'on ne peut pas la désactiver à l'inférence pour retrouver un modèle « exact ».
La sélection par maximum de bloc¶
Le choix d'attribuer à un bloc le maximum des scores de ses positions — et non leur moyenne — mérite d'être noté. C'est un choix conservateur : un bloc contenant une seule position très pertinente au milieu de sept inutiles est retenu. Avec une moyenne, il serait écarté.
Ce choix privilégie le rappel au détriment de la précision, ce qui est le bon compromis quand le vivier est ensuite refiltré par un second niveau de sélection.
Une source d'erreur reconnue
Si la couche 20 omet une position réellement importante pour la couche 36, aucune couche ultérieure ne pourra la récupérer : le vivier est une borne dure. Le rapport technique classe explicitement les « erreurs de sélection potentielles dans CSA2 » parmi les risques non entièrement caractérisés. Voir Limites et questions ouvertes.
Chapitre suivant : Le cache KV en FP4