結論

當系統能力不滿足使用者預期(capability gap)時、對策有三層階梯、依序評估:

對策成本覆蓋率脆弱度
L1 Expectation alignment用文字 / UI / 訊息對齊使用者預期UX hint「搜尋為前綴匹配、找 backpressure 請輸入 backpre」極低部分(需要使用者配合)0
L2 Augmenting computation在既有 engine 上加一層補強計算、close gapClient-side substring fallback、retry with backoff、computed fallback低-中高(自動補齊)中(多一條 path)
L3 Structural rebuild換 index / engine / 演算法本身Build-time tokenize、換 search engine、重設計 schema中-高滿(從 source 解決)高(動 build pipeline)

預設順序:L1 → L2 → L3、依「成本最低先解」。不必每次跳到 L3 — L3 是最完整但也最貴、L1 在很多情境就夠。


為什麼有階梯:cost-coverage trade-off 是真實的

直覺反應遇到 capability gap 都想 L3「從根解決」。但 L3 的成本通常 10-100x 於 L1、覆蓋率提升可能只是 80% → 99%、邊際 ROI 低。

實際分布:

  • 50% case:L1 就夠(gap 是「使用者誤解」、講清楚就好)
  • 30% case:L2 解掉(gap 是「engine 差一步運算」、補一層 close)
  • 20% case:必須 L3(gap 是「engine 模型錯位」、補不夠、要重來)

先試 L1、再試 L2、最後 L3 = 用真實 ROI 排序、不是用「完美主義」排序。


三層的判讀

L1:expectation alignment

適合

  • Gap 是「使用者預期跟 system capability 對不齊」、不是「system 算錯」
  • 使用者改變行為就能 close gap(打字方式、order operation、輸入格式)
  • Production 真的有 capability、只是 affordance 不明顯

不適合

  • Gap 在 system 算錯、不是預期錯位
  • 使用者無法配合(流量大、不可能教育每個 user)
  • 訊息會被忽略(A/B test 證明 hint 沒人讀)

領域L1 對策
Search prefix-matchUX hint「搜尋是前綴匹配」+ examples
Database eventual consistencyUX「資料同步可能延遲幾秒」+ refresh button
LLM token limitUI 提醒「附件太長、預期會被截斷」
Network failureToast「網路不穩、稍後再試」
Concurrent editBanner「另一人也在編輯、你看到的是 5 秒前版本」

L2:augmenting computation

適合

  • Engine 缺一層計算就能 close gap、額外計算不貴
  • Client / proxy / wrapper 層可加運算、不動 engine
  • 預期 query 量在 augment 計算容量內

不適合

  • 補強計算成本爆炸(dataset 大、O(N) per query)
  • Augmenting 跟 engine 結果語意不一致(產生 ghost results)
  • 需要兩 engine 同步狀態才正確

領域L2 對策
Search prefix-matchClient-side substring fallback(再掃 client cache)
Distributed sortClient-side merge of partial sorted streams
LLM context windowRAG 切片 + retrieval 補齊
Cache missOn-demand compute + write back
Stale dataBackground refresh + serve stale-while-revalidate

L3:structural rebuild

適合

  • L1 / L2 都不夠、capability gap 持續引發痛苦
  • Production scale 大、L1 教育成本爆 / L2 計算成本爆
  • 系統還沒長太大、重 build 成本可承受
  • 將來會反覆遇到同類 gap(一次重 build、長期解多個問題)

不適合

  • L1 / L2 還沒試
  • Production scale 不可動 build pipeline / schema
  • ROI 不確定(gap 影響範圍小、值得 L3 投入嗎?)

領域L3 對策
Search prefix-matchBuild-time tokenize、換 search engine(Algolia / Elastic)
Distributed sortSharded sort + index in build pipeline
LLM context windowLarger model、custom fine-tune
Cache missSchema redesign、prefetch policy
Stale dataEvent-driven invalidation、CRDT

從 L1 升級到 L2 / L3 的訊號

不是「永遠先 L1」、是「依訊號逐層升級」:

訊號升級到
L1 ship 後使用者抱怨「我看到 hint 但還是不會用」L2(hint 不夠、要 system 自動補強)
L1 + L2 ship 後 search miss 率 > X%L3(structural fix 必要)
L1 + L2 ship 後 augment 計算成本 > YL3(換結構降低 marginal cost)
Use case 從 cosmetic 升級成 production-criticalL3(風險 / SLA 提升)
同類 gap 在系統內出現第 3 次L3(重 build 一次解多個)

逐層升級 vs 一次跳 L3:前者是 #76 分批 ship 的具體展現;後者是「便利驅動偏移」(#67) — 容易寫的選項是 L3「一勞永逸」、跟實際 ROI 不對齊。


從 L3 / L2 降級回 L1 的訊號

階梯不是只能升、也該能降 — L3 ship 後不該當「永久解」、是 ROI 動態的選擇。看到以下訊號、考慮降級:

訊號降級到
L3 transformation 每次 dependency upgrade 都要修L1 / L2(L3 維護成本 > 收益)
Use case 變化、L3 解的問題已不存在拔掉 L3、退到 L2 或不需要
L3 ship 後 close gap 率 < 10%(投入 / 受益不對等)可能該重設計、不只升降
Pagefind / engine 升級後 native 支援了拔 L3 transformation、用 native
L3 引入新 bug 比解的 gap 多退回 L1 + 顯式說「不支援」更誠實
L1 hint 已經教育大多數 user 改變行為L2 / L3 fallback 觸發率低、可降級

為什麼降級難

升級有「使用者抱怨」當外部觸發、降級沒有 — 沒人抱怨「我們的 transformation 太多」。所以降級是典型的 #72 高 ROI 無觸發 工作、需要結構性 trigger:

  • Periodic review(每季 review「我們還需要這個 L3 嗎」)
  • Dependency upgrade event(升級觸發「L3 還相容嗎、還必要嗎」)
  • Maintenance cost log(紀錄 L3 修了 N 次、累積到 threshold 觸發 review)

Pruning 是正常 lifecycle

降級不是「我們之前做錯」、是「ROI 變化、調整」。L3 在 ship 當下是最佳解、現在不是了 — 接受 capability gap 對策也會過時、跟其他工程決策同。


階梯 vs 疊加:跟 #75 的差別

#75 主策略 + 補強策略 講的是多策略疊加在不同層(structural + UX 並用)。本卡講的是同一個 gap 上、選哪一層(L1 vs L2 vs L3 通常選一個)。

兩卡互補:

  • #75:選了 L3 後、要不要再加 L1 UX hint 當補強?(疊加維度)
  • #86(本卡):先試 L1 還是直接 L3?(階梯維度)

實際 case 通常兩條都用:先 #86 選層級、再 #75 看要不要疊加。


反模式

反模式後果
跳過 L1 直接 L3過度工程、ROI 邊際
L1 ship 後不評估、預設要繼續 L3缺數據、可能 L1 已夠
「L1 是 hack、L3 才是 real fix」道德判斷阻止 L1 的價值、使用者多受苦
L2 augmenting 沒邊界、dataset 變大時 OOML2 該升 L3 了沒升
L1 hint 寫滿但 production 沒監測有沒有用不知道 hint 有沒有 close gap
同類 gap 每次都 L3 一次缺 #75 疊加思維、每次重 build

何時直接跳 L3

情境為什麼
Gap 是 security / data integrityL1 / L2 不夠、必須 root fix
已 L1 / L2 過 N 次、gap 還在證據累積、L3 ROI 已正
Production scale 不允許 L1 教育 / L2 計算跨過 L1 / L2 的可行區
重 build 成本當前最低(系統還小)越早 L3 越便宜

四類共通:L1 / L2 已知不夠、或 L3 真的最便宜。其他情境都該先試 L1。


跟其他抽象層原則的關係

原則關係
#75 主策略 + 補強疊加#75 是「同 gap 上選不選疊加」、本卡是「先選哪層」 — 互補
#76 分批 shipL1 → L2 → L3 升級 = 分批 ship 在 capability 維度的展現
#73 search 匹配模式search prefix-match 是本卡 L1 / L2 / L3 三層的具體 case
#59 五策略選擇矩陣#59 的五策略可重新映射到本卡三層(A 推進 query = L3、D UX hint = L1)
#82 字面攔截 vs 行為精煉L1 / L2 多偏字面層、L3 動結構、選層需 multi-pass review

判讀徵兆

訊號該做的事
寫到「直接 L3」沒講為什麼不 L1補 L1 評估、確認真不夠
L1 ship 後沒監測 close gap 率補 telemetry、決定要不要升 L2
「這個 hint 沒用、user 不讀」抱怨確認是真不讀還是 hint 寫不對、不直接跳 L3
L2 augmenting 成本越來越高升 L3 的訊號、不是 L2 寫得不夠好
同類 gap 第 3 次 L1 解掉抽 pattern、可能該寫成 reusable component
L3 ship 後 L1 hint 沒拔三層共存反而冗餘、清理

核心:Capability gap 不是只有 L3 一條路 — L1 / L2 / L3 是 ROI 不同的三層階梯、依「成本最低先解」順序評估。「直接 L3」的便利感跟實際 ROI 反相關#67)— 寫 L3 在白板上很爽、但通常 L1 / L2 已夠。