2021 年のGitHub Copilot のプレビューは、 ソフトウェア開発分野における生成 AI ツールの可能性をすでに実証しました。 2 年後、Copilot はますます改良され、コストがかかり (個人の場合でも)、競争にも直面しています。
後者は、 生成 AIに基づくコーディング アシスタントの適用範囲の大幅な拡大にもつながりました。そして、私たちのテストが示すように、ツールはコードを生成するだけではないこともできるようになりました。
テスト中の開発者向け第 3 世代 AI ツール
まず、この記事でテストした Gen-AI コーディング ツールの概要を説明します。
-
Amazon CodeWhisperer は、「コーディング コンパニオン」として Copilot と直接競合します。このツールは Visual Studio Code および JetBrains IDE とも統合されており、既存のコードに基づいたコメントや補完に応じてコードの提案を生成します。 Amazon ツールを使用すると、セキュリティ上の問題を発見することもできます。 CodeWhisperer は 5 つのプログラミング言語を包括的にサポートし、程度は低いもののさらに 10 のプログラミング言語をサポートします。オプションで、CodeWhisperer はコードにフラグを立ててログに記録することと、オープンソースのトレーニング データに似たコード提案をフィルタリングすることができます。
-
Google Bard は、大規模言語モデル LaMDA (Language Model for Dialogue Applications) への Web ベースのインターフェイスを表し、プログラミング タスクと関連トピックのサポートを提供できるようになりました。 Bard がオープンソース ライセンスの対象となる可能性のあるコードをリリースする場合は、ソースと関連情報が含まれます。さらに、吟遊詩人はコードを説明することもできます。
-
GitHub コパイロットCopilot X の機能にアクセスするには、現在 Copilot サブスクリプションが必要です。これにより、待機リストに登録されるようになります (私たちの場合、参加に招待されるまでに約 4 週間かかりました)。
ツールのテスト方法
このテストでは、テストした 3 つのGen-AI コーディング ツールに、さまざまな基準を考慮して Infoworld.com 上の記事をリストするという、もう少し複雑なスクレイピング タスクを実行しました。それぞれのツールには概要が記載されていますが、追加のヘルプはありません。コードの説明をサポートするツールでは、MIT のコンピューター サイエンス入門コースのPython コード例を試すこともできました。
テストされた生成 AI コーディング ツールの概要:
Scrape infoworld.com front page:
Open https://www.infoworld.com/
Find all articles by looking for links with 'article' in the href; extract title, author, date from each
List all articles alphabetically by title; eliminate duplicates
List all articles alphabetically by author last name
List all articles latest first
Amazon コードウィスパラー
コードの生成に関しては、Amazon CodeWhisperer はさまざまな方法で開発者をサポートできます。詳細とビデオチュートリアル、および包括的なドキュメントについては、 アマゾン ウェブ サービスのリソース ページを参照してください。
Amazon によると、CodeWhisperer の基礎となる大規模言語モデル(LLM) は、数十億行のコード (Amazon 所有のコードとオープンソースの両方) でトレーニングされました。たとえば、これにより AI コーディング ツールは、コメントに基づいてだけでなく、直接のコード コンテキスト (IDE で開かれている他のコンテンツ) も考慮してコードの提案を行うことができます。さらに、CodeWhisperer は、Python、Java、および JavaScript コードのセキュリティ脆弱性をチェックし、それらを修正するための対策を提案することができます。これに必要な脆弱性のデータとリストは、特に OWASP やさまざまなベスト プラクティスから得られます。
CodeWhisperer は、次の言語でコードを最も確実に生成します。
-
ジャワ、
-
パイソン、
-
C#。
これらはトレーニング データ コーパスで最も頻繁に使用されました。程度は低いですが、CodeWhisperer は以下についてもトレーニングされています。
次のツイートは、CodeWhisperer が日常生活で開発者をどのようにサポートできるかについての簡単な概要を示しています。
Amazon CodeWhisperer を使用すると、より多くの作業を迅速に行うことができます。 🚀💪⚡️
コードの生成と文書化に役立つ 3 つのテクニックを紹介し、生産性を大幅に向上させます。
もっと詳しく知る。 👉 https://t.co/kR4H4Y0rVu #AWS #GenerativeAI pic.twitter.com/RIynl5aqE8
— アマゾン ウェブ サービス (@awscloud) 2023 年 6 月 9 日
以下は、冒頭に示した概要に基づいて CodeWhisperer によって生成されたコードのスクリーンショットです。
残念ながら、コード出力は機能しません。CodeWhisperer は、多かれ少なかれ同じ目的のために複数の関数を提供しました。しかし、Amazon の Generative AI ツールは実用的なソリューションに近づいていました。細部までこだわりました(キーワード: 美しいスープ)。
テストの一環として、プロジェクトのセキュリティ スキャンも実施しました。驚いたことに、CodeWhisperer スキャンでは別のファイル (GitHub Copilot X によって生成された) でリソース リークが見つかりましたが、問題は発見されませんでした。
このファイルはオープン ソース参照をトリガーしませんでしたが、CodeWhisperer リファレンス ログには、CodeWhisperer がそのような参照を含むコードを提案するかどうかを制御する設定へのリンクがあります。私たちが調べた Amazon の例では、参照付きのコード提案にライセンス タイプが表示されていました。
Amazon CodeWhisperer – 結論
CodeWhisperer は IDE でコードを生成し、セキュリティ チェックを実行しますが、チャット ウィンドウやコードの説明がありません。このツールは宣伝どおりに機能し、個人の開発者は無料で利用できます。企業は GitHub Copilot と同じ月額 19 ドルを支払います。
グーグル吟遊詩人
Google の Bard も2023 年 4 月末からプログラマーを支援しています。 Bard 自身の声明によると、Bard は次のプログラミング言語をサポートしています。
Bard は、これらの言語でコードを生成、デバッグ、説明できます。さらに、Google の開発者向け Generative AI は、あるプログラミング言語から別のプログラミング言語に翻訳することもできます。
サイト スクレーパーのコード生成は、一見すると比較的信頼できるものに見えましたが、詳しく調べてみると、いくつかの問題がありました。ダブルクリックするだけでColabでコードが開きましたが、実行しようとするとタイプ エラーが発生しました。問題を修正する代わりに、コード生成を再度実行しました。結果はもう少し意味のあるものになりました。ただし、Colab でコードを実行しようとすると、属性エラーがスローされました。このトレースバックが Bard に返された後、ツールは修正を提供しましたが、その結果、別の場所で型エラーが発生しました。
以下は、InfoWorld.com スクレーパー用に Bard によって生成されたコードです。
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.
そして、実行時の結果は次のとおりです。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
in ()
39
40 if __name__ == "__main__":
---> 41 articles = scrape_infoworld()
42
43 # Print the articles.
6 frames
in (x)
in (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
ソースとプログラム コードの説明に関しては、バードはテストでより良いアイデアを提示しました。 MIT コード例に関する彼の説明が非常に優れていたため、これが彼のトレーニング データの一部ではないかと疑うほどでした。提供されるコードは次のとおりです。
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 = []
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 の時々非常に詳細な回答からの抜粋:
The code you have provided is a Python program that simulates a stock market. The program defines three classes:
Stock: This class represents a single stock. It has properties for the stock's price, history, distribution, volatility, and last change influence.
SimpleMarket: This class represents a simple stock market. It has a list of stocks, a bias, and a volatility upper bound.
Market: This class inherits from SimpleMarket and adds a daily bias range property. The program also defines several functions:
• simMkt: This function simulates the market for a given number of days and momentum factor.
• plotAverageOverTime: This function plots the average closing price of the stocks over time.
• plotDistributionAtEnd: This function plots the distribution of prices at the end of the simulation.
• runTrial: This function runs a single simulation and plots the results.
• runTest: This function runs a number of simulations and plots the results.
The program is run by calling the runTest function with the desired number of simulations. The program will then generate three plots:
• A plot of the average closing price of the stocks over time.
• A plot of the distribution of prices at the end of the simulation.
• A plot of the history of prices for each stock.
The program can be used to simulate a variety of different stock markets. By changing the values of the parameters, you can change the volatility of the market, the bias of the market, and the momentum factor. You can also use the program to simulate different trading strategies. For example, you could simulate a strategy that buys stocks when they are undervalued and sells them when they are overvalued.
Google Bard – 結論
Bard にはチャット インターフェイスがあり、コードを生成して説明しますが、インタラクティブな IDE 統合はありません。上記のプログラミング言語のいずれかでコードを生成、デバッグ、または説明したい場合は、Google の完全に無料の Generative AI ツールを試してみる価値があります。
GitHub コパイロット X
GitHub コパイロット間違いや幻覚が起こりますが、以前ほど頻繁ではありません。
GitHub Copilot はすでに、開発者が IDE でより高速にコードを作成できるよう支援しています。しかし、次は何でしょうか?
私たちの答えは GitHub Copilot X です。これは、AI を活用したソフトウェア開発の将来に対する私たちのビジョンです。ぜひチェックしてみてください⬇️ https://t.co/3Xrn7dAPgi
— GitHub (@github) 2023 年 3 月 22 日
Copilot X は、特に次のプログラミング言語をサポートしています。
-
パイソン、
-
JavaScript、
-
タイプスクリプト、
-
ルビー、
-
ジャワ、
-
C++、
-
C#、
-
PHP、
-
行く、
-
迅速、
-
コトリン
-
さび。
テストの一環として主にPython を使用しました。
Copilot X の最も顕著な失敗は、Web スクレイピング タスクでした。 AI ツールは、表面的には信頼できるように見えるコードを生成しました。しかし、よく見てみると、それが決して機能しないことが明らかになりました。さらに悪いことに、Copilot Chat を通じてさまざまな問題に対処した後、ツールはますます行き詰まりました。すべての AI ヘルパーと同様に、Copilot X によって生成されたコードは、未知のプログラマーからのプル リクエストと同様に注意して扱う必要があります。
Copilot X が MIT コード例の説明を求められたとき、彼は部分的に正しい答えを返しました。このツールから多くの説明作業を行う必要がありました。
Github Copilot X – 結論
プログラミング エディターのコード生成機能 (現在、Visual Studio の現行バージョンと Visual Studio Code の最新 Insider バージョンのみをサポートしています) に加えて、Copilot X はエディターにGPT-4チャット パネルも追加します。また、ターミナル インターフェイス、単体テストの生成とプル リクエストの説明のサポート、ドキュメントから説明を抽出する機能も提供します。個人は Copilot (X) に 10 ドルを支払い、企業は月額 19 ドルを支払います。
開発者向けの生成 AI ツール – テストの結論
注意すべき点は、たとえ個々の結果 (Bard や Copilot X からのコードの説明など) が説得力を持っていたとしても、提示された Gen-AI コーディング ツールはどれも現在完全に開発されていないということです。
したがって、私が企業に推奨するのは、AI コーディング ツールを監視し、開発者にそれらを実験するよう奨励することです。ただし、ソフトウェア開発者がこのタイプのツールを完全に信頼するにはまだ時期尚早です。 (FM)