
明天屬於那些今天就勇於接受的人
如何利用ChatGPT編寫代碼 – 以及我最喜歡的調試技巧
AI可以編寫有用的代碼,但有時也會產生無法使用的垃圾代碼。這裡是我在編程過程中多次冒險後的建議,幫助你充分利用AI。
我第一次測試ChatGPT的編碼能力是在2023年,當時我請它為我妻子的網站編寫一個WordPress插件。結果ChatGPT做得相當不錯,但那是一個簡單的項目。
那麼,如何將ChatGPT融入到你的日常編碼實踐中呢?以下是一些簡要總結:
1. ChatGPT能夠生成有用和無用的代碼。為了獲得最佳結果,提供清晰和詳細的提示是關鍵。
2. ChatGPT在協助特定編碼任務或例程方面表現出色,而不是從零開始構建完整的應用程序。
3. 使用ChatGPT來查找和選擇適合特定用途的編碼庫,並進行互動討論以縮小選擇範圍。
4. 小心AI生成代碼的所有權,並始終檢查代碼的可靠性。不要盲目信任生成的輸出。
5. 將與ChatGPT的互動視為對話。根據AI的回應不斷完善你的問題,以更接近期望的輸出。
現在,讓我們深入探討ChatGPT的編碼能力。
ChatGPT擅長的編碼類型
有兩個關於ChatGPT編碼的重要事實。首先,AI可以編寫有用的代碼。其次,AI有時可能完全迷失方向,產生無法使用的垃圾代碼。
這一點我親身體驗過。在為我妻子完成WordPress插件後,我決定看看ChatGPT能做到什麼程度。於是,我為一個Mac應用程序寫了一個非常仔細的提示,包括用戶界面元素、交互、設置的內容及其運作方式等詳細描述。然後,我將該提示輸入給ChatGPT。
ChatGPT回應了大量的文本和代碼,但在代碼中途停止了。當我請求它繼續時,它又吐出了更多的代碼和文本。經過多次請求,生成的代碼卻沒有一個是可用的。AI未能確定代碼應放置的位置、如何構建項目,並且在仔細查看生成的代碼後,發現它遺漏了我要求的主要操作,留下了簡單的文本描述,標註“程序邏輯在這裡”。
經過多次測試,我意識到,如果你要求ChatGPT交付一個完整的應用程序,這個工具將會失敗。如果你對編碼一無所知並希望ChatGPT建造某個東西,它也會失敗。
ChatGPT的成功之處在於幫助那些已經懂得編碼的人完成特定例程和任務。不要要求它為你編寫一個在菜單欄上運行的應用程序,但如果你請ChatGPT提供一個將菜單放置在菜單欄上的例程,然後將其粘貼到你的項目中,這個工具會做得相當不錯。
另外,要記住,儘管ChatGPT看起來擁有大量領域專業知識(而且通常確實如此),但它缺乏智慧。因此,這個工具也許能寫出代碼,但無法寫出包含特定或複雜問題所需的深層經驗的代碼。
如何使用ChatGPT編寫代碼
1. **縮小和明確你的請求**
首先決定你想請ChatGPT做什麼,但暫時不要問它任何問題。確定你希望功能或例程完成的任務,或者你想學習如何將其納入代碼中。決定你將傳遞給代碼的參數以及想要獲得的結果,然後考慮如何描述。
例如,如果我想總結任何網頁,我希望把這篇文章輸入AI,並得到一個合適的總結。作為我的輸入,我將指定一個網頁URL,作為輸出,我希望得到一段文字的總結。
2. **利用ChatGPT探索庫和資源**
繼續上述例子,舊式的提取網頁數據的方式是找到HTML段落標籤之間的文本。然而,隨著AI工具的興起,你可以使用AI庫進行智能提取和總結。ChatGPT在尋找庫和資源方面表現出色(這也是一個可以輕鬆驗證以避免其權威但錯誤的行為模式的領域)。
我開始使用提示來獲取哪些庫提供所需的功能。對於那些不熟悉編程的人來說,庫是一組可供程序員訪問的代碼,能夠為特定目的完成大量繁重的工作。現代編程的一個重要部分是找到並選擇合適的庫,所以這是一個良好的起點。
在這種情況下,我正在尋找其他人編寫的代碼塊來總結文本。我給出的第一個提示是:
描述十個不同的開源AI庫(以及它們適用的語言),我可以用來生成任何網頁的主要內容摘要,忽略廣告或嵌入材料。
這個提示正好給了我我想要的,包括提到OpenAI的產品。我認為OpenAI在這方面會做得很好,但對於這個假設性的項目,我不想預算API費用。於是,我將問題縮小:
這些庫中有沒有免費的?
ChatGPT的回答是:“是的,這十個AI庫都是開源且免費使用的。然而,其中一些可能有使用限制或需要為訪問額外功能或資源付費。”所以,根據這個回答,我進一步澄清我的查詢:
這些庫中哪些沒有使用限制且不需要額外的付款或許可?
注意,這實際上是一種對話。我不需要重新問原始問題,只是像與專家交流一樣逐步深入。這一次,ChatGPT給了我八個庫的選擇,但沒有提到我計劃用來編碼的PHP語言。於是,我給出了下一個提示:
在這八個庫中,有沒有可以與PHP一起使用的?
它返回了三個庫,但我不確定每個庫的功能。所以,我又問了一個問題:
Sumy、Gensim和NLTK之間有什麼區別?
我仍然不確定,所以我澄清了我的使用計劃,然後問:
如果我想創建網頁新聞文章的摘要,哪個庫會更好?
答案清晰且令人鼓舞:“Sumy專門設計用於文本摘要,這是創建一個摘要以捕捉文本中最重要信息的任務。”所以,現在是時候看看如何在PHP中使用Sumy了。我問了我的最後一個問題:
你能解釋一下如何從PHP中使用Sumy嗎?
隨便你在電腦上試試,將這些提示輸入到ChatGPT中。請注意,在第一步中,我確定了要獲得幫助的程序模塊。然後,在這一步中,我與ChatGPT進行了對話,以決定使用哪個庫以及如何將其集成到我的項目中。
這種方法可能看起來不像編程,但我可以保證這是編程。編程不僅僅是將代碼行寫到頁面上。編程是弄清楚如何集成所有不同的資源和系統,以及如何與解決方案的所有組件交互。在這裡,ChatGPT幫助我進行了這種集成分析。
3. **請ChatGPT編寫示例代碼**
現在先暫停一下。這篇文章的標題是“如何使用ChatGPT編寫代碼”。它會這樣做,但我們實際上是在請ChatGPT編寫示例代碼。
讓我們明確一下。除非你正在編寫一個小功能(就像ChatGPT為我妻子寫的那個行排序/隨機化的功能),否則ChatGPT無法編寫你的最終代碼。首先,你需要維護它。ChatGPT在修改已經寫好的代碼方面非常糟糕。糟糕得是,它根本無法做到這一點。因此,要獲得新代碼,你必須請ChatGPT生成一些新的東西。正如我之前所發現的,即使你的提示幾乎相同,ChatGPT也可能會意外改變它給你的內容。
因此,總結一下:ChatGPT無法維護你的代碼,甚至無法對其進行調整。
這一限制意味著你必須自己動手。正如我們所知,代碼的第一個草稿通常不是最終代碼。因此,即使你希望ChatGPT生成最終代碼,它也只會是一個起點,而你需要將其完成,將其集成到更大的項目中,進行測試、調整、調試等等。
但這個問題並不意味著示例代碼毫無價值——遠非如此。讓我們看看我基於之前描述的項目所寫的提示。以下是第一部分:
編寫一個名為summarize_article的PHP函數。
作為輸入,summarize_article將接收指向ZDNET.com或Reuters.com等新聞網站文章的URL。
我告訴ChatGPT應該使用的編程語言。我還告訴AI輸入內容,並提供兩個網站作為範例以幫助ChatGPT理解文章風格。老實說,我不確定ChatGPT是否忽略了這部分指導。接下來,我將告訴它如何完成大部分工作:
在summarize_article內部,檢索提供的URL中網頁的內容。使用PHP中的Sumy庫及任何其他必要的庫,提取文章的主要內容,忽略任何廣告或嵌入材料,並將其總結為約50個單詞。確保摘要由完整的句子組成。如有必要,可以超過50個單詞以完成最後一句。
這種方法與我如何指導員工非常相似。我希望那個人知道他們不僅限於Sumy。如果他們需要其他工具,我希望他們使用它。
一旦處理完成,編寫summarize_article使其以純文本形式返回摘要。
最終生成的代碼相當簡單。ChatGPT調用了另一個庫(Goose)來檢索文章內容。然後,它將該摘要傳遞給Sumy,並限制為50個單詞,然後返回結果。
有一個有趣的觀察點。當我在2023年初進行這次測試時,ChatGPT創建了一個對其編寫的例程的示例調用,使用的是2021年之後的URL。當時,在2023年3月,ChatGPT的數據集僅到2021年。現在,ChatGPT的知識庫延伸到2024年6月底,並且可以搜索網絡。但我的重點是,ChatGPT編造了一個它不可能知道的示例鏈接:
https://www.reuters.com/business/retail-consumer/teslas-musk-says-fremont-california-factory-may-be-sold-chip-shortage-bites-2022-03-18/
我檢查了該URL與路透社網站和Wayback Machine的比對,發現它並不存在。永遠不要假設ChatGPT是準確的。始終檢查它給你的所有內容。
4. **調試和完善生成的代碼**
我向你展示了幾種ChatGPT出錯或產生幻覺的方式。所有程序員都會犯錯,包括AI程序員。
但你可以做幾件事情來幫助完善代碼,調試問題,並預測可能出現的錯誤。我的新AI增強技巧是將代碼輸入到另一個ChatGPT會話(或完全不同的聊天機器人)中,並詢問:“這段代碼有什麼問題?”
最終,總會有一些問題出現。AI有時會識別應該添加到代碼中的邊緣情況或錯誤檢查,或者在不太可能的事件發生時可能會破壞的情況。然後,我便在這些錯誤條件周圍編碼,讓代碼變得更加穩健。
常見問題
ChatGPT會取代程序員嗎?
現在不會——或者至少——目前不會。ChatGPT的編程水平相當於一個有才華的第一年編程學生,但它懶惰(就像那個第一年學生)。這個工具可能減少對初級程序員的需求。
然而,在目前的水平上,我認為AI會讓初級程序員(甚至更有經驗的程序員)更容易編寫代碼和查找信息。它是一個節省時間的工具,但AI本身無法獨立完成許多編程任務——至少現在不行。2030年呢?誰知道。
如何在ChatGPT中獲得編碼答案?
只需問它。你已經看到我如何使用互動對話來縮小答案的範圍。不要期待一個問題就能神奇地完成所有工作。但將AI作為助手和資源,這樣你會得到很多有用的信息。
當然,要測試這些信息——因為正如OpenAI的聯合創始人約翰·舒爾曼所說:“我們最大的擔憂在於事實性,因為模型喜歡編造事物。”
ChatGPT生成的代碼保證沒有錯誤嗎?
當然不!但你也不能信任人類程序員編寫的代碼。我當然不信任我寫的任何代碼。代碼在編寫過程中出現的缺陷是驚人的。總是會有錯誤。在發布之前,你需要不斷測試、測試和再測試。然後,與幾個選定的測試者進行Alpha測試。然後,與更廣泛的用戶社區進行Beta測試。
即使在所有這些工作之後,也會有錯誤。僅僅因為一個AI在編程這件事上玩得開心,並不意味著它能生成沒有錯誤的代碼。不要信任,始終驗證。即便如此,你仍然不會得到完全無錯誤的輸出。這就是宇宙的本質。
如果我得到的代碼是錯誤的,我該怎麼辦?
我建議將聊天機器人視為一個稍微不合作的學生或下屬。你會怎麼做,如果那個人給你回來的代碼無法運行?你會讓他們重新去做一次,並指示他們做好。這正是你應該對待ChatGPT的方式(我已經在ChatGPT 4和4o上測試過)。當事情無法正常工作時,我會說:“這不行。請再試一次。”
AI通常會給我不同的變體來解決同一問題。我有時會重複這個過程四到五次,直到我得到了可行的答案。然而,有時AI會耗盡創意。其他時候,重試的答案與你請求的完全(我真的意味著完全)無關。
當你意識到AI在保持理智方面達到了極限時,就必須親自編碼了。但在10次中,有9次,尤其是在基本編碼或界面編寫挑戰中,AI都能成功完成任務。
當我請ChatGPT幫助解決編程問題時,我的描述應多詳細?
詳細。你留給解釋的空間越多,AI就越可能偏離正題。當我給ChatGPT提供編程幫助的提示時,我會想像自己是在給一個學生或工作人員分配編程任務。
我是否給了那個人足夠的詳細信息來創建第一個草稿,還是我太模糊,讓他們更可能提出問題或提交與我想要的完全無關的東西?在這方面不要懶惰。ChatGPT可以為你節省數小時甚至數天的編程時間(對我來說確實如此),但前提是你提供有用的指示。
如果我使用ChatGPT編寫代碼,誰擁有它?
實際上,目前還沒有很多案例法來回答這個問題。美國、加拿大和英國要求某些版權作品必須由人類創作,因此AI工具生成的代碼可能無法享有版權。此外,還存在基於訓練代碼來源和生成代碼使用情況的責任問題。
ZDNET對此進行了深入研究,並與法律專家進行了交談,產生了三篇文章。如果你對這個問題感到擔憂(如果你使用AI來幫助代碼,這是應該的),我建議你閱讀這些文章:
– 誰擁有代碼?如果ChatGPT的AI幫助編寫你的應用程序,它仍然屬於你嗎?
– 如果你使用AI生成的代碼,你的責任風險有多大?
– 一個棘手的問題:誰擁有AI生成的代碼、圖像和敘事?
ChatGPT會了解哪些編程語言?
答案是大多數語言。我測試了常見的現代語言,如PHP、Python、Java、Kotlin、Swift、C#等。但隨後我讓這個工具在一些冷門的古老語言,如COBOL、Fortran、Forth、LISP、ALGOL、RPG(報告程序生成器,而不是角色扮演遊戲)甚至IBM/360組合語言中編寫代碼。
作為點睛之筆,我給它這個提示:
在PDP 8/e的前面板上顯示“Hello, world”的ASCII閃爍燈光序列。
PDP 8/e是我第一台電腦,ChatGPT給了我使用前面板開關進行編程的指示。我感到驚喜、興奮,還有些驚恐。
ChatGPT能幫助我進行數據分析和可視化任務嗎?
是的,很多工作可以不需要代碼完成。查看我有關此主題的完整文章:《我意識到ChatGPT Plus對我的業務是遊戲改變者的那一刻》。
我還寫了一篇有關生成圖表和表格的文章:《如何使用ChatGPT生成圖表和表格》。
但有趣的是,在上述文章中,我請ChatGPT Plus:“製作一個世界上前五個人口最多城市的柱狀圖。”它做到了。但如果你想要代碼,可以試著問:
在Swift中製作一個世界上前五個人口最多城市的柱狀圖。從網上提取人口數據。確保包括任何必要的庫。
通過添加“在Swift中”,你指定了編程語言。通過指定數據來源並強迫ChatGPT Plus包括庫,AI帶入了程序所需的其他資源。這就是為什麼,根本上,使用AI的幫助進行編程需要你對編程有一定的了解。但如果你知道,那就太好了,因為三句話就能為你獲得一段註釋過的代碼。很棒吧?
ChatGPT如何處理方言和實現之間的差異?
我們目前沒有來自OpenAI的具體細節,但我們對ChatGPT訓練方式的理解可以提供一些見解。請記住,編程語言的方言和實現(及其小特性)變化的速度遠快於整個語言。這一現實使得ChatGPT(以及許多編程專業人士)更難跟上。
因此,我將基於這兩個假設進行工作:
1. 方言變更越新,ChatGPT知道的可能性就越小;
2. 語言越流行,則它學到的訓練數據越多,因此準確性會越高。
總結:ChatGPT可以是一個有用的工具。只是不必賦予它超能力。
以上文章由特價GPT API KEY所翻譯及撰寫。而圖片則由FLUX根據內容自動生成。