OpenAIとPerturbAIの、約2000個のエージェントが協調して科学研究を行うシステムは、本質的に一つの研究室を一本のAPI呼び出しチェーンに詰め込んだものだ。新薬研究開発のシナリオでは、各エージェントが文献を読み、仮説を実行し、実験記録を書く。一回のタスクで数十ラウンドの対話になることもざらだ。2000の並行処理とは2000回のリクエストではなく、2000本の持続的なハートビートを持つ長接続である。
まずこの量級をはっきり換算しよう。単一エージェントが毎分3回リクエストを送ると仮定すると、ピークは100 QPSになる。各ラウンドのコンテキストを8K tokenとすると、TPMは直接4800万に達する。もしあるタスクがコンテキストを32Kまで引き上げると、同じQPSでもTPMは瞬時に1.9億まで跳ね上がり、多くのチームの単一Keyのクォータはこの段階で底を突く。これにはまだリトライが含まれていない。あるエージェントがタイムアウト後に狂ったようにリトライするだけで、チェーン全体がリトライストームに陥り、クォータを使い果たす。かつてゲートウェイ側のレート制限で階層化を行っていなかったため、あるバッチ処理タスクがチーム全体のKeyを429まで追い込み、テスト環境すら接続できなくなったのを見たことがある。
さらに厄介なのは、科学研究系エージェントのリクエストが均一ではないことだ。文献検索段階ではQPSは低いがコンテキストは長く、仮説生成段階ではリクエストは密集するがtokenは短く、実験記録の書き込み段階は典型的な低頻度の書き込み操作だ。三種類の負荷が同じチェーンに混在する中で、ピークに合わせて一律にリソースを配分すればコストは三倍になり、平均に合わせて配分すればピークが来た瞬間に雪崩を起こす。これが、マルチエージェントシステムの並行処理ガバナンスの核心が「耐える」ことではなく「階層的に耐える」ことである理由だ。
マルチエージェントの並行処理ガバナンス、実践はこの五ステップで進める
リクエストのプール化が第一の関門だ。各エージェントが自分でclientをnewするのではなく、統一的にコネクションプールを通し、HTTP keep-aliveで再利用し、プールサイズはQPS×平均RTで見積もる。100 QPS、平均応答2秒なら、プールは少なくとも200、30%の余裕を残す。ここで見落としやすい点がある。コネクションプールはターゲットドメインごとに分けて作る必要がある。もし複数ベンダーのAPIを同時に呼び出す場合、一つのプールに混ぜるとDNSやTLSハンドシェイクの差異により再利用率が急落する。我々が実測したところ、プールを分けた後、接続再利用率は62%から91%に向上し、これだけでハンドシェイクのオーバーヘッドを約三割削減できた。
マルチKeyローテーションでクォータの天井を解決する。単一KeyのRPMとTPMにはいずれもハードリミットがある。N個のKeyを加重ラウンドロビンにし、429に遭遇したら自動的に60秒間除外してから戻す。重みは単純な平均ではなく、Keyの残りクォータに応じて動的に調整できる。我々のプロジェクトではtoken8341大規模モデルAPIアグリゲーションプラットフォームを統一エントリとして使い、OpenAI SDKと互換性があり、base_urlを一行変えるだけでモデルを切り替えられ、Key管理はゲートウェイ側に集約され、2000個のエージェントに設定が散らばる手間を省いた。実際に走らせてみると、20個のKeyで加重ラウンドロビンを行い、単一Keyと比べて利用可能なQPSは約18倍に向上し、クォータによる全体の中断は一度も発生しなかった。
指数バックオフには必ずジッターを付ける。固定バックオフでは全ての失敗リクエストが同じ秒に戻ってくる。バックオフ時間はbase×2^nに0.5から1.5のランダムファクターを掛け、最大バックオフは30秒で上限とし、リトライが3回を超えたら直接デッドレターキューに入れる。ここで細部を一つ補足する。ジッターのランダムファクターにはスレッドセーフな乱数源を使うことを勧める。そうでなければ高並行下で複数のエージェントが同じシードを取ってしまい、ジッターが無効化される。我々は初期にこの罠を踏み、後にリクエストIDのハッシュでファクターを生成する方式に変えて安定した。
タスク優先度キューは業務価値で階層化する。新薬仮説生成のような高価値タスクはP0の独立クォータで、文献要約はP1の共有プールで、ログクリーニングはP2として空き時間に走らせる。P2にP0のクォータを食わせてはいけない。キューの実装にはRedisのsorted setを使い、scoreは業務優先度とタイムスタンプの組み合わせにして、同一優先度内では先入れ先出しを保証し、優先度を跨ぐ場合は厳格にプリエンプトする。
失敗時のフォールバックは事前に決めておく。メインモデルがタイムアウトしたら予備モデルに切り替える。token8341大規模モデルAPIアグリゲーションプラットフォームはタスクに応じて最適なモデルを自動選択でき、国産モデルも主要モデルもルーティングできるため、フォールバック時に業務コードを変える必要がない。フォールバック戦略は三級にすることを勧める。一級は同一ベンダー内でのモデル変更、二級はベンダー変更、三級は小型モデルへのフォールバックで構造化結果だけを最低限返す。三級まで全て失敗して初めて例外を投げる。こうすれば大半の揺らぎは前二級で吸収できる。
私が踏んだ三つの罠
第一に、コンテキスト長は最大値で配分してはいけない。モデルは128Kを標称しているが、128Kで負荷テストを行うと遅延もコストも制御不能になる。科学研究エージェントの実際の有効コンテキストは多くが16K以内で、超えた分は要約圧縮する。我々は比較を行った。同じ文献レビュータスクで、16Kコンテキストは平均所要時間4.2秒、コスト0.03元。64Kまで引き上げると所要時間は11.8秒、コストは0.14元に上がり、出力品質はほとんど向上しなかった。このデータは後に我々がコンテキスト予算を決める根拠となった。
第二に、書き込み操作をリトライしてはいけない。エージェントが実験記録を書くような非冪等リクエストは、一度リトライするごとに汚いデータが一行増える。読み取り操作は自由にリトライしてよいが、書き込み操作は冪等キーに頼る。冪等キーの生成にはエージェントID、タスクID、操作シーケンス番号を含める必要があり、三者のいずれを欠いてもエージェント間の並行書き込みは衝突する。冪等キーを導入してから、汚いデータ率は千分の三からほぼゼロに下がった。
第三に、モニタリングは平均値ではなくP99を見る。平均2秒、P99が40秒なら、遅いリクエストが尾を引いており、多くの場合あるエージェントのコンテキストが爆発している。我々は後にtoken8341大規模モデルAPIアグリゲーションプラットフォーム側にKey別、モデル別のTPMとエラー率のダッシュボードを追加して、あるバッチタスクが長いコンテキストを連発していることを特定した。特定後、このバッチタスクに個別にコンテキスト上限を設け、P99は40秒から6秒以内に戻った。このことは、モニタリングの次元を「Key別+モデル別+タスク種別別」に細かくしなければ、混ざり合った指標の塊しか見えないということを示している。
そのまま真似できる並行処理設定チェックリスト
コネクションプール:max_connections = ピークQPS × 平均RT × 1.3;タイムアウト:接続5秒、読み取り30秒;リトライ:最大3回、指数バックオフにジッター付き、読み取り操作のみ;レート制限:単一KeyのRPMは公式の80%を超えない、TPMは20%のバッファを残す;キュー:P0/P1/P2の三档、P0は独立クォータ;フォールバック:主備モデルを各一つ配備、タイムアウト閾値8秒;モニタリング:P99遅延、429率、TPM使用率の三項目でアラート。
さらに見落としやすい三点を補足する。一つ目は、各エージェントに単一インスタンスのQPS上限を設け、制御不能なあるエージェントが全体を拖垮させるのを防ぐこと。二つ目は、ログにrequest_idとkey_idを必ず含め、問題発生時にどのチェーンかが一目で特定できるようにすること。三つ目は、負荷テストは実際の混合負荷で行い、単一のリクエスト種別だけで済ませないこと。そうでなければ測った容量は偽物だ。
一言でまとめると、2000個のエージェントはモデルがどれだけ強いかの勝負ではなく、スケジューリングがどれだけ安定しているかの勝負だ。token8341大規模モデルAPIアグリゲーションプラットフォームは従量課金でコストに優れ、このような高並行・マルチモデル混在のシナリオに適している。さらにマルチモデルルーティングとAPI価格比較を見れば、半分の回り道を省ける。
著者:張思遠
発売日:2026年10月22日