← 回作品列表

Wi-Fi 模組摘要 — 晶片商 B

Wi-Fi Tracking Data Fidelity & LLM Summarization (Vendor B)

在 LLM 摘要之前先確保來源 Excel 資料保真,並以「對位 → dry-run diff → 備份 → 交易式套用 → 重跑驗證」的可逆流程安全更新資料庫。

ai-enrichment ETLdata fidelitydry-run/applyLLMMySQL 原始碼:私有

問題現場

這個案子要對 Wi-Fi 模組的追蹤資料做 LLM 摘要,但來源 Excel 本身有些地方需要先修整。難點不在「叫 AI 摘要」,而在修整與回寫的安全

  • 修整時不能把原意弄壞(例如把承載語意的換行當空白壓掉)。
  • 回寫資料庫時不能更新到錯的列,也不能改壞、改了無法還原。

換句話說,這是一個「先把食材處理乾淨、又不能切到手」的問題。

最小技術背景

  • 資料保真(data fidelity):修整資料時不破壞原意;「整理換行」不等於「把空白全壓掉」。
  • 對位(row 對應):用穩定的 key 把「來源某一列」對到「資料庫某一筆」,避免更新錯對象。
  • dry-run / apply:先只產生「會改哪些」的差異清單(dry-run),確認後才真的寫入(apply)。
  • idempotence(重跑不變):同樣的東西再跑一次,幾乎不該再有改動;若第二次仍大改,代表流程不穩。

系統架構與資料流

更新資料庫的每一步都可預覽、可備份、可還原;最後用「重跑幾乎 0 變動」自我驗證:

flowchart TD
  XL["Excel 來源"] --> FIX["修整|保真:整理換行 ≠ 壓掉空白"]
  FIX --> MAP["對位|source_file + row_idx_excel"]
  MAP --> DRY["dry-run|產生 diff 預覽"]
  DRY --> BK["備份受影響列"]
  BK --> APP["per-file 交易式套用"]
  APP --> DB["MySQL"]
  DB --> SUM["LLM 摘要|在乾淨資料上進行"]
  APP --> IDEM{"第二次重跑 ~0 updates?"}
  IDEM -->|是| OK["穩定 / idempotent"]
  IDEM -->|否| CHK["有不穩,回查"]

關鍵設計決策(含取捨)

決策選了什麼否決的替代為什麼
順序先保真、再摘要直接把原始 Excel 丟給 LLM否決:來源一被壓壞,下游摘要就救不回來了
修整定義整理換行,但保留語意空白一律 whitespace flatten否決:等於把語意當雜訊抹掉
對位source_file + row_idx_excel 複合 key用單一欄位值對位否決:值一重複,就會對到錯的那一列
寫入dry-run → 備份 → 交易式 apply直接覆寫否決:改錯了就再也還不了原

代表性技術證據

可逆更新(pseudo-code,示意)

plan = build_diff(rows, key=["source_file", "row_idx_excel"])  # 用複合 key 對位,避免認錯人
review(plan)                       # dry-run:先看看會改到哪些,別急著動
backup(plan.affected)              # 受影響的列先備份起來
for f, changes in plan.by_file():  # 一個檔案包成一個交易
    with db.transaction():
        db.apply(changes)          # 出錯 → 整個交易整批退回

# idempotence 自我驗證:再跑一次,diff 應該幾乎是空的
assert len(build_diff(rows, key=KEY).changes) == 0

合成範例(示意):來源含 "log line A\nlog line B",修整後仍是兩行;若某次「修整」把它變成 "log line A log line B",就是把語意壓掉了——應在保真檢查時被擋。

踩過的坑

欄位內容
症狀套用後,部分列的內容對到了錯的資料
初判(猜錯)第一個念頭是 LLM 摘要出錯
驗證追 row 對位,發現用單一欄位對位、在重複值時對錯了列
根因對位 key 不唯一
修法改用 source_file + row_idx_excel 複合 key
預防dry-run diff 須人工看過才 apply;並以「第二次重跑 ~0 updates」驗穩

驗證方式

  • 保真:含多行的合成列,修整後語意換行仍在(不被壓平)。
  • 對位:重複值情境下,複合 key 仍對到正確列。
  • 可逆:dry-run 先出 diff、備份後才交易式 apply,失敗整批退回。
  • idempotence(驗收標準):第二次重跑的變動數接近 0。

可複製 SOP:安全地修整並回寫資料

適用情境:要修整來源資料並更新到資料庫,且不能改錯、改壞。

不適用情境:純新增、無覆寫風險時可簡化。

前置條件

  • 一組能唯一對位的 key(必要時用複合 key)。
  • 備份與交易能力;一組含多行 / 重複值的合成資料當基準。

步驟

  1. 先定義保真:先講清楚哪些東西算「語意」(這裡是換行),修整時一定要留著。
  2. 複合 key 對位:用一個能唯一定位的 key,免得更新到錯的列。
  3. dry-run 先看:先產生 diff 預覽,人眼確認過再真的動。
  4. 備份再套用:先備份受影響的列,一個檔包一個交易寫入,出錯就整批退回。
  5. 重跑驗穩:再跑一次看看,變動應該接近 0,不然就是還不穩。

停損點

  • dry-run diff 出現預期外的大量變動 → 停,先查對位 / 修整。
  • 第二次重跑仍大量變動 → 停,流程不穩,不可信任。

驗收標準

  • 對位正確、語意保真、可還原;重跑接近 0 變動。

回滾:套用前的備份即還原點;以交易為單位,失敗整批退回。

可複製到:任何「修整來源資料並安全覆寫資料庫」的場景。

決策回放(三個月後回讀用)

  • 背景:LLM 摘要前要先修整 Excel 並安全回寫,不能改錯改壞。
  • 限制:不可外流真實追蹤資料與供應商名;覆寫須可預覽、可備份、可還原。
  • 考慮過但放棄:直接 whitespace flatten 完就入庫——被「破壞語意」否決;還有單欄位對位——被「重複值會對錯」否決。
  • 證據:複合 key 對位、dry-run diff、交易式 apply、idempotence 重跑驗證。
  • 未解:保真檢查到底覆蓋多廣;跨供應商要不要共用同一套修整 / 回寫框架。

作者備註: 「重跑一次看還會不會變」是我很愛的低成本驗證——它幾乎不花力氣,卻能立刻告訴你流程到底穩不穩。