đ€ Nolife Tokens â Verkleinerung des LLM-Kontexts ohne Zerstörung der Wiederherstellbarkeit
vom 16. August 2026
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 421in der ProtokolldateiauthentizitĂ€tsprĂŒfung entferntundsrc/Security/AuthGuard.phpim 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:
- SIGNAL â Eingebettete kritische Zeichenketten bleiben im sichtbaren optimierten Text erhalten.
- WIEDERHERSTELLUNG â jede
#ref-Nachricht wird byteweise vonvar/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:benchmarkist 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