- Published on
Kiro SDD 入門(四):為什麼 AI 幫你重構總是越搞越糟?(AST vs LSP 實戰)
Table of Contents
你是否有過這種經驗:在 Cursor 裡或用 Claude Code 叫 AI 「幫我把專案裡 User 這個變數名稱統一改成 Client」?
結果 AI 回報「修改完成!✨」,你興沖沖地跑 yarn dev,迎面而來的就是滿滿的紅色報錯:
- 某個檔案的
import { User }忘記改成Client。 - 其他檔案裡單純的註解
// notify the User莫名其妙變成了// notify the Client。 - 更慘的是,某個以
User為名的資料夾被移動了,導致四五個檔案的相對路徑../../User/api壞得一塌糊塗。
為什麼 AI 那麼聰明,卻連個重新命名都做不好? 因為你把「重構 (Refactoring)」當成了「純文字替換 (Text Edit)」。
上一篇我們聊了 Bug Fix Paradox,這一篇我們來聊聊,在 2026 年的今天,我們該如何建立正確的 Agentic Workflow,讓 AI 安全且完美地幫我們重構。
理論篇:重構的底層邏輯(AST 與 LSP)
在探討怎麼叫 AI 做事前,我們要先理解為什麼傳統的 Find & Replace(也就是預設 AI 幫你改程式碼的方式)一定會出包。
重構不是編輯文章,而是一個**「尋找 AST (抽象語法樹) 關聯」的精確工程**。當你「只改一個名字」或「搬移一個檔案」時,背後牽扯到 imports、exports、linter 規則,以及 module resolution。
1. 傳統 AI:瞎子摸象 (Text-based)
當你叫 AI 改名時,它(如果沒有配備好工具)就是拿著你給的字串,用正規表示式去整個專案裡撈。這種「純文字替換」沒有上下文觀念,它不知道哪個 User 是一個 interface,哪個 User 只是一個恰巧同名的變數。所以誤殺(改錯註解)跟漏殺(沒改到動態 import)幾乎是必然的。
2. 現代作法:上帝視角 (Semantic-based)
如果你平時用 VSCode,當你在一個變數上按下 F2 (重新命名),IDE 是不會猜測的。它是去問 LSP (Language Server Protocol)。LSP 早就把你的檔案解析成了一棵巨大的 AST 樹狀依賴圖,它知道這個 User 的定義在哪,且被哪 15 個檔案精確引用。
重構是精確的外科手術,不該交給只會文字接龍的 LLM 盲目瞎猜。
實務篇:如何在 2026 讓 AI 幫你正確重構?
既然知道了問題出在哪,我們該怎麼解決?身為開發者,你需要幫 AI 準備對的「手術刀」。
目前我們有兩種手術刀:LSP 與 AST CLI 工具。很多開發者會把它們搞混,認為只要是操作 AST 就好。我們用一張決策矩陣來告訴你何時該用誰:
迷思釐清:AST vs LSP 哪個好?
- 🥇 LSP 是王者 (負責 90% 日常重構):如果你只是要重新命名檔案/符號、搬移資料夾、把一段 code 提取成共用函式,直接呼叫 LSP 是最佳解。因為它已經是內建好全域索引的上帝視角(就像你手動按 F2)。
- 🛠️ AST 工具是特種部隊 (負責大規模客製重構):如果你遇到 LSP 預設按鈕沒有的功能,比如:「把整個專案的 React Class Component 全部轉換成 Hooks」,LSP 辦不到。這時候才需要派出 AI 去操作
ast-grep或jscodeshift寫腳本硬派轉換。
下指令的藝術 (以 Claude Code 為例)
現在,當你在終端機啟動 Claude Code 時,請改變你的詠唱習慣。
❌ 傳統的災難 Prompt:
「幫我把整個專案的
authHelper改名成securityCore,還有幫我把Auth.tsx移到shared資料夾。」 (下場:Claude 會開始生成 bash 腳本,用sed指令或是手動幫你改檔,保證跑完後一堆破圖跟路徑錯誤。)
✅ Agentic Workflow 的正確 Prompt:
「我要把
authHelper重命名為securityCore。請你不要手動去改文字,請去呼叫 LSP / 當前專案的 refactor CLI / IDE Rename API 來執行這件事。改完後請跑yarn lint確保所有的 import 都有被自動更新。」
如果你使用的環境(如 Kiro 或搭配特定 Agent 擴充包)已經把 IDE 的 LSP Refactor API 暴露給 Agent,AI 就能自己去「按 F2」。
💡 給進階玩家的提示:
如果你的 CLI 環境沒有串接 LSP,你可以直接指使 Claude Code 去跑你設定好的 eslint --fix 或是你寫好的 ast-grep rule。重點在於:讓 AI 腦去下達指令給驗證過的底層工具,而不是讓 AI 的手親自去改 code。
結論:Agentic AI 的正確協作邊界
在 2026 年,一個設計優良的代理(Agent)工作流,不應該是什麼都叫 LLM 自己硬刻。
就像上圖展示的,一個完美的重構回合應該是:
- 開發者 (你):給出重構意圖(我要重組架構、改名)。
- AI Agent (Claude Code):負責理解意圖與統籌流程。它知道要改名,但它克制住自己寫 code 的衝動。
- AST Tool / LSP:做為精確的手術刀。AI 將任務委託給它,由它來尋找語法樹結點,並一次性安全地刷新全部檔案的路徑。
AI 應該成為指揮官,而不是拿著磚頭亂敲的工人。 把「創意與意圖」交給 AI,把「精確與結構」交給編輯器底層工具,這才是 Agentic AI 能真正安全落地的唯一心法。
參考與延伸閱讀
- Refactoring made right: how program analysis makes AI agents safe and reliable
- Kiro SDD 入門(三):為什麼 AI 修 bug 越修越壞
- Agentic Workflow 設計概念:怎麼讓 AI 真的幫你做事
支持作者 ☕
透過 LINE Pay 支持
透過 Ko-fi 支持