AI

AIを使用したプログラム生成は実用的か?まずは自分用の便利ツールを作ってみよう!

生成AIの発展が凄まじい

昨今の生成AIの発展ぶりはまさに日進月歩でちょっと油断していると追いついていけなくなります。

大規模言語モデル(LLM)では、少し(少しでもないか・・)前までは、OpenAIのChatGPTが代表的でしたが、googleのGemeniやAnthropicのClaudeなど対抗する生成性AIも発展してきており、オープンソースのMeta社のllamaの性能も追い上げてきています。

このような状況ですが日本人の生成AIの使用率は非常に低いというデータがあります。(https://www.nikkei.com/article/DGXZQOUA036VW0T00C24A7000000/)

また使用したとしても「会話のお遊び」程度でしか使用していない人も多いでしょう。(〇〇構文とか・・)

そのような中、着々とビジネスに取り入れている人も多く、今や生成AIは文章生成、画像生成はもとより、議事録書き起こし、資料整理、マインドマップ作成、プレゼン資料の作成など様々な用途で使用されています。

プログラマーは必要なくなるか?

そのような用途の中でもエンジニアとして興味あるのはプログラムコードの生成です。

私自身は、プログラマーがいわゆる要件定義などをするSE(システムエンジニア)より下に見られている事に抵抗がありました。

プログラミングは奥が深く決して簡単ではないということを数年前に記事にしたことがあります。

プログラミングは簡単か
プログラミングは本当に簡単なのか?今回は、難しい話は小休止にして、世の「プログラミングは簡単」という言説について所感を述べたいと思います。 プログラミングは簡単なのか?...

心の中ではプログラマー最強を唱えていて、プロジェクトマネージャーを担当するようになっても、ちょこちょこ便利ツールなどを使ってコーディングをしていたし、割と最悪の状況では他のプログラマーが作成したものを作り直したりもしておりました。(まあ、PMがコーディングするようになったらそのプロジェクトは終わってると言いますが・・)

大きい企業になるほどコンサルや要件定義のみをやってコーディングが全くできない人もいて、そんな人はエンジニアではないと思っておりました。結局、最終的に手を動かしてシステム・アプリケーションを作成するのはプログラマーであり、プロジェクトの成否もPMの手腕も重要ですが、どれだけ優秀なプログラマーを集めるかもかなり重要である事を実感してきました。

しかし、最近、ChatGPTを使用してソースコードの生成をしていると、この考え(プログラマー>>SE、PM)が少し揺らいできました。

もちろん、生成AIが生成するプログラムはまだまだ拙い事があります。

しかし生成されるコードの品質もプロンプトでどのような指示をしたかに依存する面も大きく、まさに必要なのは、プログラミングスキルよりも上流の設計スキル(プログラマーに明確に仕様を伝える)ではないかと思うようになってきました。

まずはツールを作ってみよう

とはいえ、現状ではまだまだプログラマの代替としてビジネスに使用するにはいくつかの壁があります。

一つのシステムを作るとなれば、仕様も複雑で膨大になるので、プロンプトのやり取りも膨大になります。

仮にそれがクリアできたとしても社外秘の設計仕様をプロンプトに入力するのには抵抗もあるでしょう(いくら学習には使用しないと言われても・・)

そのような状況の中ですぐにでも仕事に役立つのはちょっとした便利ツールの作成です。

日々の仕事の中で、エンジニアに限らず、様々な職種で簡単な繰り返し作業を効率化したいということがあるはずです。

以前、本サイトでは以下のような記事を投稿しました。

大量Excel
WSHで複数のExcelファイルを開いて「A1」を選択して保存させてみた。社畜時代の事ですが、トラブルJOBで大量のExcelファイルを開いて「A1」を選択して保存しなおすためだけに、招集された事があります。 ...

内容は顧客への納品時のExcelファイルを各シートをA1選択状態にしてかつ最初のシートを選択状態にして保存するというものですが、膨大なExcelファイルについて人海戦術でやろうとして人を招集したけど数分でツールを作れば解決できるでしょというお話です。

このような状況でAIさえあれば、プログラムができるエンジニアがいなくても簡単に解決でき作業を大幅に効率化できる可能性があります。

本記事では、それを示すためにいくつか簡単なツールを作成してみます。

プログラム生成に関しては、Claudeが最も優秀という話もありますが、今回は最も使用者が多いと思われるChatGPTを使用します。

なお、生成したコードの各自環境での実行に関しては保証するものではないので使用についてはそれぞれ自己責任でお願いします。

(例1)excelでA1選択して保存

まず、上で紹介した記事と同じように、指定したディレクトリ内のexcelファイルを全て開いて全てのシートのA1セルを選択状態、かつ最初のシートを選択状態にして保存するスクリプトを作成します。

プロンプトは以下の通りです。

プロンプト1excelでA1選択して保存するコード生成プロンプト

大事なのは役割を与える(「あなたは優秀なプログラマーです」)事です。この1文を付け加える事によって精度が違ってきます。

以下のような回答が返されました。

answer1ChatGPTからの回答

 

生成されたプログラムはpower shellで書かれており、以下のようになりました。

# ExcelのCOMオブジェクトを初期化
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

# ログファイルを作成
$logFile = "C:\path\to\logfile.txt"
Remove-Item -Path $logFile -ErrorAction SilentlyContinue
New-Item -Path $logFile -ItemType File

# 再帰的にディレクトリを検索してExcelファイルを処理する関数
function Process-ExcelFilesInDirectory($directory) {
    $files = Get-ChildItem -Path $directory -Recurse -Include *.xlsx, *.xls

    foreach ($file in $files) {
        try {
            # Excelファイルを開く
            $workbook = $excel.Workbooks.Open($file.FullName)
            
            # すべてのシートでA1セルを選択する
            foreach ($sheet in $workbook.Sheets) {
                $sheet.Activate()
                $sheet.Cells.Item(1,1).Select()
            }

            # 最初のシートを選択する
            $workbook.Sheets.Item(1).Activate()

            # 保存して閉じる
            $workbook.Save()
            $workbook.Close()

            # 成功をログに記録
            Add-Content -Path $logFile -Value "$($file.FullName): 成功"
        } catch {
            # エラーが発生した場合は失敗をログに記録
            Add-Content -Path $logFile -Value "$($file.FullName): 失敗 - $_"
            continue
        }
    }
}

# 処理対象のディレクトリを指定
$directory = "C:\path\to\excel\directory"
Process-ExcelFilesInDirectory $directory

# Excelオブジェクトを終了
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

 

このコードのログファイル出力先と対象ディレクトリを変更して実際に実行しました。出力したログは以下の通りです。(パスは実際のパスから変えています)

\test1\test11\file3.xlsx: 成功
\test1\test11\file4.xlsx: 失敗 
- Excel でファイル 'file4.xlsx' を開くことができません。ファイル形式またはファイル拡張子が正しくありません。
ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。
\test1\file1.xlsx: 成功
\test1\file2.xlsx: 成功

 

なお、1ファイル(file4.xlsx)のみ実態はテキストファイルですが拡張子だけ.xlsxにしたものを混入させましたが、うまく処理(失敗してスキップ)しており、それ以外のファイルはちゃんとA1セル選択かつ最初のシート選択になっていました。

今回、たまたま(?)、一回で動作するソース出力が成功しましたが、バグがあるコードを生成することも多々あり、その場合は、プログラムの挙動やエラーメッセージを送って何回かやりとりをすればうまくいくでしょう。

また、今回は仕様が単純なので例外処理についても最初から記載しましたが、最初は例外処理は記載ないで正常処理がうまくいくコードを出力させた後に、徐々に細かい仕様を追記していく方が良いです。最初から仕様を詰め込みすぎるとバグを入れ込む確率が高くなります。

(例2)ファイル分割

私自身がAIでのソースコード生成で特に重宝しているのは、テキストの加工処理です。

当方、JavaとPythonはそれなりに慣れていますが、ちょっとテキストファイルを加工する時にわざわざJavaやPythonで書くのは仰々しくかつ客先などでその環境がない場合もあります。そのような時にシェルクスリプトで書けば良いのですが、それほど精通していないので(読めるけどサラっと書けと言われると自信がない)、使うたびにググってコードを書かねばならず悩ましい問題でした。

そのような悩みも生成AIが解決してくれます。

以下、テキストファイルを分割するためのコードを生成させる例を掲載します。(ただし、それぞれのファイルにヘッダーは付与する。ここがミソです。

以下、ChatGPTへの質問と回答を掲載します。

prompt and answer2ファイル分割のためのChatGPTへの指示と回答

 

生成されたプログラムはawkを使用したシェルスクリプトで書かれており、以下のようになりました。

#!/bin/bash

# ヘッダー行を取得
header=$(head -n 1 list_all.txt)

# ヘッダー行を除いたデータ行を別ファイルに出力
tail -n +2 list_all.txt > data.txt

# データ行を3行ごとにグループ化(ヘッダー行を含む)
awk 'NR%3==1{x="temp"++i;}{print > x}' data.txt

# temp*という名前のファイルが作成されるので、それぞれにヘッダー行を追加
for file in temp*; do
    { echo "$header"; cat "$file"; } > "list_${file#temp}.txt" 
    rm "$file" 
done

# data.txtを削除
rm data.txt

 

先ほど、『大事なのは役割を与える(「あなたは優秀なプログラマーです」)事です』とか書いたのに、今回書くのを忘れました・・が、うまく動作するシェルスクリプトが出力されました。

ここで重要なのは、実際の出力イメージを提示する事です。「分割するけど、ファイルの最初にあったヘッダーはそれぞれのファイルのヘッダーとして云々」みたいなのを書くよりもうまく行きます。(対人間でもそうだと思いますが・・)

なお実際には1000行単位で分割させるものが必要だったので(例を提示するためにプロンプトでは3行にしました)、テストファイルで試した後に3を1000に変更して、実際に仕事で使用しました。

まとめ

以上、2例ほどChatGPTを使用して便利ツールのコードを生成する方法を紹介しました。

先述した通り、今回たまたま1回のやり取りでうまく行きましたが、1回では望んだ通りのプログラムが生成されない事も多々あります。
その場合でも簡単なツールならば大体3〜4回のやり取りをすれば、望み通りのものが完成するでしょう。

現時点(あくまでも現時点・・)では、「もうプログラマーは必要ない」は言い過ぎだと思いますが、ググって自分がやりたい事と似たような事をやっているソースを見つけて、それをコピーして自分で修正するという作業が、ChatGPTに自分用に特化した形で生成してもらうという作業になったのはかなり効率が良くなったと実感します。

「いやいや、そんな事だからコーディングスキルが上がらんのじゃ」と思う方もいるかと思いますが、おそらく人々がgoogleでコードを検索し始めた時も同じ事を言ってたと思います。ググる力がコーディング力の一部になったように、これからは生成AIでコードを生成する力もコーディング力になるのではないかと思います。(プログラマーが不要になる前の段階として・・)

おまけ

この記事のアイキャッチもChatGPTで生成しました。以前はフリー素材から適当そうなのを探して使用しておりましたが、案外探すのにも時間がかかっていたので、これだけでも相当便利になったと思います。

eyecatch1アイキャッチの生成