plan-cost-concurrency.html 10 KB
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Cost & Concurrency · LemonBoss PRD</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,500;9..144,700&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="assets/shell.css" />
</head>
<body data-page="plan-cost-concurrency.html">
<div class="shell">
  <aside id="sidebar"></aside>
  <main class="page">
    <header class="page-head">
      <div class="crumb"><span class="pill">08 · PLAN</span><span class="sep">/</span><span>Cost & Concurrency</span></div>
      <h1>成本与并发预算</h1>
      <p class="deck">「项目最多花多少 token / 多少钱 / 跑多久 / 几个 agent 并发」的数字版。预算守护机制在 <a href="sdd-process.html">P-7</a>,本页给具体数字。</p>
    </header>
    <article class="body">

      <section>
        <h2>① 单次调用 Token 估算</h2>
        <table>
          <thead><tr><th>Agent</th><th>模型</th><th>输入 ≈</th><th>输出 ≈</th><th>典型 / 单次调用</th><th>备注</th></tr></thead>
          <tbody>
            <tr><td>PM</td><td>Sonnet 4.6</td><td>4K (memory + prd)</td><td>8K (新 PRD 章节 HTML)</td><td><b>12K</b></td><td>incremental ≈ 5K</td></tr>
            <tr><td>Architect generate</td><td>Opus 4.7</td><td>15K (PRD + sdd + memory)</td><td>20K (4 MVCP 页 + JSON)</td><td><b>35K</b></td><td>含全套 SDD</td></tr>
            <tr><td>Architect patch</td><td>Opus 4.7</td><td>8K</td><td>3K</td><td><b>11K</b></td><td>仅改一段</td></tr>
            <tr><td>Coder implement</td><td>Sonnet 4.6</td><td>6K (sdd + upstream contracts)</td><td>4K (code + contract.json)</td><td><b>10K</b></td><td>per Unit</td></tr>
            <tr><td>Coder retry</td><td>Sonnet 4.6</td><td>8K (含 history)</td><td>3K (差量 patch)</td><td><b>11K</b></td><td>反思加 ~2K</td></tr>
            <tr><td>Tester</td><td>Sonnet 4.6</td><td>5K</td><td>4K (vitest spec + result)</td><td><b>9K</b></td><td>per Unit</td></tr>
            <tr><td>Integrator</td><td>Sonnet 4.6</td><td>8K (units + spec)</td><td>3K</td><td><b>11K</b></td><td>L2 单轮</td></tr>
            <tr><td>BugTriager</td><td><b>Opus 4.7</b></td><td>12K (含 code + logs)</td><td>3K (triage.json)</td><td><b>15K</b></td><td>归因质量决定 L2 收敛</td></tr>
          </tbody>
        </table>
      </section>

      <section>
        <h2>② 典型项目总成本估算</h2>

        <h3>2.1 小项目(TODO API · demo)</h3>
        <p>3 个 Unit · 1 个 PRD rev · 1-2 个 L2 round。</p>
        <table class="dense">
          <thead><tr><th>调用</th><th>次数</th><th>Token</th></tr></thead>
          <tbody>
            <tr><td>PM init</td><td>1</td><td>12K</td></tr>
            <tr><td>Architect generate</td><td>1</td><td>35K</td></tr>
            <tr><td>Coder × 3 unit × 1.5 attempt(平均)</td><td>4.5</td><td>45K</td></tr>
            <tr><td>Tester × 3 unit × 1.5 attempt</td><td>4.5</td><td>40K</td></tr>
            <tr><td>Integrator</td><td>1</td><td>11K</td></tr>
            <tr><td>BugTriager(如失败 1 次)</td><td>0.5</td><td>8K</td></tr>
            <tr><td><b>合计</b></td><td>14.5</td><td><b>≈ 150K tokens</b></td></tr>
          </tbody>
        </table>

        <h3>2.2 中项目(Auth + TODO + Profile · 5 feature)</h3>
        <p>8 个 Unit · 2 个 PRD rev · 2 个 L2 round。</p>
        <table class="dense">
          <thead><tr><th>调用</th><th>次数</th><th>Token</th></tr></thead>
          <tbody>
            <tr><td>PM init + incremental × 1</td><td>2</td><td>17K</td></tr>
            <tr><td>Architect generate + patch × 1</td><td>2</td><td>46K</td></tr>
            <tr><td>Coder × 8 unit × 2 attempt</td><td>16</td><td>165K</td></tr>
            <tr><td>Tester × 8 unit × 2 attempt</td><td>16</td><td>145K</td></tr>
            <tr><td>Integrator × 2</td><td>2</td><td>22K</td></tr>
            <tr><td>BugTriager × 1</td><td>1</td><td>15K</td></tr>
            <tr><td><b>合计</b></td><td>39</td><td><b>≈ 410K tokens</b></td></tr>
          </tbody>
        </table>

        <h3>2.3 默认 token_budget = 5M 的隐含假设</h3>
        <p>5M 是单项目预算上限,能撑:</p>
        <ul>
          <li>~33 个小项目(150K each)</li>
          <li>~12 个中项目(410K each)</li>
          <li>1 个大型迭代(多人多反馈、20+ Unit)</li>
        </ul>
        <p>到达 80% 预算时发 SSE warning;100% 直接挂起。</p>
      </section>

      <section>
        <h2>③ 美元成本(参考 2026-05 价格)</h2>
        <p>按 Anthropic 公开价格估算(input/output 分别计),中项目场景:</p>
        <table class="dense">
          <thead><tr><th>模型</th><th>输入 ($/MTok)</th><th>输出 ($/MTok)</th><th>本项目消耗</th><th>美元 ≈</th></tr></thead>
          <tbody>
            <tr><td>Sonnet 4.6</td><td>~$3</td><td>~$15</td><td>input 220K · output 100K</td><td><b>$2.2</b></td></tr>
            <tr><td>Opus 4.7</td><td>~$15</td><td>~$75</td><td>input 50K · output 25K</td><td><b>$2.6</b></td></tr>
            <tr><td><b>中项目合计</b></td><td>—</td><td>—</td><td>410K tokens</td><td><b>≈ $4.8</b></td></tr>
            <tr><td>小项目合计</td><td>—</td><td>—</td><td>150K tokens</td><td><b>≈ $1.7</b></td></tr>
          </tbody>
        </table>
        <p class="sig">数字是 ballpark。实际取决于 caching 命中率(SessionPool 复用降低 input 重复成本)和具体功能复杂度。</p>
      </section>

      <section>
        <h2>④ 并发预算</h2>
        <p>三层并发上限:</p>

        <table>
          <thead><tr><th>层级</th><th>上限</th><th>原因</th><th>实现</th></tr></thead>
          <tbody>
            <tr><td><b>项目内 L1 并行</b></td><td>≤ 5 Unit 同时跑</td><td>每个 Claude CLI ~ 100MB RAM · 1 CPU core</td><td>scheduler.getExecutionGroups 自动分波,每波 ≤ 5</td></tr>
            <tr><td><b>项目内 L2 串行</b></td><td>1 个 Integrator 实例</td><td>避免端口冲突 + 状态混乱</td><td>LoopController 内部用 Promise 队列</td></tr>
            <tr><td><b>单机系统并发</b></td><td>≤ 20 个 ACP session</td><td>合理 RAM 占用 ≈ 2GB</td><td>SessionPool 全局上限(新增 <code>maxSessions</code> 配置)</td></tr>
            <tr><td><b>同 company 项目并发</b></td><td>≤ 3 项目同时跑</td><td>避免单用户挤占</td><td>LoopController 入口检查</td></tr>
            <tr><td><b>Bash 进程</b>(Coder/Tester/Integrator 起的)</td><td>≤ 50 系统总数</td><td>避免 fork bomb</td><td>process-guard 计数</td></tr>
          </tbody>
        </table>
      </section>

      <section>
        <h2>⑤ 单项目墙钟估算</h2>
        <table class="dense">
          <thead><tr><th>项目规模</th><th>串行墙钟</th><th>L1 并行后</th><th>瓶颈</th></tr></thead>
          <tbody>
            <tr><td>小(3 Unit)</td><td>~15 min</td><td><b>~8 min</b></td><td>Architect generate + Integrator spawn</td></tr>
            <tr><td>中(8 Unit)</td><td>~45 min</td><td><b>~20 min</b></td><td>L1 × 2 attempt × Coder + Tester</td></tr>
            <tr><td>大(20 Unit + 3 L2 round)</td><td>~3h</td><td><b>~70 min</b></td><td>L2 整套 + 重写</td></tr>
          </tbody>
        </table>
        <p class="sig">「并行后」假设 5 并行;scheduler 拓扑可能限制少于 5(fe 必须等 be 完)。北极星目标「小项目 &lt; 30 min」对应中项目场景,余量充足。</p>
      </section>

      <section>
        <h2>⑥ 监控指标</h2>
        <p>在 <a href="ops-progress.html">ops-progress</a> 已经展示了 token_used/budget。补充几个隐含指标:</p>

        <table class="dense">
          <thead><tr><th>指标</th><th>看哪</th><th>告警阈值</th></tr></thead>
          <tbody>
            <tr><td>Tokens / Unit</td><td>项目 token_used / units_count</td><td>&gt; 100K / Unit → 项目过度反思</td></tr>
            <tr><td>Retry rate</td><td>units.json sum(retries) / count</td><td>&gt; 2 平均 → Coder skill 退化或 spec 不清</td></tr>
            <tr><td>L2 修复轮次</td><td>l2_rounds</td><td>≥ 2 → 该 PRD 有歧义</td></tr>
            <tr><td>Agent 调用墙钟 P95</td><td>timeline.duration_ms 统计</td><td>&gt; 5 min → 模型卡或 prompt 过长</td></tr>
            <tr><td>SessionPool 利用率</td><td>active_sessions / maxSessions</td><td>&gt; 80% → 限流</td></tr>
            <tr><td>Bash 子进程数</td><td>process-guard tracked</td><td>&gt; 30 → 等回收</td></tr>
          </tbody>
        </table>
      </section>

      <section>
        <h2>⑦ 降本策略</h2>
        <table class="dense">
          <thead><tr><th>策略</th><th>预期降幅</th><th>难度</th></tr></thead>
          <tbody>
            <tr><td>SessionPool 复用 + 5min cache TTL</td><td>20-30% input token</td><td>免费(既有 ACP 行为)</td></tr>
            <tr><td>Tester Sonnet 改 Haiku(如果反思质量够)</td><td>40% Tester 部分</td><td>低</td></tr>
            <tr><td>PM/Coder/Tester 用 Sonnet · 只 Architect/Triager 用 Opus</td><td>已是默认</td><td>—</td></tr>
            <tr><td>Memory 注入降到 top 3(从 top 5)</td><td>5-10% input</td><td>低,1 行配置</td></tr>
            <tr><td>跳过 Tester 写文档代码(README/类注释)</td><td>10% output</td><td>低</td></tr>
            <tr><td>cache busting:相同 unit 跑 1 次后用缓存(无 retry 时)</td><td>大幅,针对回归</td><td>中(需 contract_hash 索引)</td></tr>
          </tbody>
        </table>
      </section>

    </article>
    <nav class="prev-next"></nav>
    <footer class="site"><div><b>Section</b>08 · Plan</div><div><b>Page</b>plan-cost-concurrency.html</div></footer>
  </main>
</div>
<script src="assets/shell.js"></script>
</body>
</html>