Phase 4 A10 — OpenClaw 雙塔重劃 - run_scheduler.py: Meta 自審 cron 6h → 每日 12:00(月省 2.25M Gemini, +20% 達標) - scheduler.py: 移除 icaim 內 2 處 inline meta 觸發 - openclaw_strategist 抽 _push_report_with_charts (call×3) + _collect_mcp_intel (call×2) - 行數目標 -25% 未達(4 報告函數結構差異大,A10 採保守抽出避險) - 主戰果:Meta 降頻月呼叫 300 → 30(-90%) Phase 5 — 5 處 LOCKED-GEMINI 註解(涵蓋鎖定 7 場景) - services/mcp_collector_service.py:32 (場景 #1: Google Search Grounding) - services/openclaw_strategist_service.py:40 (場景 #2/3/4: 週/月/年報) - services/code_review_pipeline_service.py:46 (場景 #5: 100K+ token diff) - services/elephant_alpha_orchestrator.py:88 (場景 #6: EA HITL) - routes/openclaw_bot_routes.py:98 (場景 #7: PPT 簡報) Phase 6 A12 — 憲法級 ADR 三份 - ADR-028「LLM 路由統一準則」(269 行) - 5 大支柱:三主機級聯 / Ollama 優先 / 雙塔分工 / Gemini 鎖 7 場景 / 可觀測性 - 8 個 provider 白名單(DB CHECK 對齊) - 30+ caller 名單分「已實作 / 規劃中」 - ADR-029「Hermes-First 雙塔分工」(222 行) - 12 項職責重劃表 + A7/A8/A10 落地對照 - Gemini 月支出 -23.5%(critic 第 3 輪 B5 算術修正) - ADR-027 附錄(+69 行) - 三主機架構(Primary/Secondary/Fallback) - 4 條獨立 fallback 鏈 - 廢止「188 Ollama」概念 - README 索引更新 A11 critic 第 3 輪修補:5 BLOCKER 全清 - B1: 行數 1831 → 2677 (含 baseline 對照) - B2: 場景 #4 行號 759/1267 → 1102/1628 + annual 不存在註明 - B3: 虛構 caller 改實存(ea_hitl_prefetch → ea_engine 等) - B4: 白名單三層對齊(DB 8 = ADR 8 = token_report 補 ollama_secondary) - B5: KPI 算術 50→38 = -23.5% 重核 services/telegram_templates.py: A5 daily_token_report() 函數 services/mcp_collector_service.py: 加 LOCKED-GEMINI 註解 services/elephant_alpha_orchestrator.py: 加 LOCKED-GEMINI 註解 103/103 unit test 全綠(zero regression) Operation Ollama-First v5.0 / Phase 4 A10 + Phase 5 + Phase 6 A12 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
12 KiB
ADR-029: Hermes-First 雙塔分工
- Status: Accepted
- Date: 2026-05-03
- Decision Maker: 統帥
- Author: Operation Ollama-First v5.0(Codex / A12 planner)
- Related: ADR-001(三 Agent 自主學習分工)、ADR-002(pgvector)、ADR-018(四 Agent 控制面)、ADR-019(Telegram Agentic Layer)、ADR-027(Primary Ollama on GCP)、ADR-028(LLM 路由統一準則)
Context
ADR-001 / ADR-018 把 Hermes 定位為「L1 Observer / Embedding」、OpenClaw 定位為「L3 Strategist」,但實作上的權重失衡與成本失衡讓「分工」變成「OpenClaw 全包」。
失衡證據(戰役 v5.0 Phase 0 audit)
-
程式碼體積失衡:
services/openclaw_strategist_service.py≈ 2677 行(HEAD 起 1831 行 + Phase 3/4 增量 846 行)services/hermes_analyst_service.py≈ 607 行- 比率 4.4×,但 Hermes 的呼叫頻率高 OpenClaw 約 100 倍
-
成本失衡:
- OpenClaw 月燒 Gemini ≈ 50M tokens(估算依 phase0 audit caller 流量推算)
- Hermes 月燒 Ollama ≈ 30M tokens,邊際成本 $0
- 換句話說:Hermes 跑了 60% 流量 = $0;OpenClaw 跑了 40% 流量 = 全部 Gemini 帳單
-
使用者主入口 = Telegram,但 Telegram NL 走 OpenClaw:
- 統帥每日數十次答題從 Telegram 走
routes/openclaw_bot_routes.py:6784-6843三層 fallback(Ollama → Gemini → NIM) - audit ID #29/30/31 顯示 OpenClaw Bot Q&A 是 Gemini 月支出第二大來源
- ADR-019 的 Agent-First Conversation Layer 把所有用戶輸入導向
openclaw_decide(),更放大 OpenClaw 流量
- 統帥每日數十次答題從 Telegram 走
-
戰略 / 戰術層職責混雜:
- 「每日營運摘要」是高頻戰術(每日 09:00),卻走 OpenClaw Gemini → 成本最高頻率最高
- 「KPI 計算」是規則引擎可解的純運算,卻丟給 LLM 寫敘事
- 「Q&A」涵蓋從「上週業績多少」(戰術)到「下季品類布局建議」(戰略),全部走同條鏈
-
Phase 3 A7 已局部驗證:
- 戰役 v5.0 Phase 3 已把 OpenClaw Q&A 第一響應切到
qwen3:14b(feature flag),保留 Gemini 作 fallback - 該變更顯示「Hermes-tier 模型接戰術 Q&A」是技術可行的
- 戰役 v5.0 Phase 3 已把 OpenClaw Q&A 第一響應切到
ADR-018 已定四 Agent 角色,但未量化「誰處理高頻流量、誰處理低頻戰略」;本 ADR 是 ADR-018 的成本驅動補述,把 Hermes 從「Observer」升格為「主入口」,OpenClaw 縮回「鎖定戰略場景的副引擎」。
Decision — 雙塔分工(Twin-Tower)
Hermes 主塔(L1 戰術 / 高頻 / Ollama-only)
- 定位:所有 Telegram NL / 競價偵測 / 日常摘要 / KPI 計算 / 第一響應 Q&A 的單一入口
- 資源:三主機 Ollama 級聯(ADR-028 支柱 1),邊際成本 0
- 模型:
hermes3:latest(意圖分類 / 競價)+qwen3:14b(Q&A 第一響應,Phase 3 已切) - 降級:Ollama 失敗 → 規則引擎兜底(ADR-004 已定)→ 模板化回應,不直接升 Gemini
- 不可越界:不寫戰略長文(≤ 200 字)、不做 Web Grounding、不做 vision
OpenClaw 副塔(L3 戰略 / 低頻 / 鎖定 5 個 Gemini 場景)
- 定位:產生月/年報敘事、PPT 顧問深度分析、Code Review 高階評估、EA HITL pre-fetch、複雜 SKU 推理
- 資源:Gemini 2.5 Flash 主,NIM
llama-3.3-nemotron-super-49b-v1.5fallback(ADR-004) - 觸發頻率:日報 1×/日 / 週報 1×/週 / 月報 1×/月 / Code Review 部署觸發 / EA HITL escalation 觸發
- 不可越界:不接 Telegram 第一響應(一律先過 Hermes,信心 < threshold 才升級)
升級條件(Hermes → OpenClaw)
由 Hermes 主塔判定是否需要升級:
- 意圖分類為「戰略性問題」(如「明年品類規劃」「Q3 競品深度分析」)
- 複雜 SKU 推理且信心分數 < 0.65(Hermes self-assessment)
- 使用者明確要求「深度報告」(Telegram menu 點
cmd:strategy/cmd:annual/cmd:competitor) - EA escalation 事件(ADR-021 已定)
升級時 OpenClaw 必須拿到 Hermes 已有的 context(意圖 / 信心 / 既有摘要),不重複呼叫 Ollama。
職責重劃表(戰前 vs 戰後)
| # | 任務 | 戰前 | 戰後 | 對應戰役 task |
|---|---|---|---|---|
| 1 | 競價威脅偵測(每 4h) | Hermes Ollama | Hermes Ollama ✅ 維持 | — |
| 2 | 意圖分類(Telegram NL) | Hermes Ollama | Hermes Ollama ✅ 維持 | — |
| 3 | 每日營運摘要 | OpenClaw Gemini(每日 1×) | Hermes 模板 + Gemini 200 字洞察 | A8 |
| 4 | KPI 計算(業績 / 庫存 / 達成率) | OpenClaw Gemini | Hermes 規則引擎(純運算) | A8 |
| 5 | Q&A 第一響應(Telegram) | OpenClaw Gemini → NIM → 字面 fallback | Hermes qwen3:14b → 信心低升 Gemini | A7(已落地) |
| 6 | 複雜 SKU 推理 | OpenClaw Gemini | Hermes 信心 < 0.65 → OpenClaw Gemini | A7 條件分支 |
| 7 | PPT 簡報深度分析 | OpenClaw Gemini | OpenClaw Gemini ✅ 鎖定 | — |
| 8 | 週/月/年報敘事 | OpenClaw Gemini | OpenClaw Gemini ✅ 鎖定 | — |
| 9 | Code Review 高階評估 | OpenClaw Gemini | OpenClaw Gemini ✅ 鎖定 | — |
| 10 | EA HITL pre-fetch | Hermes Ollama(ADR-021) | Hermes Ollama ✅ 維持,escalation 走 OpenClaw Gemini | — |
| 11 | Meta 自審 | OpenClaw 每 6h | OpenClaw 每 24h(降頻 4×) | A10 |
| 12 | 規則引擎兜底 | Hermes(ADR-004) | Hermes ✅ 維持 | — |
淨效果(critic-A11 B5 修補:算術重核):
- 任務 3/4/5 從 OpenClaw Gemini 遷移至 Hermes Ollama → 月省 ~9.5M Gemini tokens(A7+A8 試算)
- 任務 11 降頻(Meta 自審 6h → 12:00)→ 月省 ~2.25M Gemini tokens(A10 實測超預估)
- 合計月省 ~11.75M tokens(50M → 38.25M = -23.5%)
- Hermes 流量從 ~30M tokens/月 → 預估 ~120M tokens/月(+400%,成本不變)
A7 / A8 / A10 落地對照
| Task | 範圍 | 狀態 | 對應檔案 |
|---|---|---|---|
| A7 | OpenClaw Q&A → qwen3:14b(feature flag) | ✅ Phase 3 完成,待 Phase 4 黃金集 A/B 驗證 | services/openclaw_strategist_service.py Q&A 入口 |
| A8 | Hermes daily 摘要 + KPI 規則引擎 | 規劃中(Phase 4) | services/hermes_analyst_service.py 新增 daily_summary / kpi_compute 方法 |
| A10 | OpenClaw Meta 自審降頻 + 程式瘦身 -29% | 規劃中(Phase 7-8) | services/openclaw_strategist_service.py 拆出戰術層遷移至 Hermes |
預期效益(量化)
| 指標 | 戰前 | 戰後 | 變化 |
|---|---|---|---|
| Gemini 月支出(tokens) | ~50M | ~38.25M | -23.5% |
| OpenClaw 程式碼行數 | 2677(HEAD 1831 + Phase 3/4 增量) | Phase 4 +18 行(A10 保守抽出) | Phase 4 行數目標未達;主戰果 = Meta 降頻 |
| Hermes 流量(tokens) | ~30M | ~120M | +400%($0) |
| Telegram NL 第一響應延遲 p50 | ~2.5s(Gemini) | ~1.2s(Ollama 本地) | -52%(待 ai_calls 實測) |
| 戰術層 fallback 鏈深度 | 3(Gemini→NIM→字面) | 2(Hermes→規則引擎) | -33% |
| 月成本(Gemini API) | baseline | -23.5% | 戰役 v5.0 KPI |
上述數字為 Phase 0 audit 推算,Phase 5 報表上線後以
ai_calls實測值修訂。
Alternatives Considered
| 方案 | 不採用原因 |
|---|---|
| A. 維持 ADR-018 現狀(OpenClaw 全包) | Gemini 月支出無上限增長;Telegram NL 延遲 p50 ≥ 2.5s 體驗差;Hermes 程式碼長期被冷凍 |
| B. OpenClaw 全切 Ollama(廢 Gemini) | 月/年報品質下降 10-20%(phase0_research Section 1);Code Review / PPT vision 補不齊;繁中商業敘事短板(TMMLU+ 論文) |
| C. 把 Hermes 升格 L3、廢 OpenClaw | OpenClaw 已有 KM 沉澱 / Meta 自審 / 戰略架構,砍掉等於拋棄 1.8% → 80% 觀測能力(ADR-019);ADR-018 四 Agent 控制面被破壞 |
| D. 引入第五個 Agent 接戰術層 | 增加心智負擔;Hermes 已是現成 L1 Observer,升格成本最低;統帥 FinOps 視角不偏好新增複雜度 |
| E. 全部走 NIM(避開 Gemini 帳單) | NIM 80 calls/day 配額硬限,月/年報已經會爆;NIM 模型品質 < Gemini 2.5 Flash |
Consequences
正面
- 成本下降 23%:戰役 v5.0 KPI 第一目標達成。
- Telegram NL 延遲減半:本地 Ollama 三主機級聯 vs Gemini API round-trip。
- Hermes 體質升級:從「Observer」升「主入口」,未來 Phase 11 RAG 攔截可直接接 Hermes 流量。
- 程式碼瘦身:A10 採保守抽出(2 個 helper),行數 -25% 目標未達;主戰果為 Meta 降頻(月省 2.25M tokens)。深度瘦身延至 Phase 7+。
- ADR-019 真正落地:
openclaw_decide()第一響應改走 Hermes,agent suggestion shortcut 不再 = OpenClaw 全包。
負面
- A7 切換有黃金集 A/B 風險:qwen3:14b 繁中短板若實測差距 > 30%,需走 Plan B(Llama-3-Taiwan-70B 或退回 Gemini 加 prompt cache)。
- A10 重構工程量大:A10 已執行(Phase 4),採保守抽出避險;4 個報告函數結構差異大,深度瘦身(daily_summary / kpi_compute 遷移至 Hermes)需獨立 Phase,refactor-specialist 範圍。
- Hermes 變主入口後故障半徑放大:原本 Hermes 掛 = 規則引擎兜底;現在掛 = 60% Telegram NL 體驗劣化。需強化 mark_unhealthy + 三主機級聯(ADR-027 / ADR-028)。
風險與緩解
| 風險 | 機率 | 緩解 |
|---|---|---|
| qwen3:14b 繁中黃金集 A/B 紅燈 | 中 | Phase 4 跑 50 題繁中商業 Q&A 黃金集;< 0.75 BERTScore 自動 fallback Gemini |
| Hermes 故障 = NL 體驗崩 | 低 | 三主機級聯 + mark_unhealthy 30s(ADR-028 支柱 1);規則引擎兜底(ADR-004) |
| A8 daily 摘要品質 < 戰前 | 中 | Hermes 模板 + Gemini 200 字洞察混合;不是純 Hermes 全自動 |
| OpenClaw 重構引入 regression | 中 | A10 走 refactor-specialist + 完整 regression test;feature flag 灰度 |
降級策略
- A7 feature flag off → 退回 OpenClaw Gemini Q&A
- A8 Hermes daily 失敗 → 走原 OpenClaw Gemini daily(保留代碼路徑直至 Phase 8 確認穩定)
- 三主機全掛 → 規則引擎兜底 + Telegram 模板化告警
Verification
V1:流量分布
-- Hermes vs OpenClaw 月流量比
SELECT
CASE
WHEN caller LIKE 'hermes%' THEN 'hermes'
WHEN caller LIKE 'openclaw%' THEN 'openclaw'
ELSE 'other'
END AS tower,
SUM(input_tokens + output_tokens) AS total_tokens,
COUNT(*) AS calls,
SUM(cost_usd) AS cost
FROM ai_calls
WHERE called_at >= NOW() - INTERVAL '30 days'
GROUP BY 1 ORDER BY total_tokens DESC;
-- 期望:hermes tokens ≥ 4× openclaw tokens;openclaw cost > hermes cost(hermes = $0)
V2:A7 切換驗證
-- Q&A 第一響應應 ≥ 80% 走 Hermes / qwen3
SELECT model, COUNT(*) AS calls,
ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct
FROM ai_calls
WHERE caller IN ('openclaw_qa', 'hermes_qa', 'openclaw_bot_main')
AND called_at >= NOW() - INTERVAL '7 days'
GROUP BY model ORDER BY calls DESC;
-- 期望:qwen3:14b + hermes3 合計 ≥ 80%
V3:Gemini 月支出
- 每月 1 日 token report Section 4「by provider 月成本」對比 baseline 月份
- 預期
geminiprovider 月成本下降 ≥ 20%
V4:A8 / A10 上線
- Phase 4 後
caller='hermes_daily_summary'應每日 1 筆出現於 ai_calls - Phase 8 後
services/openclaw_strategist_service.py行數 ≤ 1300
References
- ADR-001 三 Agent 自主學習分工(戰役起點,Hermes/NemoTron/OpenClaw 原始定義)
- ADR-002 pgvector 唯一向量庫(Hermes embedding 落點)
- ADR-004 NemoTron fallback chain(OpenClaw NIM 鏈來源)
- ADR-018 四 Agent 控制面(本 ADR 細化的 L1/L3 角色)
- ADR-019 Telegram Agentic Layer(Hermes 主入口落地路徑)
- ADR-021 EA HITL pre-fetch(Hermes 預跑 5s timeout 設計)
- ADR-027 Primary Ollama on GCP(Hermes 主塔的硬體依託)
- ADR-028 LLM 路由統一準則(雙塔分工是支柱 3)
docs/phase0_audit_report_20260503.md(34 caller 流量分布)docs/phase0_research_report_20260503.mdSection 1(qwen3:14b vs Gemini 品質評估)- 相關 memory:
project_three_agent_division.md、feedback_agent_action_ladder.md、reference_telegram_endpoints_map.md