Tiny Agents und die Kompressionsgrenze
Zweihundert Werkzeuge passen in keinen Kontext - und die Werkzeugliste ist dabei das billigere der beiden Probleme. Warum dynamisches Filtern zu kurz greift, und was eine Kompressionsgrenze stattdessen tut.
Basics
Für alle frei: das Konzept, die Analogie, das Warum.
In Tool-Calling im Betrieb steht, was am einzelnen Werkzeugaufruf zerbricht: sechs Übersetzungsschichten, ein Fehlerkatalog, erzwungene Syntax, Reparatur. Diese Seite fängt eine Etage darüber an.
Denn wenn der Agent nicht mehr fünf Werkzeuge bedient, sondern zweihundert, stellt sich eine Frage, die der einzelne Aufruf gar nicht kennt: Welche davon zeigt man dem Modell überhaupt? Und gleich dahinter die zweite, teurere: Was passiert eigentlich mit dem, was diese Werkzeuge zurückgeben?
Zwei Probleme, die dauernd verwechselt werden
Der Branchentrend geht zu immer größeren Agenten: lange Systemprompts, dutzende Fähigkeiten, hunderte Werkzeuge. Was dabei schiefgeht, sind zwei voneinander unabhängige Fehlerquellen - und sie liegen um Größenordnungen auseinander:
| Problem | Ursache | Größenordnung |
|---|---|---|
| Verwechselbarkeit | zu viele ähnliche Werkzeug-Definitionen im Schema | ~200 Token je Definition |
| Ballast | die Ausgaben der Werkzeuge fluten den Kontext | das 100- bis 1000-fache |
Die erste Zeile erzeugt Geisteraufrufe, erfundene Parameternamen, die falsche Wahl zwischen zwei fast gleich klingenden Werkzeugen. Die zweite Zeile erzeugt 40.000 Token gescrapten HTML-Text für eine einzige Zahl - und einen Kontext, der nach drei Aufrufen voll ist.
Das ist die eine Idee, an der auf dieser Seite alles hängt: Es sind zwei Probleme, nicht eines.
Wer filtert, löst das billigere Problem
Die naheliegende Antwort auf zu viele Werkzeuge ist, weniger davon zu zeigen: ein Abruf sucht zur Laufzeit die passenden fünf heraus, der Rest bleibt draußen. Das funktioniert - für die obere Zeile der Tabelle. Aus zweihundert Definitionen werden fünf, aus 40.000 Token Werkzeugbeschreibung werden 1.000.
Nur ändert das an der unteren Zeile nichts. Die fünf ausgewählten Werkzeuge laufen anschließend in demselben Kontext, in dem auch der Dialog steht, und schütten ihre Rohausgaben genau dort aus. Wer nur filtert, hat das Problem gelöst, das je Werkzeug 200 Token kostet, und das ungelöst gelassen, das je Aufruf das Hundertfache kostet.
Für die untere Zeile hilft kein Filter. Da hilft nur eine Grenze.
Eine Grenze statt eines Filters
Die Bauform dahinter hat zwei Ebenen und dazwischen genau eine Naht:
Host-Agent
Großes Modell, langer Dialog - und dauerhaft genau drei Werkzeuge im Kontext, egal wie viele Fähigkeiten registriert sind.
- find_capabilityGibt es für dieses Ziel überhaupt jemanden?
- delegateTeilaufgabe abgeben - mit Ziel und den Feldern, die zurückkommen müssen.
- expandIm Rohmaterial nachfragen, das die Zusammenfassung weggelassen hat.
Nach oben passiert nur Verdichtetes: Zusammenfassung, geforderte Felder, ein Handle auf das Original.
- web-readerLiest eine Seite und beantwortet eine Frage dazu.
- crm-lookupSchlägt einen Kontakt im CRM nach.
- calendar-readerLiest Termine und findet freie Zeiten.
Jeder Tiny Agent: eigener frischer Kontext, 1-5 Werkzeuge, festes Ausgabeschema, hartes Token-Budget. Fünf davon oder fünfhundert - oben ändert sich nichts.
Ein Tiny Agent ist auf genau eine Fähigkeit spezialisiert: eigener frischer Kontext, ein bis fünf Werkzeuge, ein festes Ausgabeschema, ein hartes Token-Budget. Sein Auftrag ist ausdrücklich nicht „ruf das Werkzeug auf“ - sein Auftrag ist verdichten. Die 40.000 Token entstehen weiterhin, aber sie entstehen unterhalb der Grenze und bleiben dort.
Der Unterschied zum Filter ist der Ort, an dem gespart wird. Ein Filter entscheidet, was in den Kontext hineingeschrieben wird. Die Kompressionsgrenze entscheidet, was ihn überhaupt erreichen darf. Deshalb bleibt der Hauptkontext konstant klein - unabhängig davon, ob fünf oder fünfhundert Fähigkeiten registriert sind. Das ist die Zielgröße dieser Architektur, und es ist eine ungewöhnliche: nicht Trefferquote, sondern Token-Verbrauch im Hauptkontext je gelöster Aufgabe.
Drei Werkzeuge, und dabei bleibt es
Was der Host-Agent sieht, wächst nicht mit. Es sind immer dieselben drei:
find_capabilitybeantwortet die Frage „gibt es dafür jemanden?“, bevor der Agent sie dem Nutzer zusagt. Und zwar ohne einen einzigen Modellaufruf - die Antwort kommt aus einem Abruf über die angemeldeten Fähigkeiten.delegategibt eine abgegrenzte Teilaufgabe ab. Übergeben wird dabei nicht die Aufgabe im Wortlaut, sondern wonach gesucht wird: ein Ziel in einem Satz und die Felder, die zurückkommen müssen. Diese Explizitheit ist der halbe Trick - was der Host nicht benennen kann, kann er auch nicht delegieren.expandfragt im Rohmaterial nach. Denn der Spezialist verdichtet, ohne die Gesamtaufgabe zu kennen; er wirft womöglich genau den Absatz weg, den der Host gebraucht hätte.
Das dritte Werkzeug ist das, was die Kompression überhaupt erträglich macht. Ohne es wäre Verdichtung eine Einbahnstraße: was weggelassen wurde, ist weg. Weil die Rohausgabe unten liegen bleibt statt gelöscht zu werden, ist sie rückholbar - der Host bekommt die kurze Antwort und behält den Zugriff auf das Original. Das ist der Unterschied zwischen einer Zusammenfassung und einem Verlust.
Ein vierter Fall gehört dazu, auch wenn er kein Werkzeug ist: Wenn für ein Ziel niemand zuständig ist, muss das System das sagen dürfen. Ein Abruf liefert immer einen besten Treffer, auch für Unsinn; ohne Schwellwert landet „mach mir ein Butterbrot“ beim nächstbesten Spezialisten. Die ehrliche Fehlanzeige ist hier kein Ausfall, sondern eine Funktion - und nebenbei die ehrlichste Roadmap, die man haben kann: Sie zählt mit, welche Fähigkeit am häufigsten gefehlt hat.
Blätter, keine Bäume
Eine Sache ist an dieser Architektur bewusst unspektakulär: Es gibt genau zwei Ebenen. Tiny Agents dürfen selbst nicht delegieren - sie haben das Werkzeug schlicht nicht.
Das klingt nach einer Einschränkung und ist eine Entlastung. Eine strikte Zwei-Ebenen-Hierarchie macht Rekursion strukturell unmöglich und die Kostenabschätzung trivial: höchstens ein Sprung, immer. Mehrstufige Delegation klingt mächtiger, holt sich aber sofort Zyklenerkennung, vererbte Budgets und Fehler ins Haus, die über drei Ebenen weiterwandern. Wer je einen Agenten debuggt hat, der einen Agenten aufruft, der einen Agenten aufruft, gibt das gern auf.
Diese Stufe wird gerade geschrieben. Das ist die Gliederung - so wird sie aufgebaut sein:
- Capability Card - das Manifest je Fähigkeit, das gleichzeitig Anmeldung, Dokumentation, Routing-Index und Testfall ist
- Der Router - Beispielanfragen statt Beschreibungen, ein getrennter Veto-Index und die Schwelle, unterhalb derer nichts mehr geroutet wird
- Das Delegations-Protokoll - Auftrag hinunter, Digest herauf, und warum das Budget hart sein muss statt höflich
- Der Artefakt-Speicher - wie aus einer Rohausgabe ein Handle wird und was
expanddarin findet - Der Runner - ein Prozess, viele Konfigurationen: Isolation entsteht durch den frischen Kontext, nicht durch getrennte Container
Zwei Probleme
Zwei Probleme, zwei Größenordnungen
Werkzeug-Definitionen kosten ~200 Token, Werkzeug-Ausgaben das Hundertfache. Wer dynamisch filtert, hat das billigere Problem gelöst und das teurere unberührt gelassen.
Es gibt einen Satz, der in fast jeder Diskussion über zu große Agenten fällt: „Wir laden die Werkzeuge einfach dynamisch nach.“ Der Satz ist richtig und er löst das falsche Problem - genauer: er löst eines von zweien, und zwar das kleinere.
Dieses Kapitel trennt die beiden sauber, weil alle folgenden Kapitel auf dieser Trennung stehen. Wer sie einmal gemacht hat, erkennt sofort, welche Architekturvorschläge nur die obere Hälfte adressieren.
Die Trennung
| Verwechselbarkeit | Ballast | |
|---|---|---|
| Was zu viel ist | Definitionen im Schema | Ausgaben im Verlauf |
| Wovon es abhängt | Anzahl der registrierten Werkzeuge | Anzahl und Art der Aufrufe |
| Kosten je Einheit | ~200 Token je Definition | 10.000 bis 40.000 Token je Aufruf |
| Symptom | Geisteraufrufe, erfundene Parameter, falsche Wahl zwischen zwei ähnlichen Namen | Kontext nach drei Aufrufen voll, Modell verliert den Anfang des Dialogs |
| Wächst mit | dem Katalog | der Arbeit |
Die letzte Zeile ist die unangenehme. Verwechselbarkeit wächst mit dem, was ein Agent könnte - und das ist eine Zahl, die man in der Hand hat. Ballast wächst mit dem, was er tut. Ein Agent mit fünf Werkzeugen, der drei Webseiten liest, hat ein volles Kontextfenster und kein einziges Auswahlproblem.
Warum Filtern nur die obere Zeile trifft
Der übliche Eingriff heißt Tool-Filtering oder Tool-Injection: Ein Abruf sucht zur Laufzeit die fünf zur Anfrage passenden Werkzeuge heraus, die anderen 195 bleiben draußen. Aus 40.000 Token Werkzeugbeschreibung werden 1.000. Das ist eine echte Verbesserung, und sie ist billig zu haben.
Nur laufen die fünf ausgewählten Werkzeuge anschließend in demselben Kontext, in dem auch der Dialog steht. Ihre Rohausgaben landen genau dort. Der Filter hat entschieden, welche Werkzeuge man sieht, nicht was aus ihnen herauskommt.
Die Fläche unten zeigt beides nebeneinander. Der Regler bewegt die Zahl der registrierten Fähigkeiten, der Schalter macht die Aufgabe ausgabelastig - drei Aufrufe, die echten Text zurückgeben statt einer Zahl.
Drei Bauformen, dieselbe Aufgabe
Der Regler bewegt die Zahl der registrierten Fähigkeiten, der Schalter macht die Aufgabe ausgabelastig. Gezeigt wird nur der Hauptkontext - der Ort, an dem Tokens den Dialog verdrängen.
- AMonolith3.700 Token
Alle Definitionen im Schema, alle Rohausgaben im selben Verlauf.
- BTool-Filtering3.700 Token
Ein Abruf legt fünf Definitionen hinein. An den Ausgaben ändert er nichts.
- CTiny Agents4.500 Token
Drei Werkzeuge konstant, und statt Rohausgaben kommen Digests herauf.
5 Fähigkeiten, kleine Ausgaben: Der Monolith steht bei 3.700 Token, Tiny Agents bei 4.500. Variante C ist hier die **teurere** Lösung - der Aufwand fängt erst an, sich zu rechnen, wenn eine der beiden Größen wächst.
Annahmen dieser Rechnung: 1.500 Token Grundlast (Systemprompt und Dialog), 200 Token je Werkzeug-Definition, 3 Werkzeugaufrufe je Aufgabe, 400 Token Rohausgabe je Aufruf bei leichter und 12.000 bei ausgabelastiger Aufgabe, 800 Token je Digest, ein Abruf legt 5 Definitionen in den Kontext. Gerechnet, nicht gemessen. Und über alle Kontexte zusammen verbraucht Variante C mehr als A - dieser Nachteil ist hier bewusst nicht dargestellt, er steht in Kapitel 07.
Geführt in vier Schritten
Jeder Schritt stellt Regler und Schalter selbst ein.
Was hier üblicherweise falsch verstanden wird
- Dynamisches Tool-Filtering löst das Kontextproblem.
- →Es löst die Definitionen-Hälfte. Die Ausgaben der ausgewählten Werkzeuge landen weiterhin im selben Kontext wie der Dialog - Schritt 3 zeigt das bei nur fünf Werkzeugen.
- Tiny Agents sparen Tokens.
- →Insgesamt verbrauchen sie mehr. Sie verlagern den Verbrauch dorthin, wo er nicht stört: weg aus dem Hauptkontext, hinein in kurzlebige Kontexte, die nach der Antwort verfallen.
- Ein größeres Kontextfenster erledigt beides.
- →Es verschiebt die Grenze, es entfernt sie nicht - und es macht die Ausgabenzeile teurer, nicht billiger: Jeder Turn liest den gewachsenen Verlauf erneut.
Die Balken sind gerechnet, nicht gemessen; die Formel steht im Quelltext der Fläche und die Annahmen darunter. Die Aussage hängt nicht an den genauen Zahlen, sondern am Größenordnungsabstand zwischen einer Definition und einer Rohausgabe.
Der interessante Zustand ist Schritt 3: fünf Fähigkeiten, ausgabelastige Aufgabe. Der Katalog ist winzig, das Auswahlproblem existiert nicht - und der Kontext ist trotzdem voll. Ein Filter hat dort nichts zu filtern.
Was stattdessen hilft
Für die untere Zeile hilft kein Filter, sondern eine Grenze: eine Stelle in der Architektur, an der verdichtet wird statt durchgereicht. Unterhalb dieser Grenze dürfen die 40.000 Token entstehen. Oberhalb kommt nur an, was durch ein Ausgabeschema und ein hartes Budget gegangen ist.
Genau das ist ein Tiny Agent: kein „kleines Modell“, sondern ein eigener frischer Kontext mit ein bis fünf Werkzeugen, festem Ausgabeschema und hartem Token-Budget. Sein Auftrag ist ausdrücklich nicht „ruf das Werkzeug auf“, sondern verdichten.
Daraus folgt die Zielgröße dieser Architektur, und sie ist eine ungewöhnliche:
Token im Hauptkontext je erfolgreich gelöster Aufgabe.
Nicht Trefferquote. Trefferquote allein verführt dazu, auf ein Testset hin zu optimieren; ein Agent mit 95 % Erfolg, der dafür 200.000 Token verbrennt, ist auf eigener Hardware unbrauchbar. Die Kopplung von Qualität und Kosten in einer Zahl ist genau die Größe, die in der Praxis über Machbarkeit entscheidet.
Was das für den Rest der Kapitel bedeutet
Jedes folgende Kapitel lässt sich an dieser Trennung prüfen:
- Die Capability Card (Kapitel 02) und der Concierge (Kapitel 03) arbeiten an der oberen Zeile - sie entscheiden, welche Fähigkeit überhaupt in Frage kommt, und zwar ohne dafür einen einzigen Modellaufruf zu verbrauchen.
- Brief und Digest (Kapitel 05) und der Artefakt-Speicher (Kapitel 06) arbeiten an der unteren. Sie sind der Grund, warum die Architektur überhaupt existiert.
- Abstain (Kapitel 04) gehört zu keiner der beiden Zeilen und ist trotzdem nicht wegzulassen: Ein Router ohne Schwellwert routet auch das, wofür es niemanden gibt.
- Kapitel 07 rechnet auf, was das kostet - denn kostenlos ist es nicht.
Wenn Sie beim Lesen nur eine Sache mitnehmen, dann diese: Es sind zwei Probleme, nicht eines, und sie liegen zwei Größenordnungen auseinander.
Weiter
Ab hier liegen die Lösungen - 6 Kapitel für Pro-Mitglieder.
- Die Capability Card - Ein Manifest je Fähigkeit, das gleichzeitig Anmeldung, Dokumentation, Routing-Index und Testfall ist. Und der Grund, warum darin Beispielanfragen stehen statt einer Beschreibung.
- Der Concierge - Routing per Abruf, ohne einen einzigen Modellaufruf. Warum die Counter-Examples in einem zweiten Index liegen müssen und warum drei Schwellwerte die einzigen echten Stellschrauben des Systems sind.
- Abstain ist ein Feature - Ein Top-k-Router trifft immer, auch bei Unsinn - derselbe Kalibrierungsfehler wie ein Modell, das auf die Frage „kannst du das?“ nie nein sagt. Und warum der Abstain-Log die ehrlichste Produkt-Roadmap ist, die man bekommen kann.
- Brief und Digest - Nach unten geht nicht die Aufgabe, sondern wonach gesucht wird. Nach oben kommt ein schemavalidierter Digest mit fünf möglichen Status - und ein Budget, das im Runner erzwungen wird statt im Prompt zu bitten.
- Der Artefakt-Speicher - Nichts wegwerfen, nur nicht mitschicken. Handle und expand() machen aus Verdichtung etwas Rückholbares - das ist der Unterschied zwischen einer Zusammenfassung und einem Verlust.
- Was das kostet - Ein Sprung mehr Latenz, ungefähr das Anderthalb- bis Doppelte an Gesamt-Tokens - und eine Erwartung, die widerlegt werden kann. Zeigt Variante C den Vorteil nicht, ist das Konzept falsch.
Anmelden, um diesen Inhalt zu sehen
Dieser Bereich ist Mitgliedern vorbehalten. Logge dich ein, um weiterzulesen.
Jetzt anmelden