AI Programmerを使ってみて思ったこと
TL;DR
- AI ProgrammerはAtCoder Beginners ContestのB問題程度なら解いてくる
- AIのプログラマはコードレビューに使えるんじゃない?
はじめに
私は GitHub Copilot を始めとする、AIによる自動プログラミングに関するツール・サービスは触れてきておらず、先日公開された AI Programmer で初めてこの世界に触れています。
なので、既にCopilotなどを触れてきた人が既に抱いてきた感想かもしれないことを留意ください。
AI Programmer
2022/10/03、私が把握している限り初めて大々的に 日本語に対応した AIの自動プログラミングサービス「AI Programmer」が公開されました。
対応言語は、この記事を書いている2022/10/07時点では以下のとおりで、メジャーどころは概ね取り揃えているなという感想を抱きます。
実際に使ってみる
使い方は非常に簡単で
- 使用言語
- 日本語の説明
を入力して「コードを生成」を押すだけです。
例えば「学籍番号が123456789の生徒が履修している講義」を抽出するSQL文を生成してもらいます。
すると、出力結果は
SELECT * FROM lectures
WHERE lecture_id IN
(SELECT lecture_id FROM student_lectures
WHERE student_id = 123456789)
です。
サブクエリを使っているので少しパフォーマンスが心配かな?と思う部分もありますが、例えば大学の講義レベルでは十分でしょう。
競技プログラミングの問題を投入してみる
さて、それではもう少し踏み込んで、競技プログラミングの問題にも挑戦してみようと思います。
Copilotなんかではもう試されており、AtCoder Beginners Contest (通称: ABC) のA問題程度であれば解けることはわかっています。
今回もAtCoderさんの ABC問題を投入してみて、どうなるか見てみたいと思います。
問題は ABC 266 にします。
A - Middle Letter
1.まずはA問題です。
制約事項に「文字数が奇数であること」が含まれていますが、一旦無視して問題文をそのまま入れてみた結果が↓です。
#include <bits/stdc++.h>
using namespace std;
int main() {
string S;
cin >> S;
if (S.size() % 2 == 1) {
cout << S[S.size() / 2] << endl;
}
}
何も考えずにこれを提出してみたところ、なんの問題もなくAC (全完)となりました。
B - Modulo Number
2.続いてB問題です。
こちらも制約事項は結果に影響しないかなと思うので無視して問題文を投入します。
ただし、箇条書きがうまく処理されるかわからなかったのと、期待した出力が得られなかったので、少し投入する問題文を編集しました。
標準入力から−10^{18}以上10^{18}以下の整数Nが与えられます。
N−xは998244353 の倍数、を満たす0以上998244353未満の整数xを求めてください。
さて、この問題文から得られたプログラムをそのまま投入すると、B問題も全完でした。
#include <bits/stdc++.h>
using namespace std;
int main() {
long long N;
cin >> N;
for (long long x = 0; x < 998244353; x++) {
if ((N - x) % 998244353 == 0) {
cout << x << endl;
return 0;
}
}
return 0;
}
C - Convex Quadrilateral
3.続いてC問題ですが、これは条件が色々複雑だったのかうまく正解を出力できませんでした。
競プロとは別の視点でプログラムを出力してみる
上記の通り、AI ProgrammerはABCのB問題程度であれば問題なく出力できることがわかると想います。
では、競プロの世界から離れて業務で活用できそうなプログラムを出力してみます。
例えば『Elasticsearchを使っていて、メンテ作業中にクエリをど忘れしてしまった』場合です。
今回は使用言語をPythonにします。
投入する文章はこんな感じでしょうか。
そして結果は以下のとおりです。
from elasticsearch import Elasticsearch
from datetime import datetime, timedelta
es = Elasticsearch(['http://localhost:9200'])
index = 'foo'
query = {
"query": {
"range": {
"@timestamp": {
"gte": datetime.now() - timedelta(days=7),
"lt": datetime.now()
}
}
}
}
res = es.search(index=index, body=query)
print(res['hits']['total']['value'])
これに関しては出してみただけで検証していないのですが、パッと見では正しい結果を出しているように見えます。
仮に間違っていても、微修正程度で動作するのではないでしょうか。
AIのプログラマとの付き合い方
※ここからはポエムの時間です
コードレビューの補助ツールとして使う
AI Programmerには「コードを日本語で解説」という機能があります。
ここに先程得られたプログラムを投入してみましょう。
C++の場合コードブロックで囲わないと出力されたりされなかったりと微妙に安定しなかったのですが、プログラムを端的に説明してくれていることがわかると思います。
とすると、コードレビューをしている時に「あれ、この処理よくわからないな」とか「ここ何を意図しているんだろう」とか思った場所を投入するような、補助ツールとして使うということができると思います。
AIの出力したプログラムの妥当性検証に使う
今後AI Programmerのようにコードを出力してくれるサービスが主流になっていく過程で必ず、「AIが出力したコードなんて信用できない」といった、「Excelで計算した結果を電卓で計算し直せ」を彷彿とさせる事案が出てきます。
そういった場合に、
- 複数のAIに同じプログラムを出力させて比較する
- AIに書かせたコードを別のAIに投入してコードレビューさせてみて妥当性を検証する
などといった方法で、時代遅れの輩を黙らせる手札とすることができるかもしれません。
(そもそも、しばらくは人手でテストコードを書いていそうな気がしますが・・・)
最後に
今回、どの程度の長文までなら正確に解釈してくれるか、といった検証はしません。
しかし1つの関数に収める処理は一言で説明できる程度が望ましいと私は思います。
とすると、逆説的にプログラムのパーツパーツを日本語の仕様で書いてAIに出力させ、そのパーツを組み上げる作業だけ人手で行う、といった工程でプログラムを完成させることが現実的になってきました。
さらに進化が進めば組み上げる作業も人の手から離れ、テストコードも自動で生成され、私のような泡沫プログラマの仕事はなくなっていき、日本語や英語で仕様を入力する日々が訪れるのだろうなぁ、と思わされてしまいました。
Discussion