Das System von OpenAI und PerturbAI, in dem fast 2000 Agenten gemeinsam Forschung betreiben, packt im Kern ein ganzes Labor in eine einzige API-Aufrufkette. Im Szenario der Arzneimittelentwicklung muss jeder Agent Literatur lesen, Hypothesen durchspielen und Experimentprotokolle schreiben – eine Aufgabe umfasst schnell Dutzende Gesprächsrunden. 2000 Parallelitäten sind nicht 2000 Anfragen, sondern 2000 dauerhaft pulsierende Langzeitverbindungen.
Rechnen wir diese Größenordnung zunächst klar. Angenommen, ein einzelner Agent sendet drei Anfragen pro Minute, dann liegt der Spitzenwert bei 100 QPS; rechnet man den Kontext pro Runde mit 8K Token, wird das TPM direkt auf 48 Millionen gedrückt. Zieht eine Aufgabe den Kontext auf 32K, schnellt das TPM bei gleichem QPS sofort auf 190 Millionen – bei vielen Teams ist das Einzel-Key-Kontingent an diesem Punkt bereits erschöpft. Und das ohne Retries. Sobald ein einziger Agent nach einem Timeout wild retryt, gerät die gesamte Kette in einen Retry-Sturm und füllt das Kontingent bis zum Anschlag. Ich habe einmal erlebt, wie ein Batch-Job ohne geschichtete Rate-Limits auf Gateway-Seite das Key des gesamten Teams auf 429 brachte – selbst die Testumgebung war nicht mehr erreichbar.
Noch heikler: Forschungsagenten senden ihre Anfragen nicht gleichmäßig. In der Literaturrecherchephase ist der QPS niedrig, aber der Kontext lang; in der Hypothesengenerierung sind die Anfragen dicht, aber die Token kurz; in der Phase des Schreibens von Experimentprotokollen handelt es sich um typische niederfrequente Schreiboperationen. Drei Lasttypen mischen sich auf derselben Kette: Konfiguriert man Ressourcen einheitlich nach Spitzenwert, verdreifachen sich die Kosten; konfiguriert man nach Mittelwert, bricht bei der ersten Spitze alles zusammen. Deshalb geht es bei der Parallelitätssteuerung von Multi-Agenten-Systemen im Kern nicht darum, „standzuhalten“, sondern „geschichtet standzuhalten“.
Parallelitätssteuerung für Multi-Agenten: in der Praxis in diesen fünf Schritten
Request-Pooling ist die erste Schleuse. Lass nicht jeden Agenten seinen eigenen Client erzeugen, sondern alles einheitlich über einen Connection-Pool laufen, mit HTTP-Keep-Alive-Wiederverwendung; die Poolgröße schätzt man mit QPS × durchschnittlicher RT. Bei 100 QPS und 2 Sekunden durchschnittlicher Antwortzeit braucht der Pool mindestens 200, mit 30 % Reserve. Ein leicht übersehener Punkt: Connection-Pools müssen pro Ziel-Domain getrennt aufgebaut werden. Wenn du gleichzeitig APIs mehrerer Anbieter aufrufst und alles in einem Pool mischst, sinkt die Wiederverwendungsrate wegen Unterschieden bei DNS und TLS-Handshake drastisch. Wir haben gemessen: Nach getrennten Pools stieg die Verbindungswiederverwendungsrate von 62 % auf 91 % – allein das spart fast dreißig Prozent Handshake-Overhead.
Multi-Key-Rotation löst die Kontingent-Obergrenze. Einzelne Keys haben harte Obergrenzen bei RPM und TPM. Macht man N Keys zu einem gewichteten Round-Robin, bei 429 automatisch 60 Sekunden herausnehmen und dann wieder einsetzen. Die Gewichte lassen sich dynamisch nach dem Restkontingent der Keys anpassen statt einfach gleichmäßig zu verteilen. In unserem Projekt nutzen wir die Token8341 Large-Model-API-Aggregationsplattform als einheitlichen Einstiegspunkt; sie ist mit dem OpenAI SDK kompatibel, man wechselt das Modell durch Ändern einer Zeile base_url, und die Key-Verwaltung ist gatewayseitig zentralisiert – das erspart es, Konfigurationen über 2000 Agenten zu verstreuen. Im tatsächlichen Betrieb steigerte gewichtetes Round-Robin mit 20 Keys den verfügbaren QPS um etwa das 18-Fache gegenüber einem einzelnen Key, und es gab nicht ein einziges Mal eine globale Unterbrechung wegen Kontingenten.
Exponentielles Backoff muss Jitter enthalten. Festes Backoff lässt alle fehlgeschlagenen Anfragen in derselben Sekunde zurückkommen; die Backoff-Zeit berechnet man als base×2^n, multipliziert mit einem Zufallsfaktor zwischen 0,5 und 1,5, begrenzt das maximale Backoff auf 30 Sekunden, und nach mehr als 3 Retries geht es direkt in die Dead-Letter-Queue. Ein Detail dazu: Für den Zufallsfaktor des Jitters empfiehlt sich eine threadsichere Zufallsquelle, sonst könnten bei hoher Parallelität mehrere Agenten denselben Seed ziehen und der Jitter wäre wirkungslos. Diesen Fehler haben wir anfangs gemacht und sind erst nach dem Umstieg auf einen aus der Request-ID gehashten Faktor stabil geworden.
Task-Prioritätswarteschlange nach Geschäftswert schichten. Hochwertige Aufgaben wie die Generierung von Arzneimittelhypothesen laufen mit P0 in einem eigenen Kontingent, Literaturzusammenfassungen mit P1 im gemeinsamen Pool, Log-Bereinigung mit P2 in Leerlaufzeiten. Lass P2 nicht das Kontingent von P0 auffressen. Die Warteschlange lässt sich mit einem sortierten Set in Redis umsetzen, der Score als Kombination aus Geschäftspriorität und Zeitstempel, sodass innerhalb gleicher Priorität FIFO gilt und über Prioritäten hinweg strikt verdrängt wird.
Fehler-Degradierung muss vorab festgelegt sein. Bei Timeout des Hauptmodells wird auf ein Ersatzmodell gewechselt; die Token8341 Large-Model-API-Aggregationsplattform unterstützt die automatische Auswahl des optimalen Modells je Aufgabe und kann sowohl inländische als auch gängige Modelle routen, sodass bei der Degradierung kein Geschäftscode geändert werden muss. Die Degradierungsstrategie sollte dreistufig sein: Stufe eins ist der Modellwechsel beim selben Anbieter, Stufe zwei der Anbieterwechsel, Stufe drei die Degradierung auf ein kleines Modell, das nur noch ein strukturiertes Ergebnis als Grundabsicherung liefert. Erst wenn alle drei Stufen scheitern, wird eine Exception geworfen – so lassen sich die meisten Schwankungen von den ersten beiden Stufen abfangen.
Drei Fehler, die ich gemacht habe
Erstens: Kontextlänge nicht nach dem Maximum konfigurieren. Das Modell gibt 128K an, aber wenn du mit 128K lasttest, geraten Latenz und Kosten außer Kontrolle. Der tatsächlich effektive Kontext von Forschungsagenten liegt meist unter 16K; alles darüber wird per Zusammenfassung komprimiert. Wir haben verglichen: Bei derselben Literaturübersichtsaufgabe dauerte es mit 16K Kontext durchschnittlich 4,2 Sekunden bei Kosten von 0,03 Yuan; auf 64K aufgeblasen stieg die Dauer auf 11,8 Sekunden bei Kosten von 0,14 Yuan, ohne dass die Ausgabequalität nennenswert besser wurde. Diese Daten wurden später zur Grundlage für unser Kontextbudget.
Zweitens: Schreiboperationen nicht retryen. Bei nicht-idempotenten Anfragen wie dem Schreiben von Experimentprotokollen durch Agenten erzeugt jeder Retry einen weiteren fehlerhaften Datensatz. Leseoperationen kann man beliebig retryen, Schreiboperationen brauchen einen Idempotenzschlüssel. Die Generierung des Idempotenzschlüssels muss Agenten-ID, Task-ID und Operationsnummer enthalten – alle drei sind unverzichtbar, sonst kollidieren parallele Schreibvorgänge über Agenten hinweg weiterhin. Nach dem Einführen der Idempotenzschlüssel sank die Rate fehlerhafter Daten von drei Promille auf nahezu null.
Drittens: Monitoring auf P99 statt auf den Mittelwert schauen. Ein Mittelwert von 2 Sekunden bei P99 von 40 Sekunden zeigt, dass langsame Anfragen den Tail ziehen – oft ist der Kontext eines Agenten explodiert. Wir haben später auf Seiten der Token8341 Large-Model-API-Aggregationsplattform Dashboards für TPM und Fehlerrate pro Key und pro Modell ergänzt und erst dadurch lokalisiert, dass ein Batch-Job lange Kontexte spamte. Nach der Lokalisierung haben wir für diesen Batch-Job separat eine Kontextobergrenze gesetzt, und P99 fiel von 40 Sekunden auf unter 6 Sekunden. Das zeigt: Die Monitoring-Dimensionen müssen fein genug bis auf „pro Key + pro Modell + pro Aufgabentyp“ gehen, sonst siehst du immer nur einen undifferenzierten Brei von Metriken.
Eine direkt umsetzbare Checkliste für die Parallelitätskonfiguration
Connection-Pool: max_connections = Spitzen-QPS × durchschnittliche RT × 1,3; Timeouts: Verbindung 5 Sekunden, Lesen 30 Sekunden; Retries: maximal 3, exponentielles Backoff mit Jitter, nur Leseoperationen; Rate-Limiting: RPM pro Key nicht über 80 % des offiziellen Werts, TPM mit 20 % Puffer; Warteschlange: drei Stufen P0/P1/P2, P0 mit eigenem Kontingent; Degradierung: je ein Haupt- und ein Ersatzmodell, Timeout-Schwelle 8 Sekunden; Monitoring: Alarme für P99-Latenz, 429-Rate und TPM-Auslastung.
Dazu drei leicht übersehene Punkte: Erstens jedem Agenten ein QPS-Limit pro Instanz setzen, damit ein außer Kontrolle geratener Agent nicht das Ganze lahmlegt; zweitens im Log unbedingt request_id und key_id mitführen, damit man bei Problemen sofort sieht, welche Kette betroffen ist; drittens Lasttests mit realer gemischter Last fahren und nicht nur mit einem einzigen Anfragetyp, sonst ist die gemessene Kapazität fiktiv.
In einem Satz: Bei 2000 Agenten kommt es nicht darauf an, wie stark die Modelle sind, sondern wie stabil die Orchestrierung ist. Die Token8341 Large-Model-API-Aggregationsplattform rechnet nach Verbrauch ab, ist kostengünstiger und eignet sich für solche Szenarien mit hoher Parallelität und gemischtem Betrieb mehrerer Modelle. Ein Blick auf Multi-Modell-Routing und den Vergleich der API-Preise erspart dir die Hälfte der Umwege.
Autor: Zhang Siyuan
Veröffentlichungsdatum: 22. Oktober 2026