作者丨Martin Heller
策劃丨千山
當(dāng)我在2021年使用GitHub Copilot 預(yù)覽版時(shí),我注意到AI對(duì)程序員并不總是生成好的、正確的甚至正在運(yùn)行的代碼,但仍然有些用處。當(dāng)時(shí),我得出結(jié)論,未來(lái)的版本可以真正節(jié)省時(shí)間。兩年后,Copilot正在進(jìn)步,與此同時(shí),它開(kāi)始對(duì)個(gè)人收費(fèi)了,而且它多了一些競(jìng)爭(zhēng)對(duì)手。此外,編碼助手的范圍已從代碼生成擴(kuò)展到代碼解釋、拉取請(qǐng)求摘要、安全掃描和相關(guān)任務(wù)。
一、3個(gè)AI編程伴侶
讓我們簡(jiǎn)要介紹一下這三大工具,然后我們將深入探討每個(gè)工具。
Amazon CodeWhisperer是與Copilot競(jìng)爭(zhēng)最直接的產(chǎn)品。CodeWhisperer是像Copilot這樣的“編碼伴侶”,它與Visual Studio Code和JetBrains IDE集成,根據(jù)現(xiàn)有代碼生成代碼建議以響應(yīng)注釋和代碼完成,并可以掃描代碼以查找安全問(wèn)題。CodeWhisperer很好地支持五種編程語(yǔ)言,另外10種編程語(yǔ)言的支持程度較低。它可以選擇性地標(biāo)記和記錄對(duì)其使用的代碼的引用,并選擇性地篩選出類似于開(kāi)源訓(xùn)練數(shù)據(jù)的代碼建議。
Google Bard是一個(gè)基于Web的界面,用于LaMDA(對(duì)話應(yīng)用程序的語(yǔ)言模型),LaMDA是一種對(duì)話AI模型,能夠進(jìn)行流暢的多輪對(duì)話。Bard最近添加了幫助編碼和編碼主題的功能。當(dāng)Bard發(fā)出可能受開(kāi)源許可證約束的代碼時(shí),它會(huì)引用其來(lái)源并提供相關(guān)信息。Bard也擅長(zhǎng)代碼解釋。
GitHub Copilot X 是一組技術(shù)預(yù)覽功能,通過(guò)聊天和終端界面擴(kuò)展原始Copilot,支持拉取請(qǐng)求以及早期采用OpenAI的GPT-4。目前,要訪問(wèn)這些Copilot X功能,你需要擁有有效的Copilot訂閱并加入等候名單,無(wú)法保證何時(shí)可以訪問(wèn)新功能。在我加入等候名單后,我的邀請(qǐng)函花了大約一個(gè)月的時(shí)間才到達(dá)。請(qǐng)注意,Copilot X 不是(也可能永遠(yuǎn)不會(huì)是)GitHub Copilot 的可用產(chǎn)品。我在本次審查中使用了Copilot X這個(gè)名字,以區(qū)分我測(cè)試的GPT-4版本的Copilot與當(dāng)前基于GPT-3的Copilot產(chǎn)品。
使用這些代碼生成器之一并不是生成代碼的唯一方法。首先,你可以訪問(wèn)通用轉(zhuǎn)換器,如GPT-4及其前身,包括ChatGPT、BingGPT/Bing Chat(在Edge瀏覽器中可用)和Boo.ai。還有其他特定于代碼的AI工具,例如StarCoder,Tabnine,Cody,AlphaCode,Polycoder和Replit Ghostwriter。在我提到的每種情況下,在使用之前謹(jǐn)慎行事并仔細(xì)測(cè)試和審查生成的代碼至關(guān)重要。
二、如何測(cè)試這些工具
在我上一篇關(guān)于代碼生成的文章中,我根據(jù)編寫(xiě)程序來(lái)確定兩個(gè)日期之間的天數(shù)的相當(dāng)簡(jiǎn)單的任務(wù)來(lái)評(píng)估AI代碼生成器。大多數(shù)人做得很好,盡管有些人比其他人需要更多的指導(dǎo)。在這次審查中,我嘗試了代碼生成器來(lái)完成更困難的任務(wù),即抓取文章列表InfoWorld.com。我給了他們一個(gè)大綱,但沒(méi)有額外的幫助。沒(méi)有人生成正確的代碼,盡管有些代碼比其他代碼更接近。作為一項(xiàng)額外的任務(wù),我要求支持代碼解釋的工具解釋MIT開(kāi)放課件入門(mén)編程課程中的Python代碼示例。
作為參考,我給代碼生成器的大綱是:
抓取infoworld.com首頁(yè):
- 打開(kāi)https://www.infoworld.com/
- 通過(guò)在href中查找?guī)в小癮rticle”的鏈接來(lái)查找所有文章;從中提取標(biāo)題、作者、日期
- 按標(biāo)題字母順序列出所有文章;消除重復(fù)的
- 按作者姓氏的字母順序列出所有文章
- 首先列出所有最新的文章
總的來(lái)說(shuō),我試圖表現(xiàn)得像一個(gè)比我更天真的程序員,只是為了看看這些工具會(huì)做什么。
現(xiàn)在,讓我們更仔細(xì)地看一下我們的每個(gè)代碼生成器。
三、Amazon CodeWhisperer
在你的IDE中,Amazon CodeWhisperer會(huì)分析你的英語(yǔ)注釋和周?chē)拇a,以推斷它應(yīng)該生成哪些代碼來(lái)完成你正在鍵入的內(nèi)容。然后,它提供代碼作為你可以接受或拒絕的建議,或者你可以要求CodeWhisperer提供備用代碼,或者忽略并繼續(xù)編寫(xiě)自己的代碼。CodeWhisperer的大型語(yǔ)言模型(LLM)經(jīng)過(guò)了數(shù)十億行代碼的訓(xùn)練,包括Amazon和開(kāi)源代碼。任何給定的建議不僅基于你的注釋和上下文即時(shí)代碼,還基于在IDE中打開(kāi)的其他文件的內(nèi)容。
除了代碼生成之外,CodeWhisperer還可以掃描你的Python、Java和JavaScript代碼以查找安全漏洞,并為其提出修復(fù)建議。它咨詢的漏洞列表包括開(kāi)放Web應(yīng)用程序安全項(xiàng)目 (OWASP)、加密庫(kù)最佳實(shí)踐、AWS API 最佳實(shí)踐和其他API最佳實(shí)踐。安全掃描按需進(jìn)行,這與代碼完成不同,代碼完成會(huì)在你編碼時(shí)持續(xù)提供,除非你關(guān)閉建議。
1.編程語(yǔ)言和集成開(kāi)發(fā)環(huán)境
CodeWhisperer用于代碼生成的最佳編程語(yǔ)言(訓(xùn)練語(yǔ)料庫(kù)中最流行的語(yǔ)言)是Java,Python,JavaScript,TypeScript和C#。它在Ruby,Go,PHP,C++,C,Shell,Scala,Rust,Kotlin和SQL上進(jìn)行了較小程度的訓(xùn)練。
有用于Visual Studio Code和JetBrains IDE的CodeWhisperer插件。你還可以激活CodeWhisperer以便在AWS Cloud9 和AWS Lambda 中使用;在這兩種情況下,你都必須編輯你的IAM權(quán)限并選中啟用CodeWhisperer框。
我在Visual Studio Code中安裝了CodeWhisperer。有四個(gè)步驟:
- 將 CodeWhisperer 插件添加到 VS Code。
- 添加與 AWS 的連接。
- 登錄 AWS 網(wǎng)站。
- 從 AWS 開(kāi)發(fā)人員工具面板啟動(dòng) CodeWhisperer
圖片
圖1:安裝并授權(quán)CodeWhisperer后(左側(cè)),你可以看到使用說(shuō)明,如右側(cè)所示代碼建議和完成
值得一看的是,一些演示CodeWhisperer功能的視頻,這些視頻列在CodeWhisperer資源頁(yè)面上。他們會(huì)告訴你比我更多的文字和截圖。在觀看它們時(shí),我清楚地看到CodeWhisperer在調(diào)用AWS API 的代碼上大放異彩。
盡管如此,以下是CodeWhisperer生成的代碼的屏幕截圖:
圖片
圖2:CodeWhisperer生成代碼
請(qǐng)注意,生成的代碼不起作用 ,并且CodeWhisperer生成了多個(gè)函數(shù),或多或少出于相同的目的。然而,它相當(dāng)接近,CodeWhisperer有點(diǎn)讀懂我關(guān)于使用Beautiful Soup來(lái)抓取網(wǎng)頁(yè)的想法。
圖片
圖3:嘗試CodeWhisperer生成的程序
2.安全掃碼和開(kāi)源參考
我也在我的項(xiàng)目上運(yùn)行了CodeWhisperer安全掃描。不出所料,此文件中未檢測(cè)到任何問(wèn)題,盡管CodeWhisperer掃描在GitHub Copilot X生成的另一個(gè)文件中發(fā)現(xiàn)了資源泄漏。CodeWhisperer安全掃描是一項(xiàng)差異化功能,尚未在競(jìng)爭(zhēng)的AI代碼生成器中浮出水面。
此文件沒(méi)有觸發(fā)任何開(kāi)源引用,但是當(dāng)我打開(kāi)CodeWhisperer引用日志時(shí),我發(fā)現(xiàn)了一個(gè)指向該設(shè)置的鏈接,該設(shè)置控制CodeWhisperer是否會(huì)建議具有此類引用的代碼。在我查看的Amazon示例中,帶有引用的代碼建議在頂部顯示了許可證類型。
3.CodeWhisperer 小結(jié)
CodeWhisperer在IDE中生成代碼并進(jìn)行安全審查,但它缺少聊天窗口和代碼解釋。該工具或多或少如宣傳的那樣工作,價(jià)格(免費(fèi))適合個(gè)人開(kāi)發(fā)人員。對(duì)于企業(yè)開(kāi)發(fā)人員來(lái)說(shuō),CodeWhisperer每月19美元的價(jià)格與Copilot相同。對(duì)于大量使用AWS的商店以及需要知道代碼建議何時(shí)涉及開(kāi)源的商店,我更喜歡CodeWhisperer而不是Copilot。
四、Google Bard
Bard于2023年4月21日宣布支持編程。相關(guān)博客文章提到了“超過(guò)20種編程語(yǔ)言,包括C++,Go,Java,Javascript,Python和Typescript?!?/p>
當(dāng)我向Bard詢問(wèn)完整列表時(shí),我收到了以下回復(fù):
- C++
- Go
- Java
- JavaScript
- Python
- TypeScript
- C#
- PHP
- Ruby
- Swift
- Kotlin
- Rust
- Julia
- R
- Haskell
- Erlang
- Scala
- Lua
- OCaml
- Scheme
Bard可以生成這些語(yǔ)言的代碼、調(diào)試代碼和解釋代碼。它還可以從一種編程語(yǔ)言翻譯成另一種編程語(yǔ)言。
請(qǐng)注意,Bard仍在開(kāi)發(fā)中,因此其功能可能并不完美。在使用AI生成的代碼之前,仔細(xì)檢查它總是一個(gè)好主意。
我在代碼解釋和代碼生成任務(wù)上測(cè)試了Bard,如下所示。代碼解釋非常好——非常好,以至于我想知道Bard是否接受過(guò)麻省理工學(xué)院課程代碼示例的培訓(xùn),該示例可追溯到2008年,從那時(shí)起就可以在網(wǎng)上找到。
網(wǎng)站抓取工具的代碼生成乍一看看起來(lái)相當(dāng)可信,但在進(jìn)一步檢查時(shí)有幾個(gè)明顯的問(wèn)題。只需單擊兩次即可在Colab中打開(kāi)代碼,但是當(dāng)我嘗試運(yùn)行它時(shí),它拋出了一個(gè)類型錯(cuò)誤,它甚至沒(méi)有達(dá)到我確定為錯(cuò)誤的代碼。
我沒(méi)有解決問(wèn)題,而是嘗試再次運(yùn)行代碼生成,結(jié)果更有意義。但是,當(dāng)我嘗試在Colab中運(yùn)行它時(shí),它拋出了一個(gè)屬性錯(cuò)誤。我將該回溯反饋給Bard,它生成了一個(gè)修復(fù)程序,我在Colab中運(yùn)行了“修復(fù)”代碼,結(jié)果它又在另一個(gè)位置產(chǎn)生了類型錯(cuò)誤。夠了,已經(jīng)!真想舉起雙手,繳械投降。
引用網(wǎng)頁(yè)和開(kāi)源代碼怎么樣?Bard的常見(jiàn)問(wèn)題解答是這樣說(shuō)的:
與其他一些獨(dú)立的LLM體驗(yàn)一樣,Bard旨在生成原始內(nèi)容,而不是長(zhǎng)時(shí)間復(fù)制現(xiàn)有內(nèi)容。我們?cè)O(shè)計(jì)了我們的系統(tǒng)來(lái)限制這種情況發(fā)生的可能性,我們將繼續(xù)改進(jìn)這些系統(tǒng)的運(yùn)作方式。如果Bard確實(shí)直接從網(wǎng)頁(yè)中詳細(xì)引用,它會(huì)引用該頁(yè)面。
有時(shí),相同的內(nèi)容可能會(huì)在多個(gè)網(wǎng)頁(yè)上找到,Bard試圖指向一個(gè)流行的來(lái)源。在引用代碼存儲(chǔ)庫(kù)的情況下,引用也可以引用適用的開(kāi)源許可證。
這是我給Bard的指令和由此產(chǎn)生的對(duì)話:
我要給你一些代碼來(lái)解釋。請(qǐng)等待直到代碼完成。
當(dāng)然,我會(huì)等你把代碼完全給我。請(qǐng)慢慢來(lái)。我會(huì)盡我所能來(lái)幫助你。
下面是一些解釋代碼的技巧:
- 首先解釋代碼的總體目的。它是做什么的?它試圖解決什么問(wèn)題?
- 然后,將代碼分解成更小的塊,并依次解釋每個(gè)塊。
- 使用簡(jiǎn)潔明了的語(yǔ)言。避免行話和專業(yè)術(shù)語(yǔ)。
- 用例子來(lái)說(shuō)明你的觀點(diǎn)。
- 要有耐心,不要害怕問(wèn)問(wèn)題。
- 我有信心可以幫助你解釋你給我的任何代碼。只要讓我知道你需要什么,我會(huì)盡我所能幫助你。
這是我提供的代碼:
import pylab, random
class Stock(object):
def __init__(self, price, distribution, vol):
self.price = price
self.history = [price]
self.distribution = distribution
self.vol = vol
self.lastChangeInfluence = 0.0
def setPrice(self, price):
self.price = price
self.history.append(price)
def getPrice(self):
return self.price
def makeMove(self, bias, mo):
oldPrice = self.price
baseMove = self.distribution(self.vol) + bias
self.price = self.price * (1.0 + baseMove)
self.price += mo*random.choice([0.0, 1.0])*self.lastChangeInfluence
self.history.append(self.price)
change = self.price - oldPrice
if change >= 0:
self.lastChangeInfluence = min(change, oldPrice*0.01)
else:
self.lastChangeInfluence = max(change, -oldPrice*0.01)
def showHistory(self, fig, test):
pylab.figure(fig)
pylab.plot(self.history)
pylab.title('Closing Prices, Test ' + test)
pylab.xlabel('Day')
pylab.ylabel('Price')
class SimpleMarket(object):
def __init__(self, numStks, volUB):
self.stks = []
self.bias = 0.0
for n in range(numStks):
volatility = random.uniform(0, volUB)
distribution = lambda vol: random.gauss(0.0, vol)
stk = Stock(100.0, distribution, volatility)
self.addStock(stk)
def addStock(self, stk):
self.stks.append(stk)
def setBias(self, bias):
self.bias = bias
def getBias(self):
return self.bias
def getStocks(self):
return self.stks[:]
def move(self, mo):
prices = []
for s in self.stks:
s.makeMove(self.bias, mo)
prices.append(s.getPrice())
return prices
class Market(SimpleMarket):
def __init__(self, numStks, volUB, dailyBiasRange):
SimpleMarket.__init__(self, numStks, volUB)
self.dailyBiasRange = dailyBiasRange
def move(self, mo):
prices = []
dailyBias = random.gauss(self.dailyBiasRange[0], self.dailyBiasRange[1])
for s in self.stks:
s.makeMove(self.bias + dailyBias, mo)
prices.append(s.getPrice())
return prices
def simMkt(mkt, numDays, mo):
endPrices = []
for i in range(numDays):
vals = mkt.move(mo)
vals = pylab.array(vals)
mean = vals.sum()/float(len(vals))
endPrices.append(mean)
return endPrices
def plotAverageOverTime(endPrices, title):
pylab.plot(endPrices)
pylab.title(title)
pylab.xlabel('Days')
pylab.ylabel('Price')
def plotDistributionAtEnd(mkt, title, color):
prices = []
sumSoFar = 0
for s in mkt.getStocks():
prices.append(s.getPrice())
sumSoFar += s.getPrice()
mean = sumSoFar/float(len(prices))
prices.sort()
pylab.plot(prices, color)
pylab.axhline(mean, color = color)
pylab.title(title)
pylab.xlabel('Stock')
pylab.ylabel('Last Sale')
pylab.semilogy()
def runTrial(showHistory, test, p):
colors = ['b','g','r','c','m','y','k']
mkt = Market(p['numStocks'], p['volUB'], p['dailyBiasRange'])
mkt.setBias(p['bias'])
endPrices = simMkt(mkt, p['numDays'], p['mo'])
pylab.figure(1)
plotAverageOverTime(endPrices, 'Average Closing Prices')
pylab.figure(2)
plotDistributionAtEnd(mkt, 'Distribution of Prices', colors[test%len(colors)])
if showHistory:
for s in mkt.getStocks():
s.showHistory(test+2, str(test))
def runTest(numTrials):
#Constants used in testing
numDaysPerYear = 200.0
params = {}
params['numDays'] = 200
params['numStocks'] = 500
params['bias'] = 0.1/numDaysPerYear #General market bias
params['volUB'] = 12.0/numDaysPerYear #Upper bound on volatility for a stock
params['mo'] = 1.1/numDaysPerYear #Momentum factor
params['dailyBiasRange'] = (0.0, 4.0/200.0)
for t in range(1, numTrials+1):
runTrial(True, t, params)
runTest(3)
pylab.show()
以下是Bard的一些回應(yīng),非常深入:
你提供的代碼是一個(gè)模擬股票市場(chǎng)的Python程序。程序定義了三個(gè)類:
股票:這個(gè)類表示一只股票。它具有股票的價(jià)格、歷史、分布、波動(dòng)性和最近變化影響的屬性。
這個(gè)類表示一個(gè)簡(jiǎn)單的股票市場(chǎng)。它有一個(gè)股票列表、一個(gè)偏差和一個(gè)波動(dòng)率上限。
市場(chǎng):這個(gè)類繼承自SimpleMarket,并添加了一個(gè)每日偏差范圍屬性。該程序還定義了幾個(gè)函數(shù):
- simmkt:該函數(shù)模擬給定天數(shù)和動(dòng)量因子的市場(chǎng)。
- plotaverageovertime:該函數(shù)繪制股票隨時(shí)間的平均收盤(pán)價(jià)。
- plotdistributionatend:該函數(shù)繪制模擬結(jié)束時(shí)的價(jià)格分布。
- runtrial:該函數(shù)運(yùn)行單個(gè)模擬并繪制結(jié)果。
- runtest:這個(gè)函數(shù)運(yùn)行一些模擬并繪制結(jié)果。
通過(guò)調(diào)用runTest函數(shù)來(lái)運(yùn)行程序,該函數(shù)具有所需的模擬次數(shù)。然后程序?qū)⑸扇齻€(gè)圖:
- 股票在一段時(shí)間內(nèi)的平均收盤(pán)價(jià)圖。
- 模擬結(jié)束時(shí)的價(jià)格分布圖。
- 每只股票的歷史價(jià)格圖。
該程序可用于模擬各種不同的股票市場(chǎng)。通過(guò)改變參數(shù)的值,你可以改變市場(chǎng)的波動(dòng)性、市場(chǎng)的偏差和動(dòng)量因子。你也可以使用該程序來(lái)模擬不同的交易策略。例如,你可以模擬一種策略,當(dāng)股票被低估時(shí)買(mǎi)入,當(dāng)股票被高估時(shí)賣(mài)出。
Bard還解釋了代碼的每個(gè)部分是如何工作的:
Stock類表示單個(gè)股票。它具有股票的價(jià)格、歷史、分布、波動(dòng)性和最近變化影響的屬性。價(jià)格屬性是股票的當(dāng)前價(jià)格。歷史屬性是股票在一段時(shí)間內(nèi)的價(jià)格列表。distribution屬性是一個(gè)為股票生成隨機(jī)價(jià)格的函數(shù)。波動(dòng)性是衡量股票價(jià)格波動(dòng)幅度的指標(biāo)。lastChangeInfluence屬性是股票價(jià)格受其先前變化影響程度的度量。
SimpleMarket類表示一個(gè)簡(jiǎn)單的股票市場(chǎng)。它有一個(gè)股票列表、一個(gè)偏差和一個(gè)波動(dòng)率上限。股票列表屬性是市場(chǎng)上股票的列表。偏倚屬性是衡量市場(chǎng)對(duì)價(jià)格上漲的偏向程度的指標(biāo)。波動(dòng)性上限屬性是衡量市場(chǎng)波動(dòng)程度的指標(biāo)。
Market類繼承自SimpleMarket,并增加了一個(gè)每日偏差范圍屬性。每日偏差范圍屬性是衡量市場(chǎng)偏差每天變化的程度。
- simMkt函數(shù)模擬給定天數(shù)和動(dòng)量因子的市場(chǎng)。天數(shù)參數(shù)是要模擬的天數(shù)。動(dòng)量因子參數(shù)是衡量股票價(jià)格受動(dòng)量影響程度的指標(biāo)。
- plotAverageOverTime函數(shù)繪制股票隨時(shí)間的平均收盤(pán)價(jià)。plotDistributionAtEnd函數(shù)繪制模擬結(jié)束時(shí)的價(jià)格分布。
- runTrial函數(shù)運(yùn)行單個(gè)模擬并繪制結(jié)果。showHistory參數(shù)是一個(gè)布爾值,用于確定是否繪制每只股票的歷史價(jià)格。測(cè)試參數(shù)是模擬的唯一標(biāo)識(shí)符。
- runTest函數(shù)運(yùn)行大量模擬并繪制結(jié)果。numTrials參數(shù)是要運(yùn)行的模擬次數(shù)。
我希望這個(gè)解釋是有幫助的。如果你還有什么問(wèn)題,請(qǐng)告訴我。
當(dāng)我跟進(jìn)時(shí),輸入“pylab模塊在哪里?”Bard給出了模塊的位置、如何導(dǎo)入模塊、功能描述和指向文檔的指針。
此外,以下是Bard生成的用于抓取文章列表InfoWorld.com的代碼:
import requests
from bs4 import BeautifulSoup
def scrape_infoworld():
"""Scrape the InfoWorld front page and return a list of articles."""
# Get the HTML from the InfoWorld front page.
response = requests.get("https://www.infoworld.com/")
soup = BeautifulSoup(response.content, "html.parser")
# Find all articles by looking for links with 'article' in the href.
articles = soup.find_all("a", href=lambda x: "article" in x["href"])
# Extract the title, author, and date from each article.
article_data = []
for article in articles:
title = article.find("h3").text
author = article.find("span", class_="byline").text
date = article.find("time").text
article_data.append({
"title": title,
"author": author,
"date": date,
})
# Sort the articles alphabetically by title.
article_data.sort(key=lambda x: x["title"])
# Remove any duplicate articles.
article_data = list(set(article_data))
# Sort the articles alphabetically by author last name.
article_data.sort(key=lambda x: x["author"].split()[-1])
# Sort the articles latest first.
article_data.sort(key=lambda x: x["date"], reverse=True)
return article_data
if __name__ == "__main__":
articles = scrape_infoworld()
# Print the articles.
for article in articles:
print(article)
Explanation:
This code will first get the HTML from the InfoWorld front page. Then, it will find all articles by looking for links with 'article' in the href. For each article, it will extract the title, author, and date. The articles will then be sorted alphabetically by title, removed of any duplicates, sorted alphabetically by author last name, and sorted latest first. Finally, the articles will be printed.
這是運(yùn)行時(shí)結(jié)果:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-afbe7808577e> in <cell line: 40>()
39
40 if __name__ == "__main__":
---> 41 articles = scrape_infoworld()
42
43 # Print the articles.
6 frames
<ipython-input-1-afbe7808577e> in <lambda>(x)
10
11 # Find all articles by looking for links with 'article' in the href.
---> 12 articles = soup.find_all("a", href=lambda x: "article" in x["href"])
13
14 # Extract the title, author, and date from each article.
TypeError: string indices must be integers
Bard小結(jié)
Bard有一個(gè)聊天界面,可以生成和解釋代碼,但它沒(méi)有交互式IDE集成。鑒于Bard目前是完全免費(fèi)的,并且不需要設(shè)置,當(dāng)你需要使用20種支持的語(yǔ)言中的任何一種生成、調(diào)試和解釋代碼時(shí),當(dāng)然值得嘗試。
五、GitHub Copilot X
GitHub Copilot X 比原來(lái)的GitHub Copilot有了很大的改進(jìn),有時(shí)可以在沒(méi)有太多人工幫助的情況下生成正確的函數(shù)和一組測(cè)試。它仍然會(huì)犯錯(cuò)誤和幻覺(jué)(產(chǎn)生虛假信息),但不像以前那么多了。
除了在編程編輯器中生成代碼(目前僅支持最新版本的Visual Studio和最新的Visual Studio Code內(nèi)部版本)之外,Copilot X還向編輯器添加了GPT-4聊天面板。它還添加了終端接口,支持生成單元測(cè)試和拉取請(qǐng)求說(shuō)明,以及從文檔中提取說(shuō)明的功能。
我問(wèn)Copilot X聊天支持哪些編程語(yǔ)言,它回答說(shuō)“我支持多種編程語(yǔ)言,包括但不限于:Python,JavaScript,TypeScript,Ruby,Java,C++,C#,PHP,Go,Swift,Kotlin,Rust等等。我主要用Python進(jìn)行測(cè)試。
當(dāng)我使用Copilot Chat工具要求Copilot X解釋MIT市場(chǎng)模擬代碼時(shí),它給出了部分正確的答案。我不得不比喻它咬牙切齒,讓它解釋代碼的其余部分。
圖片
圖4:Copilot X在解釋市場(chǎng)模擬器方面做得不錯(cuò),但不完整
Copilot X最顯著的失敗是網(wǎng)絡(luò)抓取代碼生成任務(wù)。該工具生成了一堆表面上可信的代碼,這些代碼沒(méi)有使用Beautiful Soup,但從審查代碼中可以清楚地看出它永遠(yuǎn)不會(huì)起作用。我一直把問(wèn)題帶到Copilot Chat,但它只是給自己挖了一個(gè)更深的坑。我本可以重新開(kāi)始并給它更好的提示,包括從它導(dǎo)入并添加一些顯示InfoWorld主頁(yè)的HTML和目錄結(jié)構(gòu)的評(píng)論。我沒(méi)有這樣做,因?yàn)檫@不符合我在這一輪測(cè)試中采用的天真的編碼員角色。
圖片
圖5:Copilot X嘗試在不使用Beautiful Soup(bs4)的情況下生成網(wǎng)絡(luò)抓取代碼。后來(lái)我聊到它生成的解決方案,它先是聲稱使用的是Beautiful Soup,但后來(lái)承認(rèn)找不到進(jìn)口
與所有AI助手一樣,你必須對(duì)Copilot X生成的代碼持保留態(tài)度,就像處理來(lái)自未知程序員的拉取請(qǐng)求一樣。
Copilot X 小結(jié)
除了在IDE中生成代碼外,Copilot X 還在編輯器中添加了一個(gè)GPT-4聊天面板。它還增加了終端接口、對(duì)單元測(cè)試生成的支持、對(duì)生成拉取請(qǐng)求描述的支持,以及從技術(shù)文檔中提取說(shuō)明的功能。同樣,Copilot X 是一組技術(shù)預(yù)覽功能,這些功能在Copilot產(chǎn)品中尚不可用;他們的產(chǎn)品形式和定價(jià)還有待觀察。GitHub Copilot目前個(gè)人每月收費(fèi)10美元,企業(yè)每位用戶每月收費(fèi)19美元。
六、結(jié)論
GitHub Copilot X在簡(jiǎn)單的問(wèn)題上工作得很好,但不一定比代碼編輯器中的Amazon CodeWhisperer和瀏覽器中的Google Bard組合更好。CodeWhisperer還沒(méi)有聊天功能或解釋代碼的功能,這太糟糕了,Bard沒(méi)有與編輯器或IDE完全集成也太糟糕了。
如果Copilot X沒(méi)有在我的高級(jí)代碼生成任務(wù)中脫軌,我會(huì)很想推薦它(即即將推出的基于GPT-4的GitHub Copilot版本,無(wú)論名稱如何)——主要是因?yàn)樗诰庉嬈髦屑闪肆奶旌痛a生成。然而,在這一點(diǎn)上,Copilot X還沒(méi)有完全準(zhǔn)備好??偟膩?lái)說(shuō),沒(méi)有一個(gè)代碼生成產(chǎn)品是真正符合要求的,盡管Bard和Copilot X在代碼解釋方面都做得很好。
所有這些產(chǎn)品都在積極開(kāi)發(fā)中,所以我的建議是繼續(xù)觀察它們并進(jìn)行實(shí)驗(yàn),但不要相信它們中的任何一個(gè)。
原文鏈接:https://www.infoworld.com/article/3699140/review-codewhisperer-bard-and-copilot.html