- Die Methode, bei der ein LLM das vollständige Ergebnis eines Tool-Aufrufs verarbeitet, ist langsam, teuer und schlecht skalierbar
- Stattdessen wird ein Ansatz vorgeschlagen, bei dem das LLM die Orchestrierung übernimmt, sodass strukturierte Daten auf Basis eines Ausgabeschemas per Code verarbeitet werden
- Dieser Ansatz ist für die Verarbeitung großer Datenmengen geeignet, da Funktionsverkettung per Code und speicherartige Variablenverwaltung genutzt werden
- Die datenverarbeitende Methode auf Basis von Codeausführung ist besonders genau und skalierbar, da das LLM die Daten nicht selbst rekonstruieren muss
- Der Aufbau einer sicheren AI-Laufzeitumgebung entwickelt sich zu einer neuen Herausforderung; benötigt wird eine nachhaltige und zustandsbehaftet nutzbare Ausführungsumgebung
LLM function calls don't scale; code orchestration is simpler, more effective.
Grenzen des bisherigen Ansatzes, Tool-Aufrufergebnisse wieder an das LLM zurückzugeben
- Bei der Nutzung von MCP(Machine Context Protocol)-Tools werden die Ausgaben eines Tools dem LLM üblicherweise als Nachricht übergeben, um den nächsten Schritt anzustoßen
- In realen Anwendungsfällen liefern die MCP-Server von Linear und Intercom große Antworten im JSON-Format zurück
- JSON ähnelt einer API, jedoch entsteht ohne definiertes Ausgabeschema die Last, dass das LLM den gesamten Text parsen muss
- Zum Beispiel ist das Ergebnis einer Abfrage der Linear-Issue-Liste mit 50 Einträgen, 70.000 Zeichen und rund 25.000 Tokens sehr groß
- Viele
id-Felder haben keine inhaltliche Bedeutung, verbrauchen aber Tokens, und wenn das LLM sie unverändert reproduzieren soll, steigen Kosten und Fehlerrisiko
Warum Datenverarbeitung und Orchestrierung getrennt werden sollten
- Der aktuelle Ansatz vermischt Datenverarbeitung und Orchestrierung in einer einzigen Chat-Sitzung
- Manche erzeugen dafür als „Agent“ andere Threads, doch bei strukturiertem JSON ist das ineffizient
- Ein besserer Ansatz besteht darin, strukturierte Daten direkt per Code zu verarbeiten
- Beispiel: Statt dass das LLM die Ausgabe erzeugt, wird zum Sortieren von Issues per Code
sort ausgeführt und nur das Ergebnis-Array zurückgegeben
Datenverarbeitung auf Basis von Codeausführung
- AI-Berechnungen per Codeausführung werden bereits in verschiedenen AI-Interpretern eingesetzt
- Dieser Ansatz ermöglicht eine einfache Struktur, bei der das LLM die Daten nicht selbst ausgibt, sondern nur entscheidet, wie Tools verwendet werden
Zentrale Konzepte
- Variablen als Speicher nutzen: Wertzuweisung = Speichern, Ausgabe = Abrufen, Übergabe bei Funktionsaufrufen als Argument
- Unterstützung für Funktionsverkettung: Mehrere Funktionsaufrufe parallel oder sequenziell kombinieren, Abhängigkeiten werden als natürlicher Ablauf im Code ausgedrückt
- Skalierbare Verarbeitung großer Datenmengen: In Kombination mit NumPy, pandas usw. lassen sich auch Tausende bis Zehntausende Datensätze leicht verarbeiten
- Auch andere LLM-Aufrufe sind möglich: Innerhalb des vom LLM geschriebenen Codes kann ein weiteres LLM aufgerufen werden, um unstrukturierte Daten zu verarbeiten
Ist MCP darauf vorbereitet?
- Die MCP-Spezifikation definiert bereits ein Eingabeschema, und vor Kurzem wurde auch ein PR für ein Ausgabeschema eingereicht
- Wenn sich Ausgabeschemata allgemein durchsetzen, werden folgende Anwendungen möglich:
- Dashboard zum Issue-Status
- Wöchentlicher Bericht über abgeschlossene Tickets
- AI überwacht feststeckende Tickets und stößt Benachrichtigungen an
Herausforderungen der Code-Ausführungsumgebung
- Sicherheit ist das Kernproblem: Da von AI/Nutzern erzeugter Code ausgeführt wird, muss verhindert werden, dass API-Schlüssel und Daten offengelegt werden
- Im Fall von Lutra ist die Ausführungsumgebung als Sandbox aufgebaut, und dem Modell wird nur die API-Aufrufdokumentation bereitgestellt
- Zustandsbehaftete Ausführungsumgebungen (wie Jupyter) sind teuer, und für Langzeitsitzungen werden Eigenschaften wie zustandslos (stateless) + persistent benötigt
- Dadurch entsteht eine neue Kategorie namens AI-Runtime, deren Design noch aktiv weiterentwickelt wird
Fazit
- Der bisherige Ansatz, Tool-Aufrufergebnisse in das LLM einzuspeisen und dort verarbeiten zu lassen, hat Grenzen bei Kosten und Genauigkeit
- Codebasierte Orchestrierung ermöglicht eine einfache, skalierbare und genaue Verarbeitung
- AI-Code-Ausführungsumgebungen rücken als Laufzeit der nächsten Generation in den Fokus und müssen Sicherheit, Persistenz und Skalierbarkeit bieten
1 Kommentare
Hacker-News-Kommentare
smolagentswurde evaluiert: elegant und attraktiv, aber mit dem Nachteil deutlich höherer Systemkomplexität. Für Umgebungen ohne Schema, etwa dynamisches Reporting mit Sortieren und Aggregieren von Daten, ist das perfekt, für die meisten Aufgaben aber Overkill. Gemini und OpenAI bieten Python-Interpreter-Funktionen, die einen großen Teil der Arbeit von Code-Agenten abdecken können. Ein Ansatz, bei dem endlos Tool-Call-Nachrichten auf den Stack gelegt werden, skaliert schlecht und wird nicht empfohlen. Tatsächliche agentische Workflows sind kurzlebig und verwalten Komplexität über Struktur und Disziplin. Die Lehren aus klassischer Softwareentwicklung gelten unverändert: Das Skalieren von Funktionsaufrufen und das Vermeiden von Chaos waren schon immer dieselben Probleme. Der Schlüssel zu guten Systemen ist das Management der kognitiven Last für Entwickler; einfache, aber ausreichend gut funktionierende Lösungen sind leistungsstarken, kunstvollen Ansätzen überlegen. Die Komposition von Funktionsaufrufen ist ein Beispiel für eine solche einfache Lösung, und auch strukturierte Daten lassen sich mit traditionellen Parsing- und Transformationsmethoden ausreichend verarbeiten. Ist die Struktur unbekannt, liefern selbst günstige Modelle hervorragende Parsing-Leistung. Das Management der Komplexität agentischer Systeme lässt sich letztlich auf eine sorgfältige Verwaltung des Anwendungszustands reduzieren. Durch Manipulation des Message-Stacks lässt sich der aktive Kontext, den man dem Modell gibt, flexibel zusammenstellen – ähnlich wie Speicherverwaltung in eingeschränkten Umgebungen.huggingface smolagentist ein repräsentatives Beispiel für diesen Ansatz, bringt aber das Problem mit sich, dass Rollback oder Recovery bei realen Ausfällen sehr schwierig werden. Grundsätzlich ließe sich das lösen, indem man den gesamten Ausführungsblock in eine verteilte Transaktion kapselt, in der Praxis passt das jedoch schlecht dazu, dass LLMs robusten Code erzeugen sollen, wodurch Fehlerverfolgung und Ursachenanalyse erschwert werden.smolagentgut sei, die Realität von Ausführung und Fehlerbehandlung aber problematisch ist. Man möchte zum Beispiel, dass bei einer unterbrochenen Codeausführung direkt vom jeweiligen Zustand aus weitergemacht werden kann. Es habe sich gezeigt, dass LLMs Code zur Zustandswiederherstellung gut schreiben können, und diese Funktion arbeite inzwischen im realen Produkt (Lutra) ziemlich gut.