AIを活用したプログラミングに興味があり、先日、AI Programmerについて知った。
ただ、AI Programmerについて具体的なことを知らないため、教えて欲しい。
こんなお悩みを解決します。
先日、日本語の文章を解析し、AIがソースコードに変換してくれるサービス「AI Programmer」が公開されました。
AIがプログラミングを行う時代になったことに驚きつつ、どの位の性能があるか、実際に体験してみました。
リンク先も併せて紹介するので、興味がある方は実際に動かしてみて下さい。
AI Programmerとは
AI Programmerの公式サイトに、以下のような説明がありました。
日本語で指示を出すだけでコードを自動で生成してくれます。AI Programmerエンジニアを強力にサポートします。
https://aiprogrammer.hashlab.jp/
つまり、人が指示した内容に合わせ、AIが自動で実装結果を返却してくれるサービスとなります。
2022年10月5日時点では、プロトタイプが無料で公開されているため、自由に利用することができます。
サンプルの実行結果
公式サイトには、以下のようなサンプルも記載されていました。
Python
https://aiprogrammer.hashlab.jp/
データベースから値を取得してCSVファイルに変換する。
どんな結果が返却されるか気になったので、実際に実行してみました。公式サイトにアクセスし、日本語で実装内容を指示してみます。
毎回結果が異なる可能性を考え、2回実施してみました。
インデントまではそろっていなかったため、私が出力結果を反映する際にインデントも揃えています。
1回目の実行結果
1回目の実行結果は、以下のようになりました。
# データベースから値を取得してCSVファイルに変換する。
from database import *
convert_to_csv(get_values())
ライブラリから読み込まれた関数が実行されています。
databaseの実装によっては動く気がしますが、必ずしも利用できる形式ではないかなぁと思いました。
2回目の実行結果
気を取り直して、もう一度挑戦しました。
結果は以下のようになりました。
# データベースから値を取得してCSVファイルに変換する。
from database import get_values
values = get_values()
with open('file.csv', 'w') as f:
for values in values:
f.write(','.join(value) + '\n')
今回は、それっぽい結果が得られています。
Fizz Buzz問題
よくある問題ですが、Fizz Buzzを解かせてみました。
入力情報
今回は、以下のような指示を出してみました。
1から100の間で、3の倍数の場合は「Fizz」、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合は「Fizz Buzz」、それ以外は現在の数字を出力する。
出力結果
出力結果は以下のようになりました。
# 1から100の間で、3の倍数の場合は「Fizz」、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合は「Fizz Buzz」、それ以外は現在の数字を出力する。
for i in range(1,101):
if i % 3 == 0 and i % 5 == 0:
print("Fizz Buzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
想定通りの結果が得られました。
ここまでうまく機能するのは正直、驚きました。
平均値・分散の算出
次は、平均値、分散の算出をさせてみます。
与えられた配列の平均値と分散を算出することになります。
まず、Pythonによる実装例を示します。
# 平均値
def mean(arr):
_mean = sum(arr) / len(arr)
return _mean
# 分散
def var(arr):
_mean = sum(arr) / len(arr) # 敢えて定義したmean関数は利用しない
_sum = 0
for val in arr:
_sum += (val - _mean) ** 2
_var = _sum / len(arr)
return _var
これらをAI Programmerに解かせてみます。
入力情報
平均値を計算する際は、以下のような指示を出します。
与えられた配列の平均値を計算する関数を作成してください
分散を計算する際は、以下のような指示を出します。
与えられた配列の分散を計算する関数を作成してください
出力結果
平均値を計算するプログラムの出力結果は、以下のようになりました。
# 与えられた配列の平均値を計算する関数を作成してください
def avg(arr):
sum = 0
for i in range(0, len(arr)):
sum += arr[i]
return sum / len(arr)
分散を計算するプログラムの出力結果は、以下のようになりました。
また、このタイミングで急にインデントを意識した出力をするようになりました。
# 与えられた配列の分散を計算する関数を作成してください
def calculate_variance(array):
variance = 0
mean = sum(array)/len(array)
for num in array:
variance += (num-mean)**2
return variance/len(array)
期待通り動作していますね。
高難易度な実装
最後に、信号処理分野や画像処理分野で登場する処理を実装させてみたいと思います。
信号処理
信号処理分野では、真値として正規乱数を利用することが多いです。
その際に、ボックス・ミュラー法(Box-Muller’s method)という方法を使って乱数を発生させます。
余談ですが、ボックス・ミュラー法による正規乱数は、以下の式で算出できます。
$$
\mathrm{rand} = \sigma \sqrt{-2 \log{u_{1}}}\cos{(2\pi u_{2})} + \mu
$$
ここで、\(u_{1}, u_{2}\)は、(0, 1]の一様乱数、\(\mu, \sigma\)はそれぞれ平均値、標準偏差となります。
上記の正規乱数を発生させるプログラムを出力させてみます。
入力情報
入力情報は以下のようにしました。
平均0、分散1の正規乱数を1024点分出力するプログラムを作成してください。
出力結果
AI Programmerの出力結果は以下のようになりました。
# 平均0、分散1の正規乱数を1024点分出力するプログラムを作成してください。
import numpy as np
np.random.seed(0)
x = np.random.normal(0, 1, 1024)
まさかのライブラリを使用して結果を出力してきました。
正しく実装できているという点も驚きですが、ライブラリを利用するという発想も反映できている点に驚きました。
画像処理
画像処理分野では、RGBカラー画像をグレースケール画像に変換することがあります。
今回は、この処理をAI Programmerに実行させてみたいと思います。
またまた余談ですが、RGBカラー画像からグレースケール画像に変換する際は、以下の変換式を利用します。
$$
\mathrm{gray}_{i, j} = 0.3\mathrm{r}_{i, j} + 0.59\mathrm{g}_{i, j} + 0.11\mathrm{b}_{i, j}
$$
ここで、\(\mathrm{gray}_{i, j}\)は、\((i, j)\)の位置にあるグレースケール画像の画素値、\(\mathrm{r}_{i, j}, \mathrm{g}_{i, j}, \mathrm{b}_{i, j}\)は、\((i, j)\)の位置にある赤、緑、青の画素値となります。
入力情報
入力情報は以下のようにしました。
与えられたRGBカラー画像をグレースケールに変換する関数を作成してください。
出力結果
AI Programmerの出力結果は以下のようになりました。
# 与えられたRGBカラー画像をグレースケールに変換する関数を作成してください。
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
OpenCVのライブラリを利用するかなぁと思いましたが、numpyを用いて上手く実装できています。
驚くべきことに、組み込み定数Ellipsis(...)も活用してくれました。
簡単な実装であればサクっと実現してくれますね。
失敗例
ここまで、成功事例を掲載してきましたが、指示の仕方によってはうまく出力されないことがありました。
例えば、正規乱数を出力する際、最初は以下のような指示を出していました。※正規白色雑音は、平均0、分散1の正規乱数を意味します。
正規白色雑音を1024点分出力するプログラムを作成してください。
結果は以下のようになりました。
# 正規白色雑音を1024点分出力するプログラムを作成してください。
Create a program that outputs 1024 points of white noise.
うまく解析できない場合は、英訳を出力するみたいですね...
まとめ
今回は、日本語で指示を出すだけでコードを自動で生成してくれるサービスである「AI Programmer」を使ってみました。
思ったよりも高精度な実装結果を返却してくれたので、簡単なプログラムを書く場合には活用できる可能性がありそうです。曖昧な指示や専門用語が入ってくると解析に失敗するときがあります。
今後の発展に期待したいサービスの一つになります。興味がある方は、下記に公式サイトを記載しておくので、試してみてください。