全網最全!實測亞馬遜 AI 編程助手 Amazon CodeWhisperer

2023-09-18     InfoQ

原標題:全網最全!實測亞馬遜 AI 編程助手 Amazon CodeWhisperer

作者 | 攻城先森

審校 | 張雅文

活動推薦: #生成式 AI 先鋒開發者集結令 #

免費體驗編程神器,豐厚大獎等你來拿!https://jinshuju.net/f/rVuKYa

今天小王學長帶大家實際測試一下亞馬遜最近出的 AI 編程助手 Amazon CodeWhisperer,從不同角度和不同功能來看看這款編程助手是否可以幫助我更好的進行開發任務。

文章目錄:(大家先預覽下)

一、CodeWhisperer簡介

1.1 CodeWhisperer 是一個重要的生產力助推器

1.2 CodeWhisperer 的實際應用

二、CodeWhisperer安裝教程

2.1 IntelliJ IDEA安裝CodeWhisperer插件

2.2 VSCode安裝CodeWhisperer插件

2.3 PyCharm安裝CodeWhisperer

2.4 快捷鍵使用方法

三、簡單自動編碼演示

3.1 單行代碼自動補全

3.2 CodeWhisperer生成完整代碼

3.3 其根據簽名自動生成代碼

四、AI編程代碼實測及項目體驗

4.1 簡單函數代碼測試

4.2 代碼安全掃描實測

4.3 代碼引用跟蹤功能實測

4.4 計算機視覺工程項目實測

五、Amazon CodeWhisperer實測體驗總結

5.1 CodeWhisperer 可以幫助我成為一個更好的開發者嗎?

複製代碼

一、CodeWhisperer 簡介

CodeWhisperer 是亞⻢遜出品的一款基於機器學習的通用代碼生成器,可實時提供代碼建議。

在編寫代碼時,它會自動根據我們現有的代碼和注釋生成建議。從單行代碼建議到完整的函數,它可為我們提供各種大小和範圍的個性化建議。

CodeWhisperer 還可以掃描我們的代碼以突出顯示和定義安全問題。

codewhispereropen in new window:亞馬遜官方出品

目前僅以插件的形式在VS Codeopen in new window、Jetbrainsopen in new window等 IDE 裡面使用,如果想試一試可以用 VS Code,目前無限制免費使用免費,並且對環境要求不高,還輕量~

亞馬遜在 2022 年 6 月發布了 CodeWhisperer 預覽版,現在它支持 Python、Java 和 JavaScript。

CodeWhisperer 經過數十億行代碼的訓練,由機器學習提供支持,旨在實現相同的目標。無論我們是學生、新開發人員,還是經驗豐富的專業人士,CodeWhisperer 都有助於我們提高工作效率。

其支持多種 IDE 和語言。要開始使用,我們只需安裝合適的 AWS IDE Toolkit,啟用 CodeWhisperer 功能,輸入我們的預覽訪問代碼,然後開始鍵入:

CodeWhisperer 可以持續檢查我們的代碼和注釋,並為我們提供語法正確的推薦。這些推薦根據您的編碼風格和變量名稱合成,而不僅僅是代碼段。

CodeWhisperer 使用多個上下文線索來提供推薦,包括原始碼中的光標位置、光標前面的代碼、注釋以及同一項目中其他文件中的代碼。您可以按原樣使用推薦,也可以根據需要對其進行改善和自定義。正如我之前所提到的,我們使用從開源存儲庫、內部 Amazon 存儲庫、API 文檔和論壇中提取的數十億行代碼訓練(並將繼續訓練)CodeWhisperer。

在 AWS 博客的一篇文章中,Mark Richman 解釋說,CodeWhisperer 的模型是在「包括 Amazon 開原始碼在內的各種數據源」上訓練的。有了這個語料庫(顯然確實存在)完善 CodeWhisperer 的模型,編寫從 S3 讀取文件的代碼應該是一個很好的測試用例。

在使用 CodeWhisperer(CW)時,我們需要寫一個注釋,描述我們希望函數去做什麼。注釋的描述性和準確性越高,系統就越能更好地推斷出我們想要的邏輯。

Function to open an S3 file

複製代碼

比如注釋以 Function 開頭,讓 CW 知道你想要創建一個函數。也就是說,你需要添加一個注釋,作為給 CW 的提示。

CW 分析注釋並生成一個函數的定義。此時,你可以在生成函數體之前修改函數定義。CW 還可能提供多種函數定義供你選擇。

IntelliJ 集成 CodeWhisperer 的截圖:

點擊「插入代碼」,你的函數就在注釋的下方創建好了。注意 CodeWhisperer 不僅插入了代碼,還創建了一個文檔字符串。

# Function to open an S3 file

def open_s3_file(filename):

"""

:param filename:

:return:

"""

s3 = boto3.resource('s3')

return s3.Object(bucket, filename).get()['Body'].read()

複製代碼

看起來不錯!這段代碼實現了你的注釋所期望的功能,並且是在幾秒鐘內就生成了。

節省了查找 boto3 API 的時間,你只需要檢查代碼,確保語義正確。

接著看看提出更多要求時,會發生什麼。

這有一個很有用的例子:寫一個函數從 S3 的文件中返回前「n」行。

# Function to get first n lines from a file in S3

def get_first_n_lines_from_s3(filename, n):

"""

Get the first n lines of a file in S3

:param filename:

:param n:

:return:

"""

lines = []

for line in open_s3_file(filename):

lines.append(line)

if len(lines) >= n:

break

return lines

複製代碼

真厲害!CodeWhisperer 使用了之前創建的輔助方法 open_s3_file,並生成了正確的函數。

在 CW 生成函數體之前,你可以修改參數名,提高代碼的可讀性。例如,如果我們輸入:

# Function to find common elements in lists

複製代碼

CW 會提示:

def find_common_elements(list1, list2)

在生成函數體之前,我們可以修改函數定義,使其更具描述性:

def find_common_elements(first, second)

如果我們接受它的函數定義,CodeWhisperer 將使用函數簽名和注釋來構建函數體。得到的函數將使用改進後的參數名。

# Function to find common elements in lists

def find_common_elements(first, second):

return list(set(first) & set(second))

CodeWhisperer 不僅僅可以創建整個函數;它還可以在函數中插入代碼片段,並在過程中推斷相關變量。

# reverse the list order

lines.reverse()

1.1 CodeWhisperer 是一個重要的生產力助推器

使用 CodeWhisperer,我能夠更快地編寫代碼。到目前為止,最大的價值是 S3 示例所演示的功能。

如果我自己寫代碼,大部分時間將會用來查找 boto API 文檔,以確保寫出正確的調用。使用 CodeWhisperer,則只需三秒鐘。

這讓我想到了一段曾花了很多時間的煩人代碼:給 CloudWatch 發送數據。讓我們看看 CodeWhisperer 能否有所幫助,試試提供注釋:「Function to emit a CloudWatch metric」。

# Function to emit a cloudwatch metric

def put_metric_data(metric_name, metric_data):

"""

Put a metric data into cloudwatch

:param metric_name:

:param metric_data:

:return:

"""

cloudwatch = boto3.client('cloudwatch')

cloudwatch.put_metric_data(

Namespace='my_namespace',

MetricData=[

{

'MetricName': metric_name,

'Dimensions': [

{

'Name': 'string',

'Value': 'string'

},

],

'Unit': 'Seconds',

'Value': metric_data

},

]

非常有用!CW 為我節省了許多打字和查閱 API 文檔的時間。

我有可能需要重構這段代碼,但即使我從零開始編寫它,第一步也要寫出類似這樣的原始邏輯。如今只花三秒鐘,我節省了編寫大量樣板代碼的時間,有了一個很好的自定義或重構的起點。

1.2 CodeWhisperer 的實際應用

我在 PyCharm 中安裝了 CodeWhisperer ,並對其進行了測試。以下是一些示例,向您展示了它可以執行的操作。我想構建一個質數列表。我鍵入 # See if a number is pr。CodeWhisperer 完成此操作,然後我按下 TAB(實際鍵特定於每個 IDE)接受推薦:

在下一行,我按下 Alt+C(同樣是 IDE 特定),然後我可以在一對函數定義之間進行選擇。我接受第一個函數,CodeWhisperer 推薦函數體,以下是我所擁有的:

我編寫 for 語句,CodeWhisperer 推薦循環的主體:

CodeWhisperer 還可以幫助我編寫用於訪問各種 AWS 服務的代碼。我從 # create S3 bucket 開始,然後按 TAB 鍵完成剩餘部分:

看到這裡,大家是不是覺得還不錯,接下來教大家如何安裝,很簡單的~

二、CodeWhisperer 安裝教程

2.1 IntelliJ IDEA 安裝 CodeWhisperer 插件

在 IDEA 中打開配置窗⼝,選擇 Plugins,搜索"AWS Toolkit",點擊 Install,點擊 OK 按鈕,如下圖:

安裝完之後重啟 IDEA,如下圖:

打開 AWS Toolkit 視圖(菜單 View/Tool Windows/AWS Toolkit),點擊"Developer Tools"tab⻚⾯,選擇「CodeWhisperer/Start",如下圖:

彈出的窗⼝中選擇「Use a personal email to sign up and sign in with AWS Builder ID",點擊「Connect」按鈕,如下圖:

在彈出的窗⼝中,選擇「Open and Copy Code」,如下圖:

此時會在瀏覽器中打開⼀個⻚⾯,按 ctrl-v 粘貼 code 值,點擊「Next「,如下圖:

輸⼊郵箱地址,點擊"Next",如下圖:

輸⼊名字,點擊「Next」,CodeWhisperer 會向郵箱中發送⼀個驗證碼,如下圖:

打開郵箱,可以看到驗證碼,如下圖:

複製驗證碼,粘貼到輸入框,點擊「Verify」按鈕,如下圖:

設置密碼,點擊「Create AWS Builder ID「,如下圖:

在最後⼀個⻚⾯中點擊「Allow」按鈕,如下圖:

出現如下提示後,即表示註冊 AWS builder ID 成功,如下圖:

返回 IDEA,在 AWS Toolkit 視圖中的 Developer Tools 中可以打開或關閉代碼⽣成功能,如下圖:

此時,就可以愉快的使用 AI 編程了。

2.2 VSCode 安裝 CodeWhisperer 插件

一般會提示外部網站打開提醒,選擇打開

等左下角的 AWS 擴展顏色正常,對勾狀態,說明連接成功

此時,就可以愉快的使用 AI 編程了。

2.3 PyCharm 安裝 CodeWhisperer

1.打開 Pycharm 插件管理

在 JetBrains IDE 中,導航到設置菜單(在 macOS 上為 + ,在 Windows 上為文件設置),然後單擊左側菜單上的「插件」。

在菜單頂部,單擊 Marketplace 並在搜索欄中鍵入 「AWS Tookit」。然後點擊安裝

2.安裝完成後重啟 IDE

3.將 Pycharm 連接到 AWS(AWS Build ID 創建),重複之前步驟

IDE 重新啟動後,您將看到一個新的 AWS Toolkit 工具窗口。還可以通過 View -> Tool Windows -> AWS Toolkit(視圖 -< 工具窗口 -< AWS Explorer)訪問此窗口。

然後點擊"Developer Tools"標籤,選擇「CodeWhisperer/Start"

此時,就可以愉快的在 PyCharm 里使用 AI 編程了。

2.4 快捷鍵使用方法

全程需要按快捷鍵調用 Codewhisperer,主要的幾個用法如下:

三、簡單自動編碼演示

回到 IDEA,看到如下介面,即表示註冊並啟動成功:

下面我們新建任意 Java 文件,看看他如何能夠幫助我們自動生成代碼。

3.1 單行代碼自動補全

輸入字符串 public。根據輸入,CodeWhisperer 生成了建議列表

3.2 CodeWhisperer 生成完整代碼

CodeWhisperer 可以根據編寫的注釋生成完整的函數。

類似於 if/for/while 等代碼塊的生成。

大家如果看到這有疑問,可以接著看第四部分,有詳細的測試說明。

3.3 其根據簽名自動生成代碼

看到這裡,大家應該有個簡單的了解了,咱們接著往下看~

四、AI 編程代碼實測及項目體驗

4.1 簡單函數代碼測試

首先,我先用中文注釋了「寫一個讀取 csv 文件的函數」 回車後可以看到 CodeWhisperer 自動顯示出來

按快捷鍵 Tab 確認鍵入後,接著回車後 CodeWhisperer 又自動生成了以下代碼:

感覺這個 CodeWhisperer 自動生成的代碼還不錯,我選擇了 Insert Code 鍵入使用。

緊接著用中文又注釋了「創建一個簡單的爬蟲簡單函數」

在這選擇了第三個自動代碼,同樣 Tab 鍵入。

接下來是注釋「冒泡排序」後回車

注釋「選擇排序」後回車

中文注釋實測完後又對英文注釋進行了測試,如下圖所示:

乘勝追擊,又對創建和上傳文件代碼進行自動生成測試,同樣得到了預期的效果。

對於簡單的函數實測讓我感覺這個工具還挺不錯的,因為可以根據自己想要的注釋自動生成多個代碼建議,這樣不僅節省了大量的編碼時間,而且多種代碼建議可供選擇,一定程度上提升了自己編寫代碼的質量。

4.2 代碼安全掃描實測

接下來用 CodeWhisperer 去掃描我們代碼中的安全漏洞,以下是運行按鈕的位置

打開我想掃描的文件,然後運行安全掃描

結果發現 CodeWhisperer 探測到該文件中有兩個安全問題。 通過查看問題欄,點擊事件定位到代碼中,我們將滑鼠移入到突出顯示的代碼,查看建議的措施,如下所示,問題指出在該例子中未加密的 AWS 憑證被記錄下來,是一個安全漏洞,它建議我們重寫代碼並且修復該漏洞。

同樣查看第二個問題,CodeWhisperer 告訴我們講應該把標識設置為 True。

根據 CodeWhisperer 的建議,我進行了對應修改,兩處安全問題修改如下:

修改後重新掃描了文件,掃描完成,顯示沒找到問題。

對於安全掃描這項功能,我還是挺驚艷的,沒想到能實測找出問題並給出對應的解決問題,因為這一點我對 CodeWhisperer 的好感又增加了。

4.3 代碼引用跟蹤功能實測

在這裡想實現一個函數來創建一個 dynamo DB 表。 如下圖所示進行了實際測試 「implement a function to create a dynamoDB table」

以下是 CodeWhisperer Reference Log 給出的建議:

根據代碼建議標註被文件跟蹤器標記為 MIT 許可證,其引用了 Apache-2.0 許可證下的代碼。我選擇接受了這些標記代碼,然後發現 CodeWhisperer 自動記錄了引用我需要的許可證信息,這樣我就可以在我的代碼上添加適當的許可證和歸屬信息。 這個功能實測完感覺也挺有用的,對代碼涉及到的許可證和歸屬信息問題進行了有效解決。

4.4 計算機視覺工程項目實測

在對官網顯示的幾項功能測試完後,又在平時用到的實際項目上進行了測試,我選取了常用的一些 CV 檢測模型,以下是 ShuffleNet 的實際測試效果。

首先,我在實例化訓練數據集上,對缺失的代碼段進行測試,看 CodeWhisperer 是否能聯繫上下文進行代碼補全。

進行回車操作後,CodeWhisperer 顯現出來了所給的建議。

目前看所給的建議正確,接著我又對凍結權重部分進行了測試,

這回我又利用了 CodeWhisperer 的快捷鍵 ALT+C 進行了測試,

結果顯示自動生成了 False 選項,測試到這裡真的讓我覺得這個工具是真的好,可以幫助我解決代碼中遇到的很多問題。 在訓練代碼中測試完,我又接著對檢測模型代碼進行了測試,如下圖所示在 transform 指向中為我建議了 img。

最後,我對檢測模型代碼進行了運行測試,正確的檢測出圖片為蒲公英 dandelion。

總的來說,CodeWhisperer 輔助我完成了 CV 模型的代碼編寫和模型檢測,達到了官網所展示的預期。接下來,我要讓 CodeWhisperer 幫助我完成更複雜的任務了,哈哈

五、Amazon CodeWhisperer 實測體驗總結

5.1 CodeWhisperer 可以幫助我成為一個更好的開發者嗎?

通過以上的測試,我覺得它可以幫助我成為一個更好的開發者。

首先,它可以為我節省大量的時間和精力,讓我能夠專注於改進、重構和測試。

其次,它通過承擔一些同質化的繁重工作,讓我有機會成為一個更好的程序開發人員。

比如上面的測試的例子是 Amazon 工具(經過 Amazon 開原始碼訓練)能夠表現出色的例子。

當然,在大多數開發人員需要花費很多時間的地方,比如編寫領域相關的邏輯時,我又多測試了一下,讓我們看看 CodeWhisperer 會不會也有幫助。

比如從 Python 文檔中的數據類示例開始。

@dataclass

class InventoryItem:

"""Class for keeping track of an item in inventory."""

name: str

unit_price: float

quantity_on_hand: int = 0

def total_cost(self) -> float:

return self.unit_price * self.quantity_on_hand

其實我想知道 CodeWhisperer 是否可以向這個類添加一個方法。讓我們看看如果添加註釋:" Function that return this item costs more than $10",會發生什麼?

@dataclass

class InventoryItem:

"""Class for keeping track of an item in inventory."""

name: str

unit_price: float

quantity_on_hand: int = 0

def total_cost(self) -> float:

return self.unit_price * self.quantity_on_hand

# Function that returns whether this item costs more than $10

def expensive(self) -> bool:

return self.unit_price > 10

結果是非常酷的。值得注意的是,CodeWhisperer 給函數起了一個直觀的名字,並包含了對 self 的引用。

接著,讓我們嘗試用 CodeWhisperer 來做測試,看是否會觸及它的極限。

# Function to test InventoryItem class

def test_inventory_item():

"""

Test InventoryItem class

:return:

"""

item = InventoryItem("Widget", 10, 5)

assert item.name == "Widget"

assert item.unit_price == 10

assert item.quantity_on_hand == 5

assert item.total_cost() == 50

assert not item.expensive()

在上面的代碼中,我輸入了注釋,CW 自動完成了剩下的工作。 測試似乎是一個極好的證明 CW 可以節省時間的例子。我不需要浪費時間去想測試的值,也不用輸入所有的成員變量和方法。

總的來說,可以幫助我成為一個更好的開發者,但是任何輔助工具都有利有弊,CodeWhisperer 也是才發布不久,通過測試我也想邀請大家去進行實際測試,可以對使用 CodeWhisperer 遇到的問題大家一起相互討論,一起促進這個編程助手疊代和完善~

版權聲明: 本文為 InfoQ 作者【攻城先森】的原創文章。

原文連結:【https://xie.infoq.cn/article/909704e9a44302aa28b2a44e9】。未經作者許可,禁止轉載。

文章來源: https://twgreatdaily.com/zh-my/fcdfd85e5b7511a451ed5b8dab06aca1.html