「メインの大きなモデルが作業手順を計画し、小さなモデルのサブエージェントを複数使って実装する」という構想を、 ローカルLLM 実行計画で得た実測値の上で設計する。 結論を先に言えば、構成としては組めるが、本PCでは「複数のサブエージェントを並列に走らせる」部分だけが物理的に成立しない。 その代替と、そもそもこの構成が割に合う条件を整理する。
狙いは役割分担にある。計画のような「判断が要る仕事」は賢いモデルに、 実装のような「量が要る仕事」は速いモデルに振り分ける。
| 項目 | 実測 | この構成にとっての意味 |
|---|---|---|
| 空き VRAM | 3287 MiB | ここがすべてを決める |
| Qwen3-4B | 2376 MiB / 56.5 tok/s | サブエージェント候補。速い |
| gemma-4-E4B | GPU 2868 MiB / 45.2 tok/s | メイン候補。思考を経るぶん正確 |
| API 経由の実効速度 | 39.5 tok/s | HTTP 込みの体感値。エージェントはこちらで動く |
| サーバ起動 | 7.5 秒 | モデル切り替えのたびに払うコスト |
2つのモデルを同時に立てようとすると、それだけで VRAM を超える。
| 組み合わせ | 必要 VRAM | 空き 3287 MiB に対して |
|---|---|---|
| Qwen3-4B ×2(サブを2つ) | 約 4752 MiB | 超過1465 MiB 足りない |
| E4B(メイン)+ 4B(サブ) | 約 5244 MiB | 超過1957 MiB 足りない |
| Qwen3-4B ×1 のみ | 約 2376 MiB | 収まるKV と合わせて余裕あり |
--parallel がそれにあたる。詳細は第2章で扱う。
--parallel で何が起きるか| 項目 | 挙動 |
|---|---|
| モデルの重み | 1つだけ読み込まれ、全スロットで共有される。ここが増えないのが利点 |
| KVキャッシュ | -c で指定した総量がスロット数で等分される |
| スループット | バッチ処理により単発の合計より効率は上がるが、帯域が共有なので N 倍にはならない |
| 1タスクあたりの体感 | 同時実行するぶん、個々の応答は遅くなる |
| 設定 | スロット数 | 1スロットあたり | 実装タスクに足りるか |
|---|---|---|---|
-c 8192 --parallel 1 | 1 | 8192 | 余裕ただし逐次実行になる |
-c 8192 --parallel 2 | 2 | 4096 | 実用的指示+対象コード+出力が収まる |
-c 8192 --parallel 4 | 4 | 2048 | 窮屈タスクを相当細かく割る必要がある |
-c 8192 --parallel 8 | 8 | 1024 | 不足まとまったコードを渡せない |
-c 16384 にすると KV が VRAM を超えて
1.30 tok/s まで崩壊する。8192 が上限である以上、
並列数を上げることは1スロットの余裕を削ることと同義になる。
メインは Claude 等のクラウドモデル。計画を構造化データで出力させ、
オーケストレータがタスクを1つずつローカルの llama-server に投げる。
計画は gemma-4-E4B(reasoning・正確)、実装は Qwen3-4B(速い)。
同時常駐できないため、llama-swap のようなプロキシか、オーケストレータ自身がプロセスを立て直す。
Qwen3-4B を --parallel 4 で立て、独立したタスクを同時投入する。
計画と最終検証はクラウド、実装の量はローカル並列、検証で落ちたタスクだけクラウドに差し戻す。
| 観点 | 案1 クラウド計画 | 案2 完全ローカル | 案3 並列スロット | 案4 ハイブリッド |
|---|---|---|---|---|
| 計画の品質 | 高 | 中 | — | 高 |
| サブの並列性 | なし | なし | あり | あり |
| 1タスクの文脈量 | 8192 | 8192 | 2048 | 2048〜4096 |
| オフライン動作 | 不可 | 可 | 可 | 不可 |
| 実装の手間 | 小 | 中 | 小 | 大 |
| 失敗時の回復 | 手動 | 手動 | 手動 | 自動 |
最終形は案4とする。ただし案4の中核は案3(並列スロット)であり、 そこが何倍のスループットを出すかが分からないまま全体を組むのは順序が逆。 第6章の段階計画では、案3の実測を最初に置く。
| 層 | 担当 | やること | やらせないこと |
|---|---|---|---|
| メイン | クラウド または E4B | 目的の解釈、タスク分解、検証方法の指定、差し戻しの処理 | 個々の実装。ここで書くなら分解する意味がない |
| サブ | Qwen3-4B 並列スロット | 与えられた1タスクの実装。入出力が明確なもの | 設計判断・良し悪しの評価。4B には荷が重い |
| オーケストレータ | PowerShell | 配分、API 呼び出し、検証コマンド実行、集約、リトライ | 内容の判断。ここは機械的処理に徹する |
サブエージェントとの通信は、計画書 第10章で動作確認済みの OpenAI 互換エンドポイントを使う。
POST http://127.0.0.1:8080/v1/chat/completions
{
"messages": [
{ "role": "system", "content": "あなたは与えられた1つのタスクだけを実装します。" },
{ "role": "user", "content": "<タスク定義>" }
],
"max_tokens": 1024,
"temperature": 0.2
}
サブエージェント側は状態を持たない。会話履歴を積まず、1タスク1リクエストで完結させる。 文脈が 2048 トークンしかない以上、履歴を持たせる余裕がないという事情もある。
計画書 第10章の品質評価で、Qwen3-4B は次の結果を出している。
| 設問 | 結果 | この構成への示唆 |
|---|---|---|
| 形式の指示 (5項目・各20字) | 完璧指示どおり | 形式が決まった出力は任せられる |
| コード生成 (PowerShell) | 惜しい動くが -Recurse を落とした | 要件の取りこぼしが起きる。検証が必須 |
| 知識を問う説明 | 誤答量子化を量子力学と混同 | 知識に依存する判断は任せられない |
| 適性 | タスクの例 | 理由 |
|---|---|---|
| 向く | 定型的な変換、同じ修正の多数ファイルへの適用、テストケースの雛形生成、命名の一括変更 | 正解が機械的に判定でき、判断を含まない |
| 条件付き | 関数単位の実装(入出力とテストが与えられている場合) | テストが通るかで合否が決まるなら成立する |
| 向かない | 設計判断、既存コードの読解を要する修正、「より良く直す」類の指示 | 正解が一つでなく、検証もできない |
メインが出力するタスク定義には、検証方法まで含める。これが無いとオーケストレータが合否を判定できない。
{
"id": "task-003",
"goal": "html2md.ps1 の Convert-Table に colspan 展開のテストを追加する",
"context_files": ["src/scripts/70_html2md/html2md.ps1"],
"constraints": [
"既存の関数シグネチャを変えない",
"PowerShell 5.1 で動作すること"
],
"verify": {
"command": "pwsh -File tests/run-tests.ps1 -Filter Convert-Table",
"expect_exit_code": 0
},
"max_retry": 2
}
| 段階 | 内容 | 失敗時 |
|---|---|---|
| 1. 構文 | 生成物がパースできるか。PowerShell なら構文解析、HTML ならタグ対応 | 同じサブに再試行 |
| 2. 静的 | 制約条件を満たすか(禁止パターンを含まない、シグネチャが変わっていない) | 同じサブに再試行 |
| 3. 実行 | verify.command を実行して終了コードを見る | 再試行 → 上限でメインへ差し戻し |
| 4. 統合 | 全タスク完了後、全体としてビルド・テストが通るか | メインへ差し戻し |
--parallel の実測ここが最初に来る。並列時の合計スループットが分からないまま全体を組むと、 「並列にした意味がなかった」という結論を最後に知ることになる。
| 測る条件 | 見たいこと |
|---|---|
--parallel 1 で1リクエスト | 基準値。第10章の 39.5 tok/s と一致するか |
--parallel 2 で2本同時 | 合計スループットが何倍か |
--parallel 4 で4本同時 | 同上。頭打ちの位置を探す |
| 各条件で VRAM | スロット増でどれだけ増えるか |
オーケストレータの最小形を作り、1タスクを投げて検証まで回す。
verify.command を実行して合否を出すここまでで「4B が実際にタスクを完了できるか」が分かる。できないなら以降は無意味になる。
src/scripts/80_agent/
orchestrator.ps1 … タスク配分・API 呼び出し・検証・集約
orchestrator.cmd … ランチャー
tasks/ … タスク定義 JSON
results/ … 実行結果とログ
docs/plan/agent-architecture.html … 本書
llama-server で測れる。
所要は数十分程度で、その結果が案3の採否を決める。
| 条件 | 何が起きるか | 検知できる段階 |
|---|---|---|
| 並列で速くならない | 帯域律速のため --parallel の効果が小さい。逐次と変わらない | Phase 1 |
| 2048 トークンに収まらない | 対象コードを渡しきれず、サブが文脈不足で誤った実装をする | Phase 2 |
| 成功率が低い | 再試行と差し戻しが増え、人が直した方が速い状態になる | Phase 3 |
| 分解コストが上回る | タスクを4Bが扱える粒度まで割り、検証まで書く手間が、直接実装する手間を超える | Phase 4 |
技術的には Phase 1〜3 で解決できる問題が並ぶが、4番目だけは技術で解決できない。
4B が扱えるタスクは「入出力が明確で、機械的に検証でき、判断を含まない」ものに限られる。 そこまで細かく分解し、検証コマンドまで用意する作業を誰かがやらねばならない。 それをメインエージェントにやらせるなら、メインが直接実装するのと手間が変わらない場面が相当ある。
| 条件 | 理由 |
|---|---|
| 同種のタスクが大量にある | 分解の設計コストを1回払えば、N 件に償却できる。これがこの構成の本命 |
| 検証が既に存在する | テストが揃っているコードベースなら、検証を書く手間が消える |
| クラウド利用を減らしたい | 速度でなく費用が動機なら、逐次実行でも価値がある |
| オフラインで動かす必要がある | 速度・品質より可用性が優先される場合 |
--parallel のスループット。Phase 1 で測る--parallel の正確なオプション名と挙動--parallel の仕様。使用中のビルド(b10612)の --help を正とする