整理一下與總結重點介紹在軟體開發中使用 AI 程式碼生成和提示工程的主要主題、重要概念和實用建議。
主要主題
因為太多資料都在描述不同的方向,這邊描述對於 vibe coding 和 prompt engineering 的過程中給予大家的方向,主要圍繞以下幾個核心主題:
- Prompt engineering 重要性:強調精心設計的提示對於從 AI 模型獲得高品質、相關和可操作程式碼輸出的關鍵作用。
- AI 輔助開發工作流程:概述了軟體工程師如何將 AI 工具無縫整合到他們的日常開發任務中,從綠地專案到現有程式碼庫的增量修改。
- 程式碼生成與 Vibe Coding:定義並區分了 AI 程式碼生成中的不同參與程度,從 AI 作為「副駕駛」到「Vibe Coding」中的 AI 作為「飛行員」。
- 最佳實踐與技巧:提供了一系列實用的策略,用於優化與 AI 模型的互動,包括情境提供、任務分解、錯誤處理和程式碼審查。
- 工具與資源:列出了當前市場上可用的各種 AI 程式碼生成工具,以及有影響力的開發人員和額外學習資源。
- 挑戰與考量:討論了使用 AI 程式碼生成時的潛在陷阱,例如幻覺、速率限制、上下文管理以及協作工作流程的缺乏。
核心概念與事實
1. 提示工程的重要性與基礎
- 定義:提示工程被定義為從 AI 編碼助手獲取最佳輸出的關鍵技能,因為「AI 的輸出品質在很大程度上取決於您提供的提示品質。」 (Addy Osmani, "The Prompt Engineering Playbook for Programmers")。
- 連續改進:提示工程是一個持續改進的迭代過程。「提示工程是關於持續改進。您需要建立和測試不同的提示,分析和記錄結果,根據模型的表現調整您的提示,並不斷實驗,直到您獲得所需的結果。」 (Lee Boonstra, "Documenting Your Prompts a Best Practice for Success")。
- 文件記錄:記錄提示被認為是「絕對的救命稻草」 (Lee Boonstra)。建議使用工具(如 Google Sheet)追蹤提示及其輸出、模型版本和設定。「這樣,當您需要重新審視舊工作、測試提示在新模型版本上的表現或解決問題時,您將擁有完整的歷史記錄。」 (Lee Boonstra)。對於 RAG 系統,還應記錄 RAG 設定。
- 程式碼整合:一旦提示接近完美,應將其儲存在專案程式碼庫中獨立的檔案中,並依靠自動化測試和評估程序來理解提示的通用性。 (Lee Boonstra)。
2. AI 輔助編碼工作流程
- AI 作為副駕駛 vs. AI 作為飛行員 (Vibe Coding):
- AI 作為副駕駛:「您使用 AI 模型來增強自己,提升您的生產力。」 (automata/aicodeguide, "AI Code Guide is a roadmap to start coding with AI"),例如腦力激盪或自動完成文件字串。
- AI 作為飛行員 (Vibe Coding):「您是副駕駛。這是『Vibe Coding』發生的地方。您開啟 Cursor Agent YOLO 模式,並相信代理所做的一切都會為您生成程式碼。」 (automata/aicodeguide)。這對於快速原型設計很有幫助,但對於複雜專案應謹慎使用。
Harper Reed 的工作流程 (Harper Reed, "My LLM codegen workflow atm"):
- 第 1 步:構思完善:使用對話式 LLM(如 ChatGPT 4o/o3)透過一次一個問題的迭代過程完善想法,最終輸出詳細的規範文件(spec.md)。
- 第 2 步:規劃:將規範傳遞給推理模型,產生詳細的、逐步的藍圖,將專案分解為小的、可疊代的部分,並創建一個可核對的 todo.md 清單。這一步強調測試驅動開發 (TDD) 方法。
第 3 步:執行:使用程式碼生成工具(如 Claude 或 Aider)逐步執行提示計畫。此步驟強調將程式碼複製貼上到 IDE 中、運行測試並反覆調試。
現有程式碼庫的迭代:對於非綠地專案,重點放在每個任務的規劃上。使用像 repomix 或 files-to-prompt 這樣的工具將相關的原始碼有效率地納入 LLM 的上下文,以便進行程式碼審查、問題生成或測試補充。(Harper Reed)。
專案範圍規則:
可以透過將規則或約定注入 LLM 的上下文來為專案定義規則。例如,在 Cursor 中,在 .cursor/rules/ 資料夾中建立 markdown 檔案;在 Aider 中,在 .aider.conf.yml 中設定 read: rules.md。(automata/aicodeguide)。這些規則可以包含技術棧或程式碼格式指南。
3. 提示工程的實用技巧與模式
- 提供豐富的上下文:「始終假設 AI 對您的專案一無所知,除了您提供或包含在上下文中的內容。」 (Addy Osmani)。這包括程式語言、框架、函式、錯誤訊息以及程式碼的預期行為。
- 具體說明目標或問題:「模糊的查詢會導致模糊的答案。」 (Addy Osmani)。清晰地闡明您需要的洞察力或您希望 AI 執行的特定任務(例如,特定的優化類型)。
- 分解複雜任務:「當實施新功能或解決多步驟問題時,不要將整個問題一次性輸入一個巨大的提示。」 (Addy Osmani)。將工作分成更小的塊並疊代,一次處理一個步驟。
- 包含輸入/輸出或預期行為範例:「如果您可以用範例說明您想要什麼,請這樣做。」 (Addy Osmani)。這種「少數樣本提示 (few-shot prompting)」有助於 AI 理解您的意圖並減少歧義。
- 利用角色或角色:「要求 AI 『充當』某個角色或角色。這可以影響答案的風格和深度。」 (Addy Osmani)。例如,「充當高級 React 開發人員並審查我的程式碼。」
- 疊代和完善對話:提示工程是一個互動過程。「AI 會記住聊天會話中的上下文,因此您可以逐步引導它實現所需的結果。」 (Addy Osmani)。
- 保持程式碼清晰和一致:即使在 AI 參與之前,也要編寫清晰、結構良好的程式碼和註釋,因為 AI 會從您的程式碼和註釋中獲取線索。(Addy Osmani)。
4. 特定場景下的提示模式
重複測試:
- 清楚描述問題和症狀,包括精確的錯誤訊息和預期行為。
- 對於棘手的錯誤,使用逐步或逐行的方法讓 AI 追蹤程式碼的執行。
- 在可能的情況下提供最小的可重現範例。
- 提出重點問題和後續問題。
- 良好提示範例:
- 「我有一個 JavaScript 函數 mapUsersById,它應該將使用者物件陣列轉換為以使用者 ID 為鍵的映射(物件)。但是,當我運行它時,它會拋出錯誤。例如,當我傳遞 [{id: 1, name: "Alice"}] 時,我得到 TypeError: Cannot read property 'id' of undefined。這是函數程式碼:[程式碼]。它應該返回 {"1": {id: 1, name: "Alice"}}。錯誤是什麼以及如何修復它?」
重構與優化:
- 明確說明您的重構目標(例如,提高可讀性、減少複雜性、優化性能)。
- 提供必要的程式碼上下文,包括語言、框架和版本詳細資訊。
- 鼓勵 AI 除了程式碼之外還提供解釋。
- 使用角色扮演來設定高標準(例如,「充當經驗豐富的 TypeScript 專家」)。
良好提示範例:「重構上述 getCombinedData 函數以消除重複程式碼並提高性能。具體來說:(1) 避免重複使用者和訂單的獲取邏輯——也許使用輔助函數或同時獲取它們。(2) 如果可能,並行獲取兩個列表。(3) 保留每次獲取的錯誤處理(我們想知道哪個呼叫失敗)。(4) 改善數據組合,可能透過使用更有效的查找結構而不是巢狀循環。提供帶有解釋更改的重構程式碼。」
實現新功能:
從高層次指令開始,然後深入細節。
提供相關上下文或參考程式碼。
使用註釋和 TODO 作為內聯提示(特別是對於像 Copilot 這樣的 IDE 工具)。
提供預期輸入/輸出或使用範例。
如果結果不符合預期,請使用更多細節或約束重寫提示。
可以讓 AI 腳手架結構,然後由您填寫具體細節。
要求處理邊緣案例。
利用文件驅動開發:先編寫文件字串或使用範例,然後讓 AI 實現該功能。
研究程式碼實際的提示
- 通用問題:
- 「此程式碼做什麼?」
- 「xyz 函數做什麼?」
- 「您在這些檔案中看到哪些設計模式?」
- 「這如何改進?」 (r/ChatGPTCoding, "what prompts are useful for studying a code base")。
- 高級分析:請求架構圖、序列圖、資料流圖、呼叫圖和依賴圖
- 專案規格模板:一個廣泛的模板,用於指導 AI 創建包含專案概覽、功能和非功能需求、約束、偽程式碼、使用者故事、流程圖、庫和依賴項、技術規格、測試和驗證、部署和維護以及使用者文件等的綜合軟體設計和規格文件。
- 上下文管理工具:像 1filellm、code-prompter、16x Prompt、repomix 和 files-to-prompt 這樣的工具可以幫助將程式碼庫打包成單一檔案或選定的部分,以便 LLM 進行分析,解決大型程式碼庫的 token 限制問題。
常見的模式與避免
- 模糊的提示:不提供足夠的細節或上下文。修復:添加上下文和具體細節,確保提示只適用於您的特定場景。
- 過載的提示:一次要求 AI 做太多事情。修復:分解任務,一次只做一件事。
- 缺少問題:提供大量資訊但沒有明確的問題或指令。修復:始終包含明確的要求,例如「識別上述程式碼中的任何錯誤」。
- 模糊的成功標準:要求優化或改進,但沒有定義成功是什麼樣子。修復:量化或限定改進(例如,「優化此函數使其在線性時間內運行」)。
- 忽略 AI 的澄清或輸出:不回應 AI 的問題或當輸出明顯錯誤時不調整提示。修復:始終回答 AI 的問題並在必要時調整您的措辭。將其視為對話。
- 風格或不一致的變化:在一個提示中不斷改變請求方式或混合不同的格式。修復:在一個提示中保持一致的風格,並清晰地標記程式碼塊和範例。
- 模糊的引用:當對話很長時,使用「上述程式碼」等模糊引用。修復:重新引用程式碼或明確命名您希望重構的函數,以避免混淆。
工具與資源
- 編輯器/IDE:Cursor、Windsurf、Cline、OpenHands、Devin、VSCode + GitHub Copilot、Amp。
- CLI 工具:Claude Code、Aider、Claude Engineer、Roo Code、OpenAI Codex CLI、Codebuff、opencode、Gemini CLI。
- Webapps:Bolt、v0、Replit、Lovable、Firebase Studio。
- 後台/遠端代理:ZenCoder、CodeRabbit、Factory AI、OpenAI Codex。
- 輔助工具:Specstory、Claude Task Master、CodeGuide、repomix、files-to-prompt、repo2txt、stakgraph、Repo Prompt、Uzi、Claudia。
- 模型推薦:OpenRouter 的模型,特別是支援「工具」的「程式設計」類別模型,以及 Aider 的 LLM 排行榜被推薦用於選擇模型。(automata/aicodeguide)。
- 速率限制:為不同的模型準備多個 API 密鑰,並檢查各供應商的速率限制頁面,因為它們可能差異很大。(automata/aicodeguide)。
結論
將 AI 整合到軟體開發中不僅僅是使用工具,而是掌握提示工程的藝術和科學。透過採取結構化、迭代和上下文豐富的方法,開發人員可以將 AI 程式碼助手轉變為強大而可靠的合作夥伴。這包括細緻的規劃、清晰的溝通、持續的測試以及隨時調整和完善提示的能力。
隨著 AI 技術的快速發展,保持最新狀態並實驗新技術對於最大限度地發揮其在提高生產力、程式碼品質和開發人員學習方面的潛力至關重要。
工商服務時間
諮詢聯繫
如果你對於自動化,如何建立好的產品和自動化流程有興趣,歡迎與我們聊聊產品方向策略、流程優化與 AI 工具導入方式,我們團隊很樂意協助!
歡迎直接聯絡我,或者來信,
📩 信箱位置 👉 service@cympotekc.om
👉製造供應鏈平台,https://www.cympack.com/
👉信集界科技,https://www.cympotek.com/
社群活動
如果你看完這篇文章,也開始對「怎麼用 AI 幫你加速、放大你的想法」感到興趣,那你絕對不能錯過這場活動👇
🎤 🐻 Coding Bear 台北場|來聊什麼是 Vibe Coding 台北場
我們將深入分享如何結合 AI 與程式、創意、內容製作,
讓你用最自然的方式,讓 AI 成為你的工作室助手。
📅 時間:7/25(五)18:30
👉 報名連結:https://codingbear.kktix.cc/events/ai-vibe-coding-2025-07-taipei
天南地北來亂聊,從設計、內容到自動化,無論你是創作者還是開發者,這場講座也許會有實用又有趣的靈感(吧)。來聊聊 AI 怎麼幫你少做一點雜事、多做一點你真的想做的事吧!
留言
張貼留言