當(dāng)我開始使用 GitHub Copilot 和其他生成式的 AI tools。我感覺到沮喪,因?yàn)槲覜]有收到預(yù)期的結(jié)果。人們是如何感覺這些工具如此成功的?為什么 AI 工具沒有按照我的意愿行事?例如,我讓 GitHub Copilot 為我去解決 LeetCode 問題。GitHub Copilot 圖標(biāo)會旋轉(zhuǎn)一表示它正在思考,然后我會收到不一致的建議或跟沒本沒有建議。我很生氣,但是事實(shí)證明——我錯(cuò)了!經(jīng)過更多實(shí)驗(yàn),我提升了跟 GitHub Copilot 的溝通方法,通過以注釋和代碼的的形式提供上下文、例子和清晰的指令。后來我才知道,這種做法叫做 prompt engineering。在這篇博文中,將討論充分利用 GitHub Copilot 的重要技巧。
首先,讓我們從不熟悉 GitHub Copilot 或 prompt engineering 的人的基礎(chǔ)知識開始。
什么是 GitHub Copilot ?
GitHub Copilot 是一個(gè) AI 結(jié)對開發(fā)工程師被 GitHub 開發(fā)并且 GitHub Copilot 由 OpenAI Codex 提供支持,OpenAI CodeX 是 OpenAI 創(chuàng)建生成式預(yù)訓(xùn)練語言模型。它根據(jù)注釋和代碼的上下文提供上下文話的代碼建議。要使用它,可以在以下 IDEs 安裝 Github Copilot 插件:
-
Visual Studio
-
Visual Studio Code
-
Neovim
-
JetBrains IDEs (IntelliJ, PyCharm, WebStorm, etc)
GitHub Copilot 可以自己編碼嗎?
在 GitHub,使用術(shù)語「AI 結(jié)對開發(fā)程序員」、「AI 助手」和 「Copilot」因?yàn)闆]有開發(fā)人員,這個(gè)工具就無法工作!事實(shí)上,人工智能系統(tǒng)只能執(zhí)行開發(fā)人員編程執(zhí)行的任務(wù),它們不具備自由意志或獨(dú)立決策的能力。在這種情況下,GitHub Copilot 利用代碼中的上下文和編寫的注釋來立刻建議代碼!借助 GitHub Copilot,可以將注釋轉(zhuǎn)換為代碼、自動(dòng)填充重復(fù)的代碼并顯示可選建議。
GitHub Copilot 的底層是如何工作的?
在底層,GitHub Copilot 從注釋和代碼中抽取上下文,生成逐行建議和整個(gè)函數(shù)。OpenAI CodeX 是一種機(jī)器學(xué)習(xí)模型,可以將自然語言轉(zhuǎn)換為代碼,為 GitHub Copilot 提供支持。
什么是 prompt engineering?
Prompt engineering 是給 AI 模型提供特定指令去產(chǎn)生想要結(jié)果的一種實(shí)踐。提示是可以觸發(fā) AI 模型響應(yīng)的一系列文本或一行代碼??梢詫⑦@個(gè)概念比作收到論文提示??赡軙盏揭粋€(gè)提示,要求寫一篇關(guān)于克服挑戰(zhàn)的經(jīng)歷的文章,或者寫一本經(jīng)典書籍,例如《了不起的蓋茨比》。因此,可以根據(jù)所學(xué)內(nèi)容對提示做出響應(yīng)。大型語言模型或 LLM 的表現(xiàn)與此類似。
這是 prompt engineering 的另一個(gè)例子
當(dāng)學(xué)習(xí)編程時(shí),我曾參加過一項(xiàng)活動(dòng),向機(jī)器人指示如何制作三明治。這是一項(xiàng)有趣兒愚蠢的活動(dòng),它教會我:
-
計(jì)算機(jī)只能做你告訴他們做的事情
-
你的指示需要非常具體
-
它們更擅長一步一步接受訂單
-
算法只是一系列指令
例如,如果告訴機(jī)器人去制作三明治,我需要告訴它:
-
打開面包袋
-
從袋子中取出兩片面包
-
將面包并排放在柜臺上
-
用黃油刀將花生醬涂在一片面包上
-
等等
如果沒有這些明確的指令,機(jī)器人可能會做一些愚蠢的事情,例如在兩片面包上涂花生醬,或者它可能根本不做任何事情。機(jī)器人不知道三明治是什么,也不知道如何制作三明治。它只知道遵循指示。
與此類似,GitHub Copilot 需要清晰的分步說明來生成最有幫助的代碼。
接下來,讓我們討論 prompt engineering 的最佳實(shí)踐,以便向 GitHub Copilot 提供清晰的指令并生成想要的結(jié)果。
使用 GitHub Copilot 進(jìn)行 prompt engineering 的最佳實(shí)踐
提供高級上下文,然后提供更詳細(xì)的說明
對我來說最好的技巧是在文件頂部的注釋中提供高級上下文,然后以注釋和代碼的形式提供更詳細(xì)的說明。
例如,如果構(gòu)建一個(gè)待辦事項(xiàng)的應(yīng)用程序。在頂部,我會注釋寫到:「使用 Next.js 構(gòu)建一個(gè)待辦事項(xiàng)應(yīng)用程序,允許用戶添加、編輯和刪除待辦事項(xiàng)」。然后在下面幾行中,將會編寫一條注釋來創(chuàng)建:
-
待辦事項(xiàng)組件列表,讓 GitHub Copilot 在評論下方生成該組件。
-
按鈕組件,讓 GitHub Copilot 在評論下方生成該組件。
-
輸入組件,讓 GitHub Copilot 在評論下方生成該組件。
-
添加函數(shù),讓 GitHub Copilot 在評論下方生成該函數(shù)。
-
編輯函數(shù),讓 GitHub Copilot 在評論下方生成該函數(shù)。
-
刪除函數(shù),讓 GitHub Copilot 在評論下方生成該函數(shù)。
-
等等
以下是使用上述技術(shù)讓 p5.js 建造房屋的示例:
在下面的 GIF 中,在頂部寫了一條注釋,概括性描述了希望 p5.js 繪制的內(nèi)容。我想畫一座白色的房子,有棕色的屋頂、紅色的門和紅色的煙囪。然后,為房子的每個(gè)元素編寫注釋,然后讓 GitHub Copilot 為每個(gè)元素生成代碼。
提供具體細(xì)節(jié)
當(dāng)你提供具體詳細(xì)信息時(shí),GitHub Copilot 將可以生成更準(zhǔn)確的代碼建議。例如如果你想要 GitHub Copilot 從 API 查詢數(shù)據(jù),需要告訴它你想要查詢的數(shù)據(jù)類型、如何處理數(shù)據(jù)和希望訪問的 API endpoint。
這是一個(gè)沒有指定具體信息的注釋,GitHub Copilot 不太可能生成有用的建議:
// Get data from API
function getData() {
//code goes here
}
在上面的例子中,GitHub Copilot 除了函數(shù)名以及左右括號之外,沒有產(chǎn)生任何內(nèi)容。
這是一個(gè)指定具體信息的注釋,GitHub Copilot 更有可能生成有用的建議:
// Pass in user ids and retrieve user data from jsonplaceholder.typicode.com API, then return it as a JSON object
async function getUserData(userId) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);
const data = await response.json();
return data;
}
提供例子
除了告訴 GitHub Copilot 想要它做什么之外,還可以提供你喜歡的編碼風(fēng)格的例子來向其展示希望它做什么。雖然 GitHub Copilot 使用的 AI 模型已經(jīng)接受過大量數(shù)據(jù)的訓(xùn)練,但向 GitHub Copilot 提供示例可以幫助其理解特定代碼片段的上下文和約束。向人工智能模型展示希望它們做什么的示例是機(jī)器學(xué)習(xí)中的常見做法。
以下是工程師用來訓(xùn)練人工智能模型的一些方法:
-
零樣本學(xué)習(xí)(Zero-shot learning)
-
單樣本學(xué)習(xí)(One-shot learning)
-
少樣本學(xué)習(xí)(Few-shot learning)
我要求 ChatGPT 像我 5 歲的時(shí)候一樣想我解釋這些方法之間的區(qū)別,以下是它給我的內(nèi)容:
零樣本學(xué)習(xí)
這就像當(dāng)你看到一個(gè)以前從未見過的新玩具,但你知道它是什么,因?yàn)樗雌饋硐衲阋娺^的其他玩具。例如,如果你見過許多不同種類的毛絨動(dòng)物,即使你以前從未見過這種動(dòng)物,你也能夠認(rèn)出一種新的動(dòng)物。類似的,計(jì)算機(jī)可以通過使用它對相似事物的了解來對新事物做出有根據(jù)的猜測,從而學(xué)習(xí)識別新事物。
單樣本學(xué)習(xí)
這就像當(dāng)你第一次看到一個(gè)新玩具,你的爸爸和媽媽告訴你玩具叫什么和用途。只要聽過一次,你就可以記住它是什么,并且下次看到它時(shí)就能認(rèn)出它。計(jì)算機(jī)可以學(xué)習(xí)和識別新事物用同樣的方式通過僅展示幾個(gè)例子并從中學(xué)習(xí)。
少樣本學(xué)習(xí)
少樣本學(xué)習(xí)就像通過只看幾個(gè)例子來學(xué)習(xí)做新事情一樣。例如,假設(shè)說你想學(xué)習(xí)如何畫一只貓,但你之前只看過幾張貓的圖片。通過幾次學(xué)習(xí),即使你以前沒有見過很多貓,你仍然可以學(xué)習(xí)如何畫貓。它就像是一種魔力,可以幫助你快速學(xué)習(xí)新事物,即使你沒有很多可供學(xué)習(xí)的例子。
以下是向 GitHub Copilot 提供示例和不提供示例時(shí),它的回答。
不提供示例
# Create a list of the first 10 prime numbers
primes = []
for num in range(2, 30):
if all(num % i != 0 for i in range(2, num)):
primes.append(num)
print(primes)
在上面的代碼片段中,Github Copilot 將準(zhǔn)確返回前 10 個(gè)數(shù)字,但效率低,因?yàn)樗鼘⒀h(huán)遍歷 2 到 30 之間的所有 29 個(gè)數(shù)字。通過提供希望 GitHub Copilot 執(zhí)行的操作的具體示例,可以獲得更有效的結(jié)果。
提供示例
# Create a list of the first 10 prime numbers
# Example: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
primes = []
for num in range(2, 30):
if all(num % i != 0 for i in range(2, num)):
primes.append(num)
if len(primes) == 10:
break
print(primes)
在上面的代碼片段中,GitHub Copilot 將返回前 10 個(gè)素?cái)?shù)并在找到全部 10 個(gè)時(shí)停止。目標(biāo)是獲得準(zhǔn)確但快速的結(jié)果,在將其推向正確的方向后,GitHub Copilot 成功實(shí)現(xiàn)了這一目標(biāo)。
附加建議
迭代你的提示
如果初始提示返回了所需的響應(yīng),可以刪除生成的代碼建議,使用更多詳細(xì)信息和示例編輯評論,然后重試。對于你和 GitHub Copilot 來說,這是一個(gè)學(xué)習(xí)過程。使用它的次數(shù)越多,與 GitHub Copilot 溝通的就越順暢。
在 IDE 中保持相關(guān)文件打開的選項(xiàng)卡
目前,GitHub Copilot 無法獲取整個(gè)代碼庫的上下文。然而,它可以讀取當(dāng)前的文件以及在 IDE 中打開的任何文件。我發(fā)現(xiàn)保留希望 GitHub Copilot 引用的相關(guān)文件的選項(xiàng)卡是很有幫助的。例如,當(dāng)我寫一個(gè)依賴其他文件變量的函數(shù),我將在 IDE 中保持該文件打開。這將有助于 GitHub Copilot 提供更準(zhǔn)確的建議。
給你的 AI 助手一個(gè)身份
我從 BitRise 的開發(fā)者倡導(dǎo)者 Leilah Simone 收到建議。我尚未使用 GitHub Copilot 嘗試此建議,但是這是有用的建議。它有助于控制用戶收到的響應(yīng)類型。在 Leila 的案例中,她要求 ChatGPT 表現(xiàn)的像一名高級的 IOS 工程師。她說:「這幫助她減少了語法和 linting 的問題」。
使用可預(yù)測模式
正如我們在上述許多種例子中看到的,GitHub Copilot 將遵循代碼中的模式。AI 愛好者和開發(fā)者 YK aka CS Dojo ,分享了他如何利用這一點(diǎn)來發(fā)揮自己的優(yōu)勢:
對描述其用途的變量和函數(shù)使用一致的、特定的命名約束
聲明變量或函數(shù)時(shí),使用指定用于變量用途的名稱。這將幫助 GitHub Copilot 了解變量的上下文并生成更多相關(guān)建議。例如,不要使用「value」等通用變量名稱,而應(yīng)使用「input_string」或 「output_file」。
GitHub Copilot 還將使用在代碼中使用的命名約定。例如,如果使用駝峰式命名變量,GitHub Copilot 將建議駝峰式命名變量。如果你使用 snake_case 作為變量,GitHub Copilot 將建議 snake_case 變量。
使用良好的編碼實(shí)踐
雖然 GitHub Copilot 可以作為生成代碼建議的強(qiáng)大工具,但請務(wù)必注意,它并不能取代你自己的編程技能和專業(yè)知識。人工智能模型的好壞取決于它們所訓(xùn)練的數(shù)據(jù),因此,重要的是使用這些工具作為輔助工具,而不是完全依賴它們。我鼓勵(lì) GitHub Copilot 的每個(gè)用戶:
-
review 代碼
-
運(yùn)行單元測試、集成測試和任何其他形式的測試代碼
-
手動(dòng)測試代碼以確保其按預(yù)期工作
-
并使用良好的編碼實(shí)踐,因?yàn)?GitHub Copilot 將遵循你的編碼風(fēng)格和模式作為其建議的指南
超越你的編譯器
當(dāng)前,GitHub Copilot 是最流行的 IDE 中的提供的擴(kuò)展插件。還有 GitHub Copilot Labs,這是一個(gè)可通過 GitHub Copilot 訪問的單獨(dú)實(shí)驗(yàn)性擴(kuò)展。Copilot Labs 可以幫助翻譯、調(diào)試、測試、記錄和重構(gòu)代碼。此外,還退出了 Copilot X,這是一套可以提高 IDE 之外的開發(fā)人員工作效率的功能。Copilot X 包括:
- Copilot for Docs - 使開發(fā)人員免于搜尋大量的文檔。
- Copilot for Pull Requests - 幫助編寫更好的 PR 描述并幫助團(tuán)隊(duì)更好的快速審查和合并 PR
- Copilot Chat - 在編輯器中通過 GitHub Copilot 聊天獲得類似的 ChatGPT 的體驗(yàn)
- Copilot for CLI - 幫助記住 Shell 命令和標(biāo)志,以編更快地在終端運(yùn)行命令
- Copilot Voice - 編寫和編輯代碼、瀏覽代碼庫以及用語音控制 Visual Studio Code
Copilot X 功能/產(chǎn)品目前處于技術(shù)預(yù)覽階段。如果想要使用上述功能之一,可以在 https://github.com/features/preview/copilot-x 上注冊等待名單。
開始使用 GitHub Copilot 練習(xí) prompt engineering
了解如何最佳使用 GitHub 的最佳方法就是開始使用它,可以在此處注冊訪問 GitHub Copilot https://github.com/features/copilot
如果你是企業(yè)領(lǐng)導(dǎo)者并且希望讓團(tuán)隊(duì)訪問 GitHub Copilot,可以在此處注冊 GitHub Copilot https://github.com/github-copilot/business_signup/choose_business_type
讓我們保持共同學(xué)習(xí)
感謝閱讀本篇博文。我很想聽聽你的消息!我還在學(xué)習(xí)更多關(guān)于人工智能、GitHub Copilot、和 prompt engineering 的知識。如果是是 GitHub Copilot 的粉絲并且已經(jīng)學(xué)會如何使用它來改進(jìn)開發(fā)人員工作流程,可以在下面的評論中分享一些你的技巧。
另外,可以查看以下更多的資源了解有關(guān) prompt engineering 的更多信息
-
How to get Codex to produce the code you want
-
Prompt Design from OpenAI
-
Prompt Engineering 101: Introduction to Codex文章來源:http://www.zghlxwxcb.cn/news/detail-623396.html
-
Prompt Engineering Guide by Elvis Saravia文章來源地址http://www.zghlxwxcb.cn/news/detail-623396.html
參考資料
- A Beginner’s Guide to Prompt Engineering with GitHub Copilot - DEV Community
到了這里,關(guān)于使用 GitHub Copilot 進(jìn)行 Prompt Engineering 的初學(xué)者指南(譯)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!