AI 寫的函式看起來合理,你卻還說不清楚預設值如何決定、什麼時候會失敗。在 Yenpo 選取程式碼,用自己選的模型提問,再把每個判斷與原始碼對上。

準備 Yenpo、本機專案及支援相應 API 的模型服務。解釋程式碼的模型可以與撰寫它的模型不同。

1. 連接自己的模型

開啟設定的「模型」,點加號新增服務,選為「當前服務」。填入 API 類型、「介面地址」、「登入方式」,以及實際可用的模型 ID。

Yenpo 提供三種介面類型:「OpenAI Compatible」(即 OpenAI Chat Completions)、「OpenAI Responses」和「Anthropic Messages」。類型應對應服務的協定,不能只靠模型名稱判斷。「獲取列表」可省略;服務沒有清單時直接輸入 ID。

API key 只填在設定裡,先選一段允許傳送給該服務的程式碼測試。請求可能包含 AI Reader 在選取範圍以外找到的相關程式碼,詳見資料與權限。網址路徑與連線錯誤請看模型連接說明。

2. 附上要解釋的程式碼

開啟檔案,選取函式或小區塊。建立新的 AI Reader 對話,選「解釋選中」,確認附件的檔名與行範圍,再修改草稿並送出。這次閱讀保持「允許修改」關閉。

可以這樣問:

按執行順序解釋這段程式碼。每個分支都說明觸發輸入或狀態、回傳值與副作用,並引用對應原始碼行。需要時讀取呼叫端或測試,區分程式碼明示的事實與對執行時輸入的假設。不要修改檔案。

選取範圍是起點。要理解歷史修改,應開啟對應的 Git 比較,針對那次比較提問,不要假設目前檔案仍與它一致。

3. 逐一開啟原始碼引用

點回答中的引用,在「快速檢視」閱讀對應行。需要前置條件或呼叫端時,點「開啟檔案」,一次核對一個判斷。

  1. 確認路徑、行範圍與版本。
  2. 讀被引用操作前面的條件。
  3. 涉及畫面結果時,追蹤值如何傳到呼叫端。
  4. 程式碼或執行資訊不足的判斷,保留為尚未確認。

要支持「這個結果一定最後生效」,還要看哪些路徑會走到被引用的賦值、之後有沒有其他寫入。

4. 用小例子練習逐行核對

假設 AI 在教學專案寫了這個 JavaScript 函式:

function displayName(user) {
  if (!user) return 'Guest';
  const name = user.name?.trim();
  return name || 'Guest';
}

以下由程式碼區塊第一行開始編號;在專案中請使用檔案的實際行號。

要核對的說法 行數 程式碼能說明什麼
沒有使用者時回傳預設值 2 null、undefined 等假值會在讀姓名前回傳 "Guest"
全空格姓名回傳預設值 3–4 去除空格後得到 "",再回傳預設值
所有不合法輸入都安全 3 姓名若為 42 等非字串值,沒有 trim 方法,會拋出 TypeError

最後一項需要修正。這裡的可選鏈處理姓名為 null 或 undefined,沒有檢查所有型別。繼續讀呼叫端或輸入驗證,確認數字能否進入函式。

5. 追問薄弱結論並執行檢查

回答過度推論時,可以接著問:

重新確認「所有不合法輸入都安全」。姓名是數字時會怎樣?引用可能失敗的操作,再找呼叫端或驗證邏輯是否防止這種輸入。沒有依據就保留為未確認。

分別檢查沒有使用者、全空格、前後有空格的正常姓名與數字姓名。用專案測試入口執行最小的相關測試,並讀過結果。

核對時盡量不更動檔案;更新後重新選取並提問,避免拿舊解釋對照新行號。

6. 記下已經理解的內容

簡要留下輸入假設、分支行為、核對位置與實際執行的測試。輸入驗證在哪裡等未解問題也要保留,方便下次接續閱讀。

審查 Claude Code 一輪改動或 Codex 分支時,遇到需要細讀的區塊,也能使用相同步驟。