簡介:程式碼不在乎你的感覺
關於大型語言模型和程式碼,重點是:它們驚人地自信,但完全不在乎你的程式是否能編譯。Claude Haiku 4.5 會很樂意為你編寫一個解決你問題的 Python 腳本,外加兩個它為了好玩而發明的問題。訣竅——唯一重要的訣竅——是學習如何提示 Claude Haiku 4.5 以準確地生成程式碼,不留下任何感覺的空間,並盡可能地保留真實性。你不需要聽起來像程式碼的文字,你需要的是的程式碼。這兩者之間是有區別的。
人們將提示視為神秘的咒語——說對正確的詞語,就能得到完美的應用程式。這是的想法。程式碼是一種契約。如果你想從 Claude Haiku 獲得準確性,你必須編寫契約。「建立一個 Web 應用程式」不是契約。「在 Python 3.12 中產生一個 FastAPI 端點,它接受 JSON,使用 Pydantic v2 驗證模式,並在模式錯誤時返回帶有特定 payload 格式的 422」才是一種契約。這就是如何提示 Claude Haiku 4.5 以準確地生成程式碼:你必須明確契約。
這是什麼(以及不是什麼)
- 這是一份關於如何從 Claude Haiku 4.5 獲得可靠、可測試程式碼的指南。
- 這不是關於「AI 取代開發人員」的說教。工具不會取代思考。
- 它專注於實際的提示、結構和防護措施:這些枯燥的部分使魔法得以實現。
如果你想要可以運行的程式碼,你需要給 Claude 一個可行的「運行」定義。如果你想要準確的程式碼生成,你需要用簡單、可測試的術語來定義準確性。這就是整個遊戲。
像律師一樣定義準確性,而不是像詩人
「準確」的程式碼不是「看起來合理」的程式碼。準確性是指:
- 確定性行為:相同的輸入,相同的輸出,在定義的誤差範圍內。
- 版本正確性:它使用正確的 SDK、API 版本和語言功能。
Claude 會給你你所要求的。如果你要求「一個對列表進行排序的函數」,你可能會得到一個。如果你要求「一個使用 Timsort 語義且額外空間為 O(1) 的穩定、原地排序」,那是一個不同的承諾。「如何提示 Claude Haiku 4.5 以準確地生成程式碼」始於將這些承諾寫入提示中。
最小可行提示,已升級
糟糕:「為任務編寫一個 Node API。」
較好:「編寫一個 Node 20 Express 4 API,其中包含一個 /tasks POST 路由,該路由驗證欄位 {title: string, dueDate: ISO 8601},並使用已建立的物件回應 201,或使用錯誤詳細資訊回應 400。」
正確:「產生一個 Node 20 Express 4 伺服器,其中包含一個 /tasks POST 端點。要求:1) 使用 [email protected] 驗證 body;2) 欄位:title(非空字串,最多 140 個字元),dueDate(ISO 8601 未來日期);3) 成功時:201,包含 {id: ULID, title, dueDate};4) 無效時:400,包含 {error: 'VALIDATION', details: array};5) 沒有資料庫;記憶體中的 Map;6) 包含 Jest 29 測試檔案,涵蓋有效、無效(空標題、過去日期);7) 提供用於測試和開發的 npm 指令碼;8) 使用 ESM;9) 不要包含多餘的評論。」 注意其結構:語言版本、函式庫、約束、輸出、錯誤、測試,甚至套件結構。你消除了歧義。Claude 的工作是填寫程式碼,而不是需求。
支架模式:系統、規範、測試,然後是程式碼
如果你想從 Claude Haiku 4.5 獲得準確的程式碼生成,你需要給它一個跑道:
- 你:「你正在為 Node 20 編寫生產品質的 TypeScript。僅輸出帶有檔案名稱的程式碼塊,不輸出其他內容。」
- 包括語言版本、套件選擇、錯誤語義、I/O 格式、效能限制和安全性約束。
- 告訴 Claude 首先編寫單元測試。測試比形容詞更好地定義了「準確」。如果一行程式碼不服務於測試,那它就是裝飾性的。
- 僅在測試之後。是的,這基本上是 TDD,但有一個永遠不會厭倦編寫樣板程式碼的機器人。
- 「如果測試失敗或導入不符,僅更新失敗的部分。不要重寫整個專案。」
當 Claude 具有上下文和軌道時,它會做得很好。給它軌道。
版本固定不是可選項
Claude 的訓練資料中充滿了新舊文件。這是一種委婉的說法,表示它已經看過很多相互矛盾的建議。「使用 React Router」很模糊。「使用 [email protected] 搭配資料路由器」才是一種指示。不要相信預設值: - 語言:固定到 Python 3.12、Node 20、Go 1.22、Java 21——無論你實際運行什麼。
- 雲端 SDK:固定版本;aws-sdk v2 與 v3 很重要。
- Linters/formatters:指定規則以避免「風格乒乓」重寫。
如果你不固定,你將會得到過去五年部落格文章的精選集。準確的程式碼生成對懷舊過敏。
始終以架構為先
不要要求「使用者設定檔」結構。在提示中定義架構並要求驗證:
- JS/TS 中的 JSON Schema 或 Zod/Yup 類型
然後讓 Claude 在邊界強制執行架構——API 輸入、資料庫寫入和訊息佇列。要求明確的錯誤 payload 和代碼。準確性喜歡架構,而歧義不喜歡。
使其可觀察,否則就不要假裝它是真實的
告訴 Claude 在你需要的地方新增日誌記錄、指標和追蹤——並在你不需要的地方保持它們安靜。一個好的提示包括:
- 日誌記錄策略:級別、PII 的編輯、結構(JSON 日誌,拜託)
Claude 會新增你要求的內容。如果你不要求,你會得到 print 語句——如果你幸運的話。
測試優先的提示勝過「僅僅信任我」
提示 Claude Haiku 4.5 以準確地生成程式碼的一個好方法是使測試成為真相的來源。範例:
「為函數 normalize_email(s) 編寫 pytest 測試,該函數:
- 僅針對 gmail.com 剝離子地址 (+tag);
- 保留 unicode 域 punycode 原樣。
涵蓋邊緣案例。編寫測試後,實作函數以通過測試。」
當 Claude 被迫滿足你描述的測試時,它通常會編寫更好的程式碼。如果沒有,你會得到一個具體的失敗,而不是一個感覺的爭論。
通過構造消除幻覺
你無法消除幻覺,但你可以將它們圍起來:
- 僅在來源存在時要求引用或來源 URL。對於 SDK 方法,要求文件連結並要求程式碼與這些文件匹配。
- 對於私有 API,將規範貼到提示中。不要期望 Claude 知道你的內部端點。
- 對於具有令人困惑 API 的函式庫,包含來自官方文件的範例程式碼片段,並告訴 Claude 遵守它。
準確的程式碼主要是準確的參考文獻。給 Claude 參考文獻。
風格指南:最不性感,最有用的東西
Claude 以它推斷出的任何風格編寫程式碼。這是一個變動的配方。貼上你的風格指南。指定:
- 格式化(Prettier、Black、gofmt 預設值)
還要為不明顯的選擇要求簡短的理由註釋。未來的你會感謝你,而現在的 Claude 將產生更少的「修復」PR。
長提示,短輸出
另一種思考如何提示 Claude Haiku 4.5 以準確地生成程式碼的方法:將你的文字花在提示上,而不是輸出上。你想要:
告訴它抑制解釋,僅返回帶有檔案名稱和簡短 README 的程式碼塊。如果你想要評論,請在單獨的運行中要求它。交錯的文字和程式碼是錯誤如何戴著單片眼鏡和高頂禮帽偷偷潛入的方式。
細化:實際有效的緊密迴圈
獲得可靠程式碼的最快途徑不是「第一次就做對」。它是簡短的、修正性的迴圈:
- 在本地運行。將失敗的測試輸出和編譯器錯誤逐字貼回 Claude。
- 指示:「僅修改必要的最小行數;除非失敗的測試要求,否則不要更改函數簽名。」
當你告訴它什麼地方出錯時,Claude 非常擅長應用差異。不要意譯失敗日誌。貼上它們。日誌是真相。
安全性是一種功能,而不是後記
因為模型是在公共程式碼(好的、壞的和被詛咒的)上訓練的,所以你想將安全性作為一級要求:
- 明確禁止 eval、shell=True 和字串類型 SQL
預設安全的提示會產生更安全的程式碼。一個「我們稍後再修補它」的提示會產生頭條新聞。
效能:說明「快速」是什麼意思
「使其快速」翻譯成「做任何事情」。相反,指定指標:
- 延遲目標(記憶體中 p95 < 50 毫秒,DB 操作 p95 < 300 毫秒)
- 時間複雜度(必須為 O(n log n),而不是 O(n^2))
Claude 將選擇演算法以適應你設定的預算。給它一個預算。
文件:足以讓陌生人上手
要求 Claude 提供一個 README,其中包括:
「準確的程式碼」包括準確的文件。它們是交付成果的一部分。
你可以竊取的具體提示範本
範本:後端端點
系統:你是一位細緻的 Python 3.12 工程師。僅輸出帶有檔案名稱的程式碼塊。
使用者:
- 建立一個帶有 POST /convert 端點的 FastAPI 0.111 應用程式。
- 請求:{amount: Decimal as string, from: 'USD'|'EUR', to: same}。
- 使用 pydantic v2 驗證;在架構錯誤時返回 422 形狀。
- 使用具有固定匯率 {USD:1, EUR:1.1} 的純函數 convert(amount, from, to)。
- 返回 {amount: string, currency: string},狀態碼為 200。
- 包含 pytest 測試,涵蓋有效、無效(錯誤的小數、未知的代碼)和邊緣(0)。
- 提供帶有固定依賴項的 pyproject.toml;包含 ruff 和 mypy 配置。
範本:CLI 實用程式
系統:你正在編寫 Go 1.22。僅輸出帶有檔案名稱的程式碼塊。
使用者:
- 建立一個名為 slugify 的 CLI,它讀取 stdin 並列印 URL 安全的 slug。
- 規則:小寫、僅 ASCII、連字符分隔符、摺疊空格、剝離標點符號。
- 提供帶有表格測試的 main.go 和 slugify_test.go。
範本:前端元件
系統:你是一位務實的 React 工程師,目標是 React 18 + TypeScript。
使用者:
- 實作一個 <DebouncedInput> 元件。
- Props:value: string, onChange(value): void, delay=300。
- 使用 useRef/useEffect;沒有第三方 hooks。
這些範本示範了如何通過固定版本、定義行為和要求測試來提示 Claude Haiku 4.5 以準確地生成程式碼。
拒絕聰明:何時說「不要最佳化」
如果你不想要過早的微最佳化(而且你不想),請這樣說:
- 「優先考慮可讀性而不是聰明;除非測試要求,否則不要進行位元操作。」
Claude 喜歡給人留下深刻印象。不要讓它這樣做。讓它通過測試並具有可讀性。這就夠令人印象深刻了。
我見過人們像生產力儀式一樣在隨機聊天標籤中處理提示。使用一個了解程式碼上下文的工作區。Sider.AI,例如,是圍繞保持你的規範、程式碼、差異和測試日誌在視圖中而構建的,因此「貼上錯誤,修復程式碼行」迴圈實際上很緊密。這不是魔法;這是枯燥的支架,可以防止你失去情節。如果你的工具將契約、測試和程式碼保存在同一個對話中——而不會用五彩紙屑困擾你——請使用它。Sider 就是這樣做的。 如何將 Claude 作為隊友而不是預言家進行除錯
- 要求差異:「僅使用針對檔案 X 的統一差異做出回應。」
- 對於運行時錯誤,新增最小的可重現程式碼片段,並要求解釋和補丁。
- 對於函式庫錯誤,貼上你認為適用的文件摘錄,並詢問:「這是版本 X 的正確 API 嗎?如果不是,請更新程式碼並引用正確的摘錄。」
目標是讓 Claude 用證據爭論。你帶來證據。
陷阱遊行(以及如何躲避它)
- 「最新」API 陷阱:不要說「使用最新」。說「使用版本 X.Y」並堅持下去。
- 一次性謬誤:計劃兩到三個簡短的改進。它比一個臃腫的提示更快。
- 模糊的錯誤策略:定義狀態代碼和 payload。「返回一個錯誤」毫無意義。
- 未擁有的依賴項:如果程式碼依賴於你無法控制的服務,請對其進行存根。要求偽造品。
你的提示清單(將此貼在你的監視器附近)
如果你滿足所有十個條件,Claude Haiku 4.5 通常會產生準確的程式碼生成,並且能夠經受住考驗。
一個實際的例子:從模糊到驗證
模糊的提示:「編寫一個安全解析 CSV 的函數。」
結果:可能還可以,可能錯誤,肯定未經測試。
精確的提示:
「你正在編寫 Python 3.12。僅輸出帶有檔案名稱的程式碼塊。
建立 csvsafe/init.py 和 csvsafe/reader.py,其中包含一個函數 read_rows(path: Path) -> list[dict[str,str]]。要求:使用 csv.DictReader,newline='' 和 encoding='utf-8';不允許空位元組;拒絕 >10MB 的檔案;將列限制為 100;剝離 BOM;將空儲存格視為空字串;引發帶有訊息代碼 {FILE_TOO_LARGE, NULL_BYTE, TOO_MANY_COLUMNS} 的 ValueError。在 tests/test_reader.py 中包含帶有 pytest 的測試,涵蓋快樂路徑、空位元組、11MB 檔案、101 列和 BOM 處理。提供帶有固定依賴項和黑色配置的 pyproject.toml。」
你會得到程式碼、測試和邊緣處理。然後你運行測試,貼上失敗,並以最小的差異進行迭代。這是在實踐中準確的程式碼生成。
關於「創造力」和其他行銷詞彙
我不需要「有創意」的程式碼。我需要正確的程式碼。將創造力留給為你的貓命名。在提示 Claude 時,創造力是堅實約束的自然副產品。正確的測試和清晰的規範產生優雅的解決方案。錯誤的提示會產生「用表情符號重新發明的 base64」。不要引誘它。
非秘密的秘密
提示 Claude Haiku 4.5 以準確地生成程式碼的方式很乏味:寫下你需要的東西,固定版本,定義架構,要求測試,並通過實際的失敗進行迭代。就這樣。沒有神秘主義。只有工程學科,以及一個可以非常快速地輸入並且不介意編寫十五個幾乎相同的測試案例的模型。
這就是轉折:準確性並不迷人。有效的提示讀起來像 TSA 清單。發布的程式碼讀起來像是人類編寫的,並且很關心。通過將模型視為在明確要求下茁壯成長,在模糊方向下枯萎的初級工程師,你可以同時獲得這兩者。給它一份契約。讓它通過測試。然後,也許,你可以信任它——以你給工具的信任,而不是先知的信任。
結論:減少巫術,增加保證
如果你想要巫術,那就去看魔術表演。如果你想要可以編譯和行為的軟體,請編寫像保證一樣運作的提示。如何提示 Claude Haiku 4.5 以準確地生成程式碼不是關於華麗的措辭或秘密關鍵字。它是關於約束、測試、版本和反饋迴圈。做到這四件事,你就會得到可以運行的程式碼。跳過它們,你會得到格式精美的虛構作品。
程式碼不關心你的感覺。 謝天謝地,測試也不關心。
常見問題解答
Q1:如何以最簡單的方式提示 Claude Haiku 4.5 產生精確的程式碼?
將其視為合約:固定版本、定義結構描述、指定錯誤格式,並首先要求進行測試。 約束越明確,程式碼就越準確。
Q2:當 Claude 編寫程式碼時,我該如何減少幻覺?
貼上權威文件或規格,並要求遵守這些確切的 API。 對於私有端點,請包含您自己的規格——不要期望它去猜測。
Q3:我應該要求 Claude 進行測試還是自己編寫測試?
首先要求 Claude 產生測試,然後實作程式碼來滿足這些測試。 測試比形容詞更能定義準確性,並使模型保持誠實。
Q4:在提示中,版本鎖定應該有多具體?
非常具體:語言執行時期、框架主版本/次版本和 SDK 版本。 「最新」會產生衝突模式; 準確性取決於穩定的目標。
Q5:Sider.AI 如何融入提示以獲得準確的程式碼?
使用 Sider.AI 將規格、程式碼、差異和測試日誌保持在一個迴圈中。 它不會變魔術——它只是保留上下文,以便 Claude 的修復可以追蹤您的實際失敗。