← 新聞追蹤

丟一段程式碼給 AI 讓它「幫我改一下」,它改完你更不敢用了:三個提示詞把重構與除錯變成可驗收的流程

來源:業州愚公 | 2026-10-02 04:23:57

作者:業州愚公

業州愚公撰寫的《AI 工具實操與提示詞》系列文章中提到,一位轉職的朋友在使用 AI 工具幫助優化程式碼時遇到問題。朋友將一支爬資料的腳本貼進 AI 對話框,要求「幫我優化一下」,結果 AI 交回的版本雖然看起來更漂亮,但卻偷偷改掉了空資料的處理,導致程式碼報錯。為了避免此類問題,業州愚公提出使用三個提示詞,將重構與除錯拆成可驗收的流程:先讓 AI 只讀不改,講清它看到什麼;再讓它一輪只動一處並寫出理由;最後讓它先立假設,然後給出能執行的驗證步驟。這樣可以確保 AI 的修改是可控和可驗證的,避免類似的錯誤發生。

編輯評論 / Editor's Note

隨著人工智慧技術的發展,編程工作中也逐漸引入了AI的協助,但這也帶來了一些挑戰和隱憂,尤其是在程式碼優化和除錯的過程中。透過設定明確的提示詞和流程,可以更好地控制AI的修改內容和過程,從而確保程式碼的安全性和可靠性。這種方法不僅能提高編程效率,也能減少AI修改所帶來的風險。

菜鳥之友系列:《AI 工具實操與提示詞》・模板篇作者:業州愚公

上週幫一位轉職的朋友看他接的小案子。他要改一支爬資料的腳本,於是開新對話,把檔案貼進去,寫了五個字:「幫我優化一下」。AI 很快回了一份改好的版本,加了型別註解、把迴圈改寫成串列推導式、函式拆得更短,看起來漂亮很多。他貼回去跑,第一次就報錯,改了半天才發現有一處邊界條件被改掉了——原本遇到空資料會跳過,改完變成整支停掉。

問題不在 AI 會不會寫程式。它會寫,而且寫得不差。問題在你交出去的是一道沒有驗收標準的題目。「優化」不是需求,是一個形容詞;它不知道你要的是跑得快、看得懂、還是以後好改,也不知道哪些行為是你絕對不能動的。它只能按自己的偏好選,而它的偏好是「讓 diff 看起來很專業」。

要讓它改得你放心,得把這件事拆成三步:先讓它只讀不改,講清楚它看到什麼;再讓它分開動刀,一次只做一件事,並且講出理由;最後給它驗證條件,讓它自己回答「怎麼證明沒改壞」。三個模板就按這個順序排。

一、為什麼「幫我優化一下」必然出事

AI 改程式的主要風險不是寫錯語法,語法錯誤還算好消息——馬上就報錯。真正貴的是靜默的行為改變:函式簽章動了、回傳型別從陣列變成物件、空值處理換了寫法、例外從拋出改成吞掉、預設參數值被「順手」改了。這些改動不會報錯,跑起來也像對的,等到上線某個少見的輸入進來才炸。

第二個風險是範圍失控。你貼了 200 行讓它修一個 bug,它還你 400 行——順便幫你把命名改了、把註解刪了、把兩個檔案合併了、還把你不認識的相依套件引進來。你想 review,但改動面已經大過你能一眼看完的量,最後只能憑感覺按接受。

這兩個風險有共同的來源:你把「診斷」和「治療」放在同一句話裡,它就只能一邊猜病因一邊開刀。所以模板一是把診斷單獨切出來。

二、模板一:先讀後議——讓它只交一份理解報告

適用場景:任何一段你不太熟、或別人寫的程式碼。你要先確認它「看懂了沒有」,再決定讓不讓它動手。這一輪它一行都不准改。

【只讀不改・可直接複製】

下面是一段程式碼。這一輪你只做閱讀與說明,不要輸出任何修改後的程式碼,不要提出重寫版本。

請按四段回答:

1. 它做什麼:用不超過 5 句話說明這段程式的整體功能,以及它的輸入與輸出(含型別、可能的空值情況)。

2. 資料怎麼流:列出主要的執行步驟(編號),標出每一步會改變哪個變數;如果有多個函式,標出呼叫關係。

3. 可疑點:列出你認為可能有問題的地方,每條寫成「位置 → 症狀 → 你為什麼這麼懷疑」,並標注你的信心程度(高/中/低)。不要下結論說一定是 bug。

4. 我不確定的地方:如果你對某段邏輯的意圖(例如某個判斷條件為什麼這樣寫)無法從程式碼本身確認,直接列出問題問我,不要猜。

以下是程式碼:

```

【貼上你的程式碼】

```

為什麼這樣寫:第 1、2 段是逼它把理解外顯出來。這一步的價值不在答案,在你能立刻看出它哪裡理解錯了——如果它把「跳過空資料」講成「中斷處理」,你當場就知道不能把後續工作交給它。第 3 段的格式要求是為了把「可能是 bug」和「確定是 bug」分開,並附上信心程度;模型很愛用確定的語氣講推測,你把信心欄位寫進格式,它就必須自己標一次。第 4 段是最省事的一條:它看不懂設計意圖時,問你比猜你便宜一百倍。

落地細節:貼程式碼時連同檔案路徑與語言版本一起寫(例如「Python 3.11,Django 4.2」),模型對版本差異很敏感;如果這段程式有已知的業務規則(例如「金額一律以分為單位」),在第 4 段下面補一行寫明,否則它會按通用常識理解。

三、模板二:分刀重構——一次只做一件事,並寫出理由

適用場景:你已經知道要改什麼了(可能是模板一給的清單,也可能是你自己發現的 bug)。重點是控制範圍,讓每一輪改動小到你真的能 review。

【單一目標重構・可直接複製】

請對下面的程式碼做且只做一項修改:【在這裡寫下唯一一個目標,例如:修正當 items 為空陣列時會拋出例外的問題】。

規則:

1. 先寫計畫,再寫程式碼。 計畫用編號列出你要動哪幾行、改成什麼、為什麼。計畫寫完停下來等我確認,不要直接給改好的檔案。

2. 不准順手改別的。命名、排版、註解、無關的寫法,一律保持原樣。如果你認為附近有一處也該改,寫在末尾的「建議但未執行」清單裡,不要動手。

3. 不准新增外部相依。只能用這段程式已經引入的函式庫。

4. 保持對外行為不變,除了你這次要修的那一點。特別注意:函式名稱與參數、回傳值的型別與結構、例外處理方式、預設值——這些都不要動。

5. 輸出格式:先給「改動摘要」(一行講完)、再給計畫、再給完整的可複製程式碼(不要只給片段,不要用「此處省略」),最後給「建議但未執行」。

以下是我的程式碼:

```

【貼上你的程式碼】

```

為什麼這樣寫:第 1 條的「先寫計畫再停下來」是整段的核心。模型預設會一次交到底,因為它假設你要的就是結果;讓它交計畫,等於把一個可控的小關卡插在破壞發生之前——計畫讀起來很便宜,讀一段錯的程式碼的替代方案是把它跑起來、出錯、再找原因。第 2 條處理範圍失控:把「順手」變成一個必須分開呈現的欄位,它就不會混在主改動裡。第 5 條要「完整程式碼」是因為片段最容易出事,你會漏看它偷偷改掉的另一處;「不要用此處省略」這句一定要留著,否則它很愛省。

第 4 條是重構這件事的定義本身:重構的目標是改變結構而不改變行為,所以「對外行為不變」不是可選項。把它列成具體清單(簽章、型別、例外、預設值),是因為「行為」太抽象,列出四個具體項目它才好對照。

要替換的變數:那個唯一的目標;如果目標本身比較大(例如「把這個 300 行的函式拆成三個」),就拆成幾輪做,一輪只拆一個,並且在每輪第 4 條補一句「外部呼叫這個函式的地方不要改」。語言的差異也可以寫進規則,例如「不要用 JavaScript 的箭頭函式」或「符合 Pylint 預設規則」。

落地細節:改完一輪,把新版本當成新的輸入,回到模板一重跑一次只讀檢查。這聽起來多花一輪,但它攔下的正是那種「改 A 弄壞 B」的靜默問題,而那種問題在你自己跑測試之前不會現形。

四、模板三:除錯迴圈——把錯誤訊息和重現條件餵給它,讓它自己收斂

適用場景:程式已經出錯了,你手上有錯誤訊息,但看不出成因。這跟模板二不同:模板二是你指定要改什麼,模板三是讓它先定位再修,而且要用你給的證據定位。

【除錯定位與修復・可直接複製】

我的程式出了問題。請按下面的流程處理,每一步做完先停下來,等我回覆再進行下一步。

證據如下:

- 預期行為:【我本來以為會發生什麼】

- 實際行為:【實際發生了什麼】

- 錯誤訊息(原文貼上,不要改寫):

```

【貼上完整錯誤訊息與堆疊】

```

- 重現步驟:【1. … 2. … 3. …】

- 環境:語言與版本【如 Python 3.11】、作業系統【如 Windows 11】、相關套件版本【如 pandas 2.2.0】

- 相關程式碼:

```

【貼上出錯的函式與它的呼叫處】

```

流程:

1. 複述與定位:用自己的話複述這個錯誤是什麼類型(語法/型別/狀態/環境/邏輯),並指出你認為最可能的 3 個位置,按可能性排序。這一步不要給修好的程式碼。

2. 提出驗證方法:針對可能性最高的那一個,給我一句可以立刻執行的指令或一行 print,讓我跑完告訴你結果。不要叫我做大範圍改動。

3. 收到我的結果後,再判斷假設是否成立;不成立就回到第 2 步換下一個假設。

4. 確認成因後,再給修復方案:先寫一行成因,再給最小改動的完整程式碼,最後說明「為什麼這個改動不會影響其他行為」。

如果我提供的資訊不足,直接問我缺哪一項,不要猜測後繼續。

為什麼這樣寫:這個模板把除錯常見的錯誤做法倒過來了。一般人的做法是把錯誤訊息貼上去,問「這怎麼修」,然後拿到一段猜出來的修改——因為模型在手上一無所有的時候,最合理的策略就是給你一個涵蓋多種可能性的補丁,於是你會得到一堆「順便也加了防禦性檢查」的改動。這個模板逼它先講假設,再要一個能驗證假設的最小動作,你跑完回報,它才推進;這樣每一輪都建立在事實之上,而不是在猜測之上疊猜測。第 2 步那句「不要叫我做大範圍改動」是關鍵限制:除錯最貴的成本是你按建議改了五個地方,最後發現真正的原因在第六個地方,而前五個改動現在都成了新的變數。第 4 步要求說明「為什麼不會影響其他行為」,等於把模板二的紀律搬過來——修得對還不夠,得說得出為什麼沒有副作用。

要替換的變數:「證據如下」那六項要照實填,缺一項它的準確率就明顯下降,尤其是版本號——很多 bug 是特定版本的行為差異;重現步驟愈小愈好,如果只能描述而無法穩定重現,就寫「出現頻率約十分之三」而不是編一個步驟。

落地細節:把每次的假設與驗證結果留在對話裡不要刪,這份紀錄就是你下次遇到類似錯誤的線索。

五、三個模板怎麼排隊用:一張表

你要做的事 用哪個模板 產出 什麼時候用
不確定 AI 有沒有看懂這段程式碼模板一:只讀不改功能說明+可疑點清單(含信心程度)每次動刀之前,先跑這一輪
已經確定要改什麼模板二:單一目標重構計畫+完整程式碼+「建議但未執行」清單一輪只做一件事,改完重跑模板一
程式已經出錯,原因不明模板三:除錯定位與修復假設清單+可執行驗證步驟+最小修復有錯誤訊息時,先定位再修

一句話記住:先讓它讀懂,再讓它小口改,最後讓它先立假設再動手。 三件事混在一起做,你拿到的就是最開頭那個故事——一份看起來很專業、跑起來會炸的 diff。

六、新手最容易踩的三個坑

  1. 把「重構」當成「重寫」。 你說優化,它理解成重寫;重寫之後,原本那些看起來多餘的判斷條件(其實是為了處理某個真實案例)就被清掉了。與其抱怨它刪東西,不如一開始就寫明「對外行為不變」以及具體到四項的保護清單。
  2. 一次要它改五個地方。 改動面一大,你就失去 review 能力,只能整份接受——這是把把關權交出去。真要改五處,就跑五輪,每輪一處,中間自己跑一次測試。
  3. 除錯時先要答案。 「這怎麼修」拿到的是猜測;「你覺得最可能是哪三個位置,先給我一行能驗證的指令」拿到的才是進程。差別不在模型,在你有沒有把驗證的環節留在自己手上。

回到開頭那位朋友。後來我們把那支腳本重跑了一次模板一,它列出的「可疑點」裡有一條正是空陣列的處理,信心程度標的是「中」——也就是說,它其實看到了,只是沒人問它。重構與除錯交給 AI,真正省下的不是打字時間,是你自己去找線索的時間;而前提是那條線索必須先被講出來、列成清單、被你確認過。流程寫對了,它交回來的東西你才敢用。

工具推薦隨身機器人(新用戶免費試用 7 天)

除錯往往發生在你最不方便開電腦的時候——看到錯誤訊息、想先問一句。SY 視野的「隨身機器人」把手機裡的 AI 助理帶著走,隨時問、隨時用,新用戶免費試用 7 天。入口見 SY 視野(sylogs.com)首頁。

下一篇預告: 程式碼靠規則關住,翻譯卻沒有編譯器幫你檢查。下一篇換個場景——多語翻譯保真:怎麼用提示詞把「意思對但味道跑掉」的譯文逼回來,以及為什麼要求它一次給兩版,比要求它「翻得準一點」有用得多。

業州愚公 | SY 視野(sylogs.com)原創內容,轉載請註明出處。