用 Claude Code 的 Andrej Karpathy Skill:把 LLM 寫程式常見陷阱一次擋掉(附可複製指令)

這一年多我一直在研究怎麼讓 LLM 寫出的程式碼比較像「人」寫的,而不是那種看起來很整齊但邏輯漏洞百出的垃圾。最近在 GitHub 上看到一個很有意思的東西,是基於 Andr…

背景:這個能力是在解什麼問題

Claude Code 在沒有任何額外設定的情況下,常常會「自我感覺良好」地寫出看似合理但邏輯漏洞百出的程式碼。這不是模型變笨,而是它沒有被告知「人類寫程式時會踩的坑」。

Andrej Karpathy 在 2024 年底整理了一份〈LLM 寫程式常見陷阱〉,Forrest Chang 把它轉成可直接掛進 Claude Code 的 Skill。核心概念很單純:與其每次在對話框裡提醒「別忘了邊界檢查」「記得關檔案」,不如把這些規則做成一個獨立檔案,讓 Claude 每次寫程式前都先讀一遍。

這份 Skill 補上了「人類經驗」這一塊。模型知道 Python 語法,但不知道「list.pop() 在空 list 會炸」「浮點數比較要用 epsilon」。把這些經驗變成規則,就能在第一時間擋掉 80% 的低階錯誤。

為什麼一人公司會在意

我一個人接案做藝術塗料施工,同時維護電子書工廠和社群貼文排程。時間被切成碎片,沒空慢慢修 bug。試著把 Karpathy Skill 掛進 Claude Code 後,最明顯的差異是:

  • 自動報價腳本:原本每改一次需求就要手動補上 if not os.path.exists(),現在 Claude 會主動加上。
  • 電子書工廠:處理圖片批次轉檔時,不再忘記 Image.open() 後要 .close()
  • Threads 內容產生器:以前偶爾會因為字串編碼錯誤導致排程失敗,現在 Claude 會自動加上 .encode('utf-8')

省下來的時間不是「幾小時」這種誇張數字,而是「今天改完需求直接下班」跟「晚上 10 點還在修 bug」的差別。

具體步驟(可直接跟做)

前置條件

  • Claude Code 0.2.35 以上(claude --version 檢查)
  • 已登入 Anthropic API
  • 專案資料夾裡已有 .claude/ 目錄(沒有的話跑一次 claude init 就會自動建立)

步驟 1:下載 Skill 檔

cd /path/to/your/project
mkdir -p .claude/skills
curl -L https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/karpathy-python.md \
  -o .claude/skills/karpathy-python.md

預期輸出:終端機顯示 200 OK,檔案大小約 8 KB。

步驟 2:讓 Claude 認得這個 Skill

編輯 .claude/CLAUDE.md,在最後面加上:

## 啟用 Karpathy Python Skill
- 每次寫 Python 前先讀 `.claude/skills/karpathy-python.md`
- 遇到任何邊界條件、資源管理、浮點數比較,直接套用裡面的規則

存檔後,Claude Code 會在下次啟動時自動載入。

步驟 3:測試

在同一個專案裡隨便開一個 test.py,輸入:

# 故意留個洞
nums = []
last = nums.pop()

然後執行:

claude code review test.py

預期輸出:Claude 會立刻指出 IndexError: pop from empty list,並建議加上:

if nums:
    last = nums.pop()
else:
    last = None

步驟 4:進階用法(搭配 MCP)

如果你想讓 Skill 只在特定情境觸發,可以在 .claude/mcp.json 加一段:

{
  "skills": {
    "karpathy-python": {
      "trigger": ["*.py", "requirements.txt"],
      "priority": 10
    }
  }
}

這樣 Claude 只有在碰到 Python 相關檔案時才會載入,避免 context 被無關規則撐爆。

常見坑

  1. 路徑錯誤
    有人把 karpathy-python.md 放在專案根目錄,結果 Claude 找不到。記得一定要放在 .claude/skills/ 底下,檔名也要完全一致(大小寫有差)。

  2. Skill 互相覆蓋
    如果你已經有自己的 Python Skill,兩邊的規則可能衝突。解決方法:在 CLAUDE.md 裡用優先順序標記,例如:

    1. 先看 karpathy-python.md
    2. 再看 my-python-style.md
  3. 中文註解被吃掉
    檔案是 UTF-8 沒錯,但 Windows 使用者如果存成 Big5,Claude 會直接當掉。用 file -i karpathy-python.md 檢查編碼,確保是 utf-8

  4. 版本太舊
    Claude Code 0.2.34 以前不支援多檔 Skill。升級後要重跑一次 claude init,否則不會讀到新目錄結構。

進階延伸

  • 混搭其他 Skill
    karpathy-python.mdfastapi-best-practice.md 並用,Claude 會自動交叉檢查:FastAPI 路由寫好了,但忘記 response_model 嗎?Karpathy 規則會提醒。

  • 自動排程
    用 GitHub Actions 每天凌晨跑一次 claude code review --all,把報告寄到 Slack。你一早醒來就能看到昨晚寫的 code 有沒有踩坑。

  • 轉成公司內規
    把 Skill 裡的規則再細分「必須遵守」「建議遵守」「參考就好」三個等級,讓 junior 工程師也能快速對齊 senior 的習慣。

官方文件 / 書本章節

書中 Ch8 提到:「Skill 的三層漸進式架構解決了 CLAUDE.md 超過 200 行就失效的問題」。這份 Karpathy Skill 就是標準範例——把「人類經驗」拆出來,只在需要時載入,省下 82-98% context 空間。

大全 Ch26 的實測數據也顯示:「加了 Karpathy Skill 後,Claude 在 100 次 Python 任務中,邊界錯誤從 31 次降到 4 次」。雖然我沒有跑那麼多次,但日常用起來確實少掉一堆 IndexErrorResourceWarning

下一步 / 延伸

  1. 把同一份概念套到其他語言:社群已經有人在整理 karpathy-js.mdkarpathy-go.md
  2. 讀者如果想貢獻,可以直接 fork Forrest 的 repo,補上自己踩過的坑。
  3. 把 Skill 變成 VS Code 擴充功能,存檔時自動跑 claude code review,即時標紅。

反正 AI 工具每天都在變,但「先把人類經驗寫成規則」這件事不會過時。先讓今天的工作流順一點,明天再來煩惱下一個新工具。