Darkwood Blog Blog
  • Artikel
  • Beobachtung
  • Releases
  • Creators
de
  • en
  • fr
Anmeldung
  • Blog
  • Artikel
  • Beobachtung
  • Releases
  • Creators

đŸ€“ Nolife Tokens – Verkleinerung des LLM-Kontexts ohne Zerstörung der Wiederherstellbarkeit

vom 16. August 2026

Anmelden um auf diesen Beitrag zu reagieren

🚀 1

KI-Codierungsagenten haben ein bekanntes Leistungsproblem umgekehrt.

Jahrelang kĂ€mpften wir mit Datenmengen, HTTP-Roundtrips, Latenzbudgets und Prozessspeicher. Diese EinschrĂ€nkungen sind nach wie vor relevant. Neu ist jedoch, dass ein Großteil der Kosten und Fehlerursachen einer Agentensitzung nun in der Eingabeaufforderung liegt: Tool-Ausgabe, Protokolle, Diffs, Repository-Strukturen, Compiler-Rauschen, JSON-Datenblöcke und dieselben Informationszeilen, die hunderte Male wiederholt werden.

Die naive Pipeline ist einfach:

Tool → giant stdout → LLM context

Das funktioniert so lange, bis der Kontext mit irrelevanten Daten gefĂŒllt ist und das Modell immer noch die eine relevante Fehlerzeile finden muss. GrĂ¶ĂŸere Kontextfenster ermöglichen es zwar, alles zu senden, machen es aber nicht ratsam.

Dieser Artikel dokumentiert nolife-tokens, ein bewusst kleines Symfony + Flow-Experiment. Die These ist eng gefasst und ĂŒberprĂŒfbar:

Das Entfernen von Informationen aus dem aktiven LLM-Kontext bedeutet nicht zwangslĂ€ufig deren Verlust. Der Kontext kann stark komprimiert werden, wĂ€hrend ausgelassene Informationen weiterhin deterministisch ĂŒber leichtgewichtige Referenzen wiederhergestellt werden können.

Wir haben Volumen, Signalspeicherung und bytegenaue Wiederherstellung bei TestgerÀten gemessen. Die vom Anbieter abgerechneten Token, die End-to-End-Agentenlatenz und die Kosten in Dollar haben wir noch nicht gemessen. Diese Unterschiede sind wichtig.

Inspiration ohne Produkte zu kopieren

Mehrere offene Projekte erforschen verwandte Ideen: RTK (Komprimierung der Befehlsausgabe, bevor der Agent sie liest), Kontextmodus (Rohdaten aus dem Fenster halten und bei Bedarf abrufen), Headroom (inhaltsbewusste Komprimierung mit reversibler Speicherung), Claude-mem (progressive Offenlegung des Speichers).

Sie mĂŒssen diese Codebasen nicht kennen. Der gemeinsame Nutzen liegt nicht in „einem weiteren Agenten-Framework“. Er liegt vielmehr darin:

FĂŒhren Sie weitere deterministische Arbeiten durch, bevor Sie Daten an das LLM senden.

Das Deduplizieren von Logs, das Entfernen von TelemetrieschlĂŒsseln, das Klassifizieren eines Git-Diffs, das Hashen eines ausgelassenen Abschnitts – all das erfordert kein Modell. Das Kontextbudget des Modells sollte fĂŒr Mehrdeutigkeiten und Entscheidungen verwendet werden, nicht fĂŒr fĂŒnfhundert Kopien von [INFO] Anfrage gestartet.

nolife-tokens ist ein Labor fĂŒr diese Idee im Darkwood-Stack: PHP 8.5, Symfony Console und darkwood/flow. Keine Einbettungen, keine Vektordatenbank, kein MCP, kein Redis, keine LangChain.

Ausgangspunkt: ein GrundgerĂŒst und eine Observable-Pipeline

Das Projekt begann als einfaches Symfony 8.1-GerĂŒst. Der Anwendungscode bestand im Wesentlichen aus einem Kernel. Flow war bereits eine Composer-AbhĂ€ngigkeit, wurde aber nicht verwendet.

Der erste Meilenstein, TOKEN_PIPELINE_POC, stellte eine minimale Flow-Pipeline ĂŒber ein verĂ€nderliches ContextPacket her:

Load
→ Classify
→ MeasureRaw
→ Optimize
→ MeasureOpt
→ EvaluateSignals

CLI-OberflÀche:

bin/console tokens:analyze fixtures/sample.log
bin/console tokens:benchmark

Der Ablauf ist hier nicht wegen der Notwendigkeit einer gleichzeitigen Orchestrierung nĂŒtzlich, sondern weil jede Phase beobachtbar ist. Das Paket sammelt eine Ablaufverfolgung: Bytes und geschĂ€tzte Token nach dem Laden, Inhaltstyp nach der Klassifizierung, GrĂ¶ĂŸe nach der Optimierung, Erfolg/Misserfolg nach den SignalprĂŒfungen. Der Leser (und der Entwickler) sieht:

raw → classified → reduced → evaluated

statt eines undurchsichtigen optimizeContext(), das verbirgt, wo die LautstÀrke verschwunden ist.

Ein typischer tokens:analyze-Trace sieht im Prinzip so aus:

LOAD         | fixtures/sample.log | 19,354 bytes
CLASSIFY     | log
MEASURE_RAW  | 19,354 bytes        | ~4,839 tokens
OPTIMIZE     | log refs=1          | 4,813 bytes
MEASURE_OPT  | markers~4 referenced~3671 | ~1,204 tokens
SIGNAL       | PASS
RECOVERY     | PASS

Diese Stufenliste ist das Produkt. Wenn etwas schiefgeht – unzureichende Einsparungen, ein fehlerhaftes Signal, zu viele Referenzen – lĂ€sst sich erkennen, welcher Schritt dafĂŒr verantwortlich ist, ohne eine separate Metrikplattform einrichten zu mĂŒssen.

Warum das Projekt klein halten? Weil Kontextsysteme dazu neigen, sich zu Frameworks auszuwachsen, bevor ĂŒberhaupt getestet wurde, ob die Kernidee funktioniert. nolife-tokens ist bewusst eher ein Konsolenlabor als eine Bibliothek-API. Keine Ports, Adapter oder spekulative Schnittstellen. Einfache PHP-Klassen, Symfony-Dienste via Autowiring, Dateien unter var/.

GeschÀtzte Token, nicht abgerechnete Token

Die Messung verwendet eine dokumentierte NÀherung, dieselbe Heuristik, die RTK öffentlich dokumentiert:

// TokenEstimator.php (excerpt)
estimatedTokens: (int) ceil($bytes / 4),

Prozentangaben zwischen Rohdaten und optimierten Daten sind fĂŒr den Vergleich nĂŒtzlich. Absolute Zahlen entsprechen nicht den vom Anbieter abgerechneten Token. Unterschiedliche Modelle verwenden unterschiedliche Tokenisierungsmethoden. In diesem Artikel bezeichnet „Token“ diese SchĂ€tzung, sofern nicht anders angegeben.

Deterministische Klassifizierung zuerst

Die Komprimierungsstrategie hÀngt vom Inhaltstyp ab. Die Klassifizierung erfolgt heuristisch und ohne LLM.

Typ Erkennungsskizze
json json_decode ist erfolgreich bei { / [ root
git_diff diff --git oder @@ Hunk-Header
log genĂŒgend Zeilen, die den Level-/Zeitstempelmustern entsprechen
file_list meist nur Pfadzeilen
text Fallback

Diese Unterscheidung ist nicht akademischer Natur. Unterschiedliches Rauschen lÀsst sich unterschiedlich komprimieren.

  • Protokolle: Wiederholungen und Meldungen mit geringem Signal mĂŒssen vermieden werden; wichtige ERROR-/WARNING-Zeilen mĂŒssen erhalten bleiben.
  • JSON: Telemetriedaten, Padding, Anfrage-IDs; Entscheidungsfelder (id, status, error) mĂŒssen erhalten bleiben
  • Git-Diffs: Viele + / - Zeilen enthalten die nĂŒtzlichen Informationen; aggressives KĂŒrzen ist gefĂ€hrlich
  • Dateilisten: können zu Baumstrukturen mit ZĂ€hlungen zusammengefasst werden
  • Text: Nur leichte Leerzeichen im aktuellen POC

Erster Vergleichsmaßstab: LautstĂ€rke vs. Signal

Die Testdaten enthalten absichtlich kritische Zeichenketten. Eine Optimierung, die lediglich das Ende abschneidet, wĂŒrde zwar oft „Tokens sparen“, aber gleichzeitig den eingefĂŒgten Fehler löschen. Der Benchmark ĂŒberwacht daher SIGNAL: Jede erwartete Teilzeichenkette muss im optimierten sichtbaren Text noch vorhanden sein.

Ergebnisse des ersten Meilensteins (verlustbehaftete Optimierung – ausgelassenes Material wurde noch nicht gespeichert):

CASE RAW-Bytes RAW-Tokens* OPT-Bytes OPT-Tokens* SAVED SIGNAL
sample.log 19.354 4.839 4.759 1.190 75,4 % BESTANDEN
sample.diff 12.742 3.186 9.684 2.421 24,0 % BESTANDEN
sample.json 27.118 6.780 265 67 99,0 % BESTANDEN

* geschÀtzt als Bytes / 4

Zu den platzierten Signalen gehörten:

  • ERROR PaymentService line 421 in der Protokolldatei
  • authentizitĂ€tsprĂŒfung entfernt und src/Security/AuthGuard.php im Diff
  • Zahlungs-ID, "status": "fehlgeschlagen" und die Fehlermeldung im JSON-Format

Die entscheidende Kennzahl ist nicht „Wie viel haben wir entfernt?“, sondern: Sind die fĂŒr die Entscheidungsfindung notwendigen Informationen erhalten geblieben?

JSON: Strukturiertes Rauschen lÀsst sich gut komprimieren

JSON war der einfachste Fall. Strukturierte SchlĂŒssel ermöglichten es einem deterministischen Filter, Telemetriedaten zu verwerfen oder spĂ€ter darauf zu verweisen, wĂ€hrend Entscheidungsfelder erhalten blieben. Eine Nutzlast, die hauptsĂ€chlich aus FĂŒll- und Debug-Frames bestand, reduzierte sich von geschĂ€tzten ~6.800 Token auf wenige Dutzend sichtbare JSON-Token im ersten Meilenstein mit SIGNAL PASS.

Das ist der strukturelle Vorteil von typisiertem Rauschen: Man kann benennen, was entbehrlich ist.

Protokolle: Wiederholung ist kostenloses Geld – bis die Signale ausfallen

Die Protokolle werden komprimiert, weil die Agenten dieselbe Zeile wiederholt sehen:

[INFO] request started
[INFO] request started
[INFO] request started
[INFO] request started

wird zu:

[INFO] request started ×4

Wichtige Signalzeilen bleiben unverĂ€ndert. Das klingt trivial, bis man einen deterministischen Test zur Datenspeicherung schreibt. Eine frĂŒhe Testumgebung verwendete [ERROR] PaymentService Zeile 421, wĂ€hrend das erwartete Signal ERROR PaymentService Zeile 421 lautete. Der Teilstring schlug aufgrund der schließenden eckigen Klammer ] zwischen ERROR und PaymentService fehl. Die Lehre daraus ist simpel und wichtig: Signaltests reagieren empfindlich auf FormatierungsĂ€nderungen, und wichtige Signalzeilen mĂŒssen sowohl fĂŒr Menschen als auch fĂŒr PrĂŒfungen stabil genug bleiben.

Git-Diffs: ein nĂŒtzlich schwaches Ergebnis

Die Diff-Fixture sparte nur etwa 24 % ein. Das ist kein Fehler des Experiments. Besteht der Großteil der Eingabe aus sinnvollen Änderungszeilen, gibt es kaum unbedenkliches Rauschen. Ein blindes Anstreben einer „90%igen Reduzierung“ wĂŒrde die Entscheidungsgrundlage verschlechtern (beispielsweise durch das Entfernen der AuthentifizierungsprĂŒfung in AuthGuard.php).

Git-Diffs zeigen eine natĂŒrliche Komprimierungsgrenze. Genau solche Ergebnisse wĂŒnscht man sich von einem Laborexperiment: wo man nicht noch weiter pushen sollte.

Was der erste Meilenstein in einem Satz lehrte: Token-Reduzierung ohne Signaltest ist sinnlos. Mit einem Signaltest lĂ€sst sich der Unterschied zwischen „Wir haben Rauschen entfernt“ und „Wir haben den Fehler beseitigt“ erkennen.

Die fehlende Eigenschaft: entfernen ≠ zerstören

Der erste Proof of Concept wies eine strukturelle SchwĂ€che auf. Sobald Inhalte verworfen wurden, waren sie nicht mehr im aktiven Kontext verfĂŒgbar und somit nicht mehr zugĂ€nglich. Falls ein Agent spĂ€ter entschied, dass die verworfenen Telemetriedaten relevant waren, gab es nichts abzurufen.

Das fĂŒhrt zum zweiten Meilenstein: REVERSIBLE_CONTEXT_POC.

Prinzip:

REMOVE FROM CONTEXT
≠
DESTROY INFORMATION

Optimierer geben nun ein OptimizeResult zurĂŒck:

// OptimizeResult.php
final class OptimizeResult
{
    /**
     * @param list<array{reason: string, content: string, marker_placeholder?: string}> $omissions
     */
    public function __construct(
        public readonly string $visible,
        public readonly array $omissions = [],
    ) {}
}

ContextOptimizer speichert jede Auslassung unter var/context/<id> .json und fĂŒgt eine kurze Markierung in den sichtbaren Text ein:

// ContextOptimizer.php (excerpt)
$id = $this->store->makeId($packet->sourcePath, $omission['reason'], $omission['content']);
$ref = new ContextReference(
    id: $id,
    source: $packet->sourcePath,
    type: $packet->type->value,
    reason: $omission['reason'],
    content: $omission['content'],
);
$this->store->put($ref);
// ...
$visible = str_replace($placeholder, $ref->marker(), $visible);

Die IDs sind deterministisch und kurz: ctx_ plus die ersten Hexadezimalziffern von sha256(source|reason|content).

TatsĂ€chliche gespeicherte Form (abgekĂŒrzt):

{
  "id": "ctx_31154f",
  "source": "fixtures/sample.log",
  "type": "log",
  "reason": "deduplicated repeated lines",
  "content": "[INFO] request started\n..."
}

Der aktive Kontext benötigt lediglich Folgendes:

#ref:ctx_31154f

Im logischen Groblauf kostet diese Markierung etwa vier geschĂ€tzte Token, wĂ€hrend ~3.600 geschĂ€tzte Token außerhalb des Kontextes auf der Festplatte liegen.

Retrieval ist ein Konsolenbefehl, keine Suchmaschine:

bin/console tokens:show-ref ctx_31154f
// TokensShowRefCommand.php (excerpt)
$ref = $this->store->get($id);
$io->writeln(sprintf('Source: %s', $ref->source));
$io->writeln(sprintf('Type: %s', $ref->type));
$io->writeln(sprintf('Reason: %s', $ref->reason));
$io->writeln('--- RAW CONTENT ---');
$io->writeln($ref->content);

ContextStore::get normalisiert #ref:ctx_
 oder reine IDs und liest die JSON-Datei. Die Wiederherstellung in der Pipeline erfolgt bytegenau: Jede Referenz wird neu geladen und der Inhalt mit dem wÀhrend der Optimierung geschriebenen Inhalt verglichen.

Aktualisierte Flow-Pipeline

Load
→ Classify
→ MeasureRaw
→ Optimize (+ store refs)
→ MeasureOpt
→ EvaluateSignals
→ EvaluateRecovery

Die Konstruktion bleibt ein FlowFactory-Generator von Closures ĂŒber ContextPacket:

// TokenPipelineFactory.php (excerpt)
return $this->flowFactory->create(static function () use (...) {
    yield static function (ContextPacket $packet): ContextPacket {
        $packet->type = $classifier->classify($packet->raw);
        $packet->addTrace('CLASSIFY', $packet->type->value);
        return $packet;
    };

    yield static function (ContextPacket $packet) use ($optimizer): ContextPacket {
        $optimizer->optimize($packet);
        $packet->addTrace('OPTIMIZE', sprintf('%s refs=%d', $packet->type->value, count($packet->references)));
        return $packet;
    };

    // 
 MEASURE_OPT, SIGNAL 


    yield static function (ContextPacket $packet) use ($store): ContextPacket {
        foreach ($packet->references as $ref) {
            $loaded = $store->get($ref->id);
            if ($loaded === null || $loaded->content !== $ref->content) {
                $missing[] = $ref->id;
            }
        }
        $packet->recoveryPass = $missing === [];
        $packet->addTrace('RECOVERY', $packet->recoveryPass ? 'PASS' : 'FAIL');
        return $packet;
    };
});

Zwei Invarianten:

  1. SIGNAL – Eingebettete kritische Zeichenketten bleiben im sichtbaren optimierten Text erhalten.
  2. WIEDERHERSTELLUNG — jede #ref-Nachricht wird byteweise von var/context/ ĂŒbertragen.

Reversibler Benchmark

Aktuelle Messergebnisse:

FALL ROH SICHTBAR MARKIERUNGEN REFERENZ GESPEICHERT REFS SIGNAL WIEDERHERSTELLUNG
sample.log@coarse 4.839 1.204 4 3.671 75,1 % 1 PASS PASS
sample.log@fine 4.839 1.202 12 3.670 75,2 % 3 BESTANDEN BESTANDEN
sample.json 6.780 146 36 6.191 97,8 % 9 BESTANDEN BESTANDEN
sample.diff 3.186 2.434 4 749 23,6 % 1 PASS PASS

So lesen Sie die Spalten:

  • RAW — geschĂ€tzte Token der ursprĂŒnglichen Eingabe
  • SICHTBAR — geschĂ€tzte Tokens, die sich noch im aktiven Kontext befinden (einschließlich #ref-Markierungen)
  • MARKIERUNGSMARKIERUNGEN — geschĂ€tzte Kosten nur fĂŒr die Markierungsmarkierungen
  • VERWENDET — geschĂ€tzte Tokens, die außerhalb des Kontextes gespeichert wurden.
  • GESPART — Reduzierung des sichtbaren im Vergleich zum Rohmaterial
  • SIGNAL-/WIEDERHERSTELLUNG — die beiden Invarianten fĂŒr bestanden/nicht bestanden

JSON lĂ€sst sich weiterhin stark reduzieren (ca. 98 % sichtbare Reduzierung), wobei Entscheidungsfelder erhalten bleiben und ca. 6.200 geschĂ€tzte Token hinter strukturellen Referenzen geparkt werden. Diffs bleiben der resistenteste Fall (ca. 24 %), jetzt mit einer einzigen groben Referenz fĂŒr den reduzierten, unverĂ€nderten Kontext anstelle von Dutzenden von Mikroreferenzen.

Grob vs. fein: ReferenzgranularitÀt hat ihren Preis

FĂŒr die Protokolle werden beide GranularitĂ€tsstufen des Benchmarks ausgefĂŒhrt.

Modus REFS MARKER SICHTBAR
grob 1 4 1.204
fein 3 12 1.202

Der Feinmodus verdreifachte die Referenzanzahl und den Marker-Overhead, um etwa zwei geschĂ€tzte sichtbare Token einzusparen. FĂŒr diese Arbeitslast war der Grobmodus besser geeignet: einfacherer Abruf, weniger IDs, die ein Agent verfolgen muss, nahezu identischer aktiver Kontext.

Das ist kein allgemeingĂŒltiges Gesetz. Die GranularitĂ€t sollte dem erwarteten Abrufmuster entsprechen. Protokolle benötigen oft einen einzigen Blob, der alle zusammengefassten Daten enthĂ€lt. Strukturiertes JSON benötigt hĂ€ufig Referenzen an Feldpositionen, damit das Modell weiterhin erkennt, wo die Telemetriedaten gespeichert wurden.

Logarithmische Grobeinmission (Auszug):

// LogOptimizer.php (coarse branch excerpt)
$out[] = sprintf('%s ×%d', $prev, $count);
$coarseParts[] = $expanded;
// 

$visible .= "\n\nRepeated informational logs omitted.\n" . $placeholder;
$omissions[] = [
    'reason' => 'deduplicated repeated lines',
    'content' => implode("\n\n", $coarseParts),
    'marker_placeholder' => $placeholder,
];

Strukturelle JSON-Referenzen

Konzeptionell:

{
  "id": 42,
  "status": "failed",
  "error": "PaymentService timeout",
  "telemetry": { "... huge payload ..." }
}

wird zu:

{
  "id": 42,
  "status": "failed",
  "error": "PaymentService timeout",
  "telemetry": "#ref:ctx_xxxxxx"
}

Das Modell erfasst weiterhin semantische Position, Kennungen, Status und Fehler. SchĂ€tzungsweise sechstausend Telemetrie-Token sind außerhalb des Zeitfensters verfĂŒgbar. Die aktuelle Konfiguration liefert neun Referenzen (RauschschlĂŒssel + gruppierte AuffĂŒllung), ca. 36 Marker-Token, SIGNAL PASS und RECOVERY PASS.

Dies ist robuster als das Löschen von SchlĂŒsseln: Die Struktur bleibt erhalten, selbst wenn die Werte aus der Eingabeaufforderung entfernt werden.

Im Code werden RauschschlĂŒssel nicht verworfen; ihre Werte werden zu Platzhaltern, die ContextOptimizer spĂ€ter in #ref:
 umschreibt. Padding-SchlĂŒssel, die padding_* / noise_* entsprechen, werden nach Möglichkeit zu einer einzigen Auslassung zusammengefasst, damit ein großer Block nicht in achtzig kleine Referenzen zerfĂ€llt:

// JsonOptimizer.php (excerpt)
if ($this->isPaddingKey($key)) {
    $paddingBucket[$key] = $item;
    continue;
}

if ($this->isNoiseKey($key)) {
    $placeholder = '{' . '{REF_' . count($omissions) . '}' . '}';
    $omissions[] = [
        'reason' => 'omitted json field: ' . $key,
        'content' => json_encode($item, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) ?: '',
        'marker_placeholder' => $placeholder,
    ];
    $result[$key] = $placeholder;
    continue;
}

Das sichtbare JSON sieht daher immer noch wie die API-Antwort aus. Das ist wichtig fĂŒr Agenten, die Feldnamen ebenso wie Fließtext analysieren.

Dies ist kein RAG

nolife-tokens verwendet keine Einbettungen, Vektorsuche, semantische Suche, externe Datenbanken, LangChain, MCP oder Redis.

Die heutige Abfrage ist:

reference id → local JSON file → exact bytes

Diese Einfachheit ist beabsichtigt. Wir wollen Beweise dafĂŒr, dass eine kostengĂŒnstige Strukturreduktion bereits den grĂ¶ĂŸten Teil des offensichtlichen Überschusses beseitigt. Die semantische Suche kann warten, bis Messungen deren Notwendigkeit aufzeigen.

Auswirkungen auf Kodierungsagenten

Eine diszipliniertere Pipeline sieht folgendermaßen aus:

Tool
  → deterministic reducer
  → high-signal context (+ #ref markers)
  → LLM

          ↓ (only if needed)
     tokens:show-ref / expand
          ↓
       raw source

Dies erfordert weder einen Ersatz fĂŒr Cursor noch die Entwicklung einer anderen IDE. Eine zukĂŒnftige Integration kann so einfach sein wie:

bin/console tokens:context 


und das optimierte Ergebnis in einen bestehenden Agenten einzufĂŒgen oder weiterzuleiten. Ziel ist ein besserer Kontext fĂŒr die bereits verwendeten Tools – keine weitere AgentenoberflĂ€che.

Kosten und Latenz (sorgfĂ€ltige AnsprĂŒche)

Weniger Eingabetoken können die Kosten fĂŒr den Anbieter, den Vorverarbeitungsaufwand, die Latenz und das Rauschen reduzieren. Wir haben diese Auswirkungen in diesem Projekt nicht anhand einer Live-Anbieter-API getestet. Bisher haben wir Kontextvolumen, Signalspeicherung und Wiederherstellung gemessen. Eine Volumenreduzierung fĂ€lschlicherweise als Kostensenkung zu interpretieren, wĂ€re irrefĂŒhrend.

Es gibt noch einen weiteren Effekt zweiter Ordnung, der fĂŒr die Agenten relevant ist: Ablenkung. Selbst wenn ein Modell den Fehler in einem 20 KB großen Protokoll findet, kann es seine Aufmerksamkeit auf die umgebenden Wiederholungen richten. Deterministische Datenreduktion dient nicht nur der Kostenoptimierung, sondern schafft eine klarere Entscheidungsgrundlage fĂŒr das Modell. Dieser Effekt ist schwieriger zu quantifizieren als die Anzahl der Bytes, und wir haben hier auch nicht versucht, ihn zu quantifizieren.

Eine praktische, kurzfristige Anwendung innerhalb von Darkwood-Workflows ist derzeit noch offline möglich: Man fĂŒhrt tokens:analyze auf einer Fixture oder einem erfassten Tool-Dump aus, untersucht den Stage-Trace und entscheidet, ob der sichtbare Kontext fĂŒr das EinfĂŒgen in Cursor ausreicht. Eine Integration, die jeden Shell-Befehl abfĂ€ngt (RTK-Stil), ist fĂŒr diese Meilensteine ​​ausdrĂŒcklich nicht vorgesehen.

Ingenieurphilosophie

Bevor Sie ein Model anrufen, fragen Sie:

Kann PHP diesen Teil deterministisch lösen?

In dieser Codebasis, die Folgendes beinhaltet: Inhalte klassifizieren, Protokolle deduplizieren, JSON-Rauschen entfernen oder referenzieren, Dateistrukturen reduzieren, Git-Metadaten und lange unverĂ€nderten Kontext verwerfen, Auslassungen hashen, Referenzen speichern, GrĂ¶ĂŸen messen, Signale ĂŒberprĂŒfen, Wiederherstellung ĂŒberprĂŒfen.

Komponenten (Aufgaben, keine Dateiausgabe):

StĂŒck Rolle
ContextPacket Pipeline-Nutzdaten: Roh-/optimierter Text, Metriken, Referenzen, Trace
ContentClassifier Deterministische Typerkennung
TokenEstimator / ContextMetrics Bytes, Zeilen, geschÀtzte Tokens
OptimizeResult Sichtbarer Text + Auslassungen
ContextReference / ContextStore Marker + var/context/<id> .json
ContextOptimizer Dispatch nach Typ, persistente Referenzen, eingefĂŒgte Marker
LogOptimizer / JsonOptimizer / GitDiffOptimizer / 
 Inhaltsspezifische Reduzierung
SignalEvaluator ÜberprĂŒfung auf eingefĂŒgte Teilzeichenketten
TokenPipelineFactory Ablaufphasen
tokens:analyze / benchmark / show-ref CLI

Fehlermodi, die wir bereits erreicht haben oder erwarten

Überkompression

Eine seltene, aber entscheidende Linie kann wie Rauschen aussehen. Installierte Signalleuchten erfassen einen Teil davon; echte Agenten treffen auch die Stellen, die von den Leuchten nicht erfasst werden.

Referenzexplosion

Ein frĂŒher Git-Ansatz erzeugte etwa 36 winzige Referenzen fĂŒr zusammengefasste KontextlĂ€ufe. Der Marker-Overhead stieg enorm an; die Benutzerfreundlichkeit beim Abrufen verschlechterte sich. Die Lösung bestand in einer einzigen groben Referenz fĂŒr den gesamten ausgelassenen, unverĂ€nderten Kontext. Weniger, aber aussagekrĂ€ftige Referenzen sind besser als viele Mikroreferenzen.

Semantischer Verlust

Die Beibehaltung einer Zeichenkette gewÀhrleistet nicht immer deren Interpretierbarkeit. Ein Statuscode ohne begleitende ErlÀuterung kann ein Modell weiterhin verwirren. Deterministische Filter optimieren auf Datenvolumen und explizite Signale, nicht auf deren VerstÀndnis.

Falsche Sicherheit durch bytes / 4

Die prozentualen Vergleichswerte sind fĂŒr dieses Labor aussagekrĂ€ftig. Die absoluten „auf der Rechnung eingesparten Gutscheine“ hingegen nicht.

AbrufabhÀngigkeit

Sobald der Agent auf #ref angewiesen ist, muss ihm beigebracht werden, wie er die Referenz erweitert. Aktuell ist dies ein Mensch, der tokens:show-ref ausfĂŒhrt. Die automatische, progressive Offenlegung ist das nĂ€chste Experiment, noch keine ausgereifte Funktion.

ID-Kollisionen und Ladenhygiene

Referenz-IDs sind inhaltsadressiert. Kollisionen mit anderem Inhalt verlĂ€ngern die Hash-LĂ€nge und fĂŒhren zu einem Fehler. Kollisionen mit dem Inhalt werden idempotent ĂŒberschrieben. Der Speicher befindet sich unter var/, das von .gitignore ignoriert wird; es handelt sich um einen Arbeitsbereichscache, nicht um eine dauerhafte Wissensdatenbank. Dies ist fĂŒr einen Proof of Concept (POC) angemessen, aber fĂŒr den produktiven Mehrbenutzerbetrieb unzureichend – ein weiterer Grund, dies nicht mit der Persistenz von Claude-mem zu verwechseln.

Sicherheitslage

Behandeln Sie analysierte Inhalte als Daten, niemals als auszufĂŒhrende Anweisungen. Optimierer schreiben lediglich Zeichenketten um. Protokolle und JSON-Dateien können Text enthalten, der wie Agentenanweisungen aussieht („Vorherige Anweisungen ignorieren
“). Die Pipeline darf diesen Text nicht als Steuerungselement verwenden. Heutzutage ist dies hauptsĂ€chlich eine Frage der Implementierung: kein eval, keine Verarbeitung von Inhalten, kein Vertrauen in Fixture-Texte als Richtlinie.

Was wir absichtlich weggelassen haben

Es ist sinnvoll, auch die Nicht-Ziele aufzulisten, damit das Experiment lesbar bleibt:

Eine LLM-basierte Zusammenfassung der ausgelassenen Abschnitte erfolgt (noch) nicht. Die Zusammenfassungen wÀren auf andere Weise verlustbehaftet und schwieriger exakt wiederherzustellen.

  • Keine automatische Cursor-Abfangfunktion oder HĂŒlsenabfangfunktion
  • Kein Kontextbudget-Packer, der aus zwanzig Kandidaten innerhalb eines 4k-Limits auswĂ€hlt (spĂ€ter in der ursprĂŒnglichen Roadmap entworfen, nicht implementiert)
  • Keine PHPUnit-Zeremoniesuite; tokens:benchmark ist die ValidierungsoberflĂ€che
  • Es wird nicht behauptet, dass die geschĂ€tzten Token mit den AbrechnungszĂ€hlern von OpenAI/Anthropic ĂŒbereinstimmen.

Das Weglassen dieser Elemente ist Teil der Methode: Man misst die Idee der reversiblen Reduktion, bevor man Produkte darauf stapelt.

Weiter: Progressive Offenlegung

Die natĂŒrliche Fortsetzung:

LEVEL 0  tiny overview
   ↓
LEVEL 1  selected section / #ref expansion
   ↓
LEVEL 2  raw original source

Beispielskizze:

Application failed during checkout.
1 PaymentService error.
telemetry omitted.
#ref:ctx_payment

Bei Bedarf: Referenz erweitern. Nur falls weiterhin erforderlich: vollstĂ€ndiges Rohmaterial. Der Kontext wird bedarfsorientiert, anstatt „zuerst das gesamte Protokoll senden“.

Hier hört nolife-tokens auf, nur ein Kompressor zu sein, und wird zu einem Experiment in Kontextarchitektur.

Diagrammatisch:

                    ┌─────────────────────┐
   raw tool dump ─â–ș │ classify + optimize │ ─â–ș visible context (+ #ref)
                    └──────────┬──────────┘
                               │ omissions
                               ▌
                        var/context/*.json
                               │
              expand / show-ref │ (on demand)
                               ▌
                         original bytes

Heute erfolgt der AbwĂ€rtspfeil manuell. Durch die schrittweise Offenlegung wird er Teil des Agentenprozesses: zuerst die Übersicht, dann die ausgewĂ€hlten Erweiterungen und erst dann die Rohdaten, wenn die kostengĂŒnstigeren Ebenen fehlschlagen.

Abschluss

Große Kontextfenster verleiten zu einer bequemen Standardeinstellung: alles senden. Die technische Frage verschiebt sich von „Wie viel kann das Modell verarbeiten?“ zu:

Welcher minimale Kontext ist fĂŒr die richtige Entscheidung erforderlich, und wie kostengĂŒnstig können wir den Rest ermitteln?

Zwei Meilensteine ​​der Nolife-Tokens lassen sich bereits anhand von Messungen ablesen:

  • Bei verrauschten Protokollen und JSON sind große deterministische Reduktionen möglich.
  • Die Signalerhaltung kann als Invariante erster Klasse getestet werden
  • ausgelassenes Material kann bytegenau wiederherstellbar bleiben
  • Die ReferenzgranularitĂ€t selbst verursacht messbare Kosten (grob ist besser als fein bei unserer Messlatte).
  • Inhaltstypen haben unterschiedliche natĂŒrliche Komprimierungsgrenzen (Git-Diffs ~24% hier).

Das Problem ist nicht gelöst. Die Kosten fĂŒr die Anbieter, die agentengesteuerte Expansion und die schrittweise Offenlegung bleiben weiterhin ungelöst. Das Labor ist bewusst klein gehalten: klein genug, dass jeder Mechanismus noch verstĂ€ndlich ist – was bei Kontextsystemen möglicherweise genau der Sinn der Sache ist.

In dieser Arbeit verwendete Befehle

bin/console tokens:analyze fixtures/sample.log
bin/console tokens:analyze fixtures/sample.log --granularity=fine
bin/console tokens:analyze fixtures/sample.json
bin/console tokens:analyze fixtures/sample.diff
bin/console tokens:benchmark
bin/console tokens:show-ref ctx_31154f

Quellcode

Repository: https://github.com/matyo91/nolife-tokens
Slides: https://github.com/matyo91/slidewire

Anmelden um auf diesen Beitrag zu reagieren

🚀 1

Site

  • Sitemap
  • Kontakt
  • Impressum

Network

  • Hello
  • Blog
  • Apps
  • Photos

Social

Darkwood 2026, alle Rechte vorbehalten