mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-21 05:58:13 +02:00
Compaction : COMPACT_CONTINUATION résume dans le prolongement du prompt en cache, en opt-in
Le résumé d'une compaction part aujourd'hui dans une requête à part — prompt du résumeur et transcription des anciens tours — que le moteur local calcule à froid : des dizaines de secondes sur un 27B, des minutes sur un MoE, à chaque compaction. Nouvelle clé COMPACT_CONTINUATION (off par défaut) : quand le slot porte encore le prompt de la discussion, la requête de résumé est celle du tour telle qu'elle est partie, suivie d'une seule demande de résumé ; le moteur ne calcule qu'elle. Sans la clé, requêtes de compaction identiques à l'octet près (prompt du résumeur comparé à une copie figée, testé). - vue MODÈLE pour tout ce qui est rangé : bornes, archives recall, demande réinjectée, garantie de réduction et sortie ne changent pas ; la vue d'envoi (turnViewDry, wireMessages, buildChatPayload) ne sert qu'à la requête, rien d'injecté n'entre dans l'historique (testé) - frontière recalée sur la vue envoyée (messages non système un pour un, vérifiés rôle par rôle), désignée par le nombre de messages gardés et le début du premier ; tout résumer avant, dater l'avancement à la frontière - mêmes règles de résumé (+ mode Code), même budget, température 0.2 sans l'échantillonnage du preset, enable_thinking=false ajouté aux arguments du tour, reasoning_effort du tour, tool_choice « none », sans flux - messages utilisateur de fin hors de la vue : pas en cache, et pas deux `user` d'affilée pour les gabarits stricts - slot vérifié : tampon posé par une étape de tour acceptée (llm_slots.go, sous le verrou du compteur en vol), perdu dès qu'une autre requête part — vérification, sous-agent, tâche, préchauffage, résumé, bench, /v1 — ou que le modèle ou la fenêtre changent ; relu à l'envoi - marge en jetons réels (dernier compte + non vu + demande + budget + 5 %) - repli sur la transcription au moindre écart : refus du moteur, réseau, appel d'outil émis (tool_calls décodés) ou écrit en texte, raisonnement seul, résumé vide ; refus du gabarit ou appel d'outil = suspendue pour le modèle jusqu'au redémarrage, deux échecs de suite aussi - avec la clé : pas de résumé quand même un vide ne réduirait pas de 20 % (borne exacte, avant tout archivage) ; après un refus faute de réduction, pas de nouvel essai avant +10 % de contexte, jamais à 90 % de la fenêtre, oublié quand le contexte baisse - réactif, fenêtre pleine, bouton manuel, tâches, sous-agents, terminal, preset externe : chemin d'avant ; télémétrie kind=compact avec la discussion Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
eb58f7982f
commit
2097c9f915
11 files changed
+1342
-61
No files matched your search
@@ -389,9 +389,12 @@ func compactLog(log []LogEvent) []LogEvent {
|
||||
// messages donne ce que l'estimation ne voit pas (prompt système injecté,
|
||||
// schémas d'outils, gabarit de chat). On le rajoute à l'estimation d'après
|
||||
// compaction, sinon la jauge s'effondre puis resaute au tour suivant.
|
||||
func (c *Conversation) compactAndPublish(ctx context.Context, epoch int, phase string, msgs []Message, ctxUsed int, caps Caps) ([]Message, bool) {
|
||||
//
|
||||
// opt : options de COMPACT_CONTINUATION (chat_compact_cont.go) ; nulles, le
|
||||
// chemin d'avant.
|
||||
func (c *Conversation) compactAndPublish(ctx context.Context, epoch int, phase string, msgs []Message, ctxUsed int, caps Caps, opt compactOpts) ([]Message, bool) {
|
||||
c.appendDelta(epoch, map[string]any{"compacting": true})
|
||||
compacted, changed := compactMessages(ctx, msgs, caps)
|
||||
compacted, changed := compactMessagesNoted(ctx, msgs, caps, opt)
|
||||
c.appendDelta(epoch, map[string]any{"compacting": false})
|
||||
logCompact(phase, ctxUsed, msgs, compacted, changed)
|
||||
if !changed {
|
||||
@@ -797,8 +800,13 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa
|
||||
// Estimation de début de tour, comparée au premier compte réel du moteur
|
||||
// (journal [ctx], seulement au-delà de 2 % d'écart).
|
||||
startEst := ctxUsed
|
||||
if compactNeeded(msgs, ctxUsed, peak) {
|
||||
if out, changed := c.compactAndPublish(ctx, epoch, "début-tour", msgs, ctxUsed, caps); changed {
|
||||
// COMPACT_CONTINUATION (off par défaut) : un refus récent n'est pas retenté
|
||||
// tout de suite, et le résumé peut prolonger le prompt en cache. Sans la
|
||||
// clé, ni l'un ni l'autre.
|
||||
conv := perfTagOf(ctx).conv
|
||||
if compactNeeded(msgs, ctxUsed, peak) && !compactRefusedSkip(conv, ctxUsed) {
|
||||
opt := c.compactOptsFor(caps, msgs, ctxUsed, conv)
|
||||
if out, changed := c.compactAndPublish(ctx, epoch, "début-tour", msgs, ctxUsed, caps, opt); changed {
|
||||
msgs = out
|
||||
// Le chiffre d'avant compaction ne dit plus rien de la requête qui
|
||||
// part : on compare celui que la compaction vient de poser.
|
||||
@@ -1009,12 +1017,14 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa
|
||||
// retombe tout de suite et le tour suivant démarre avec de la marge.
|
||||
// Sauf si un Reset est passé (rien à compacter) ou si le tour a été annulé
|
||||
// (bouton stop) : on n'enchaîne pas plusieurs secondes de résumé sur un stop.
|
||||
if stale || ctx.Err() != nil || !compactNeeded(msgs, ctxUsed, peak) {
|
||||
if stale || ctx.Err() != nil || !compactNeeded(msgs, ctxUsed, peak) || compactRefusedSkip(conv, ctxUsed) {
|
||||
return
|
||||
}
|
||||
// context.Background() et non ctx : le tour est terminé, son contexte peut
|
||||
// être annulé alors que cette compaction-là doit aller au bout.
|
||||
c.compactAndPublish(context.Background(), epoch, "fin-tour", msgs, ctxUsed, caps)
|
||||
// être annulé alors que cette compaction-là doit aller au bout. Après une
|
||||
// vérification du mode Code, le slot porte son prompt : pas de
|
||||
// continuation (engineSlotHolds), transcription comme avant.
|
||||
c.compactAndPublish(context.Background(), epoch, "fin-tour", msgs, ctxUsed, caps, c.compactOptsFor(caps, msgs, ctxUsed, conv))
|
||||
}
|
||||
|
||||
// ctxNowLocked : contexte à juger pour compacter, c.mu tenu. llama-server
|
||||
@@ -1063,7 +1073,7 @@ func (c *Conversation) CompactNow() error {
|
||||
}
|
||||
c.mu.Unlock()
|
||||
}()
|
||||
if _, changed := c.compactAndPublish(ctx, epoch, "manuel", msgs, lastReal, Caps{}); changed {
|
||||
if _, changed := c.compactAndPublish(ctx, epoch, "manuel", msgs, lastReal, Caps{}, compactOpts{}); changed {
|
||||
c.persist()
|
||||
}
|
||||
}()
|
||||
|
||||
Reference in new issue
Block a user