未経験の言語でも簡単な処理ならChatGPTで何とかなった件

雑談

新しいプログラミング言語に挑戦することは、未経験者にとってもすでにプログラミングで生計を立てているエンジニアにとっても大きなハードルです。
未経験者であれば基礎から学ぶ必要があり、概念や構文に慣れるまで時間がかかります。
一方、すでに何かしらのプログラミング言語を習得しているエンジニアであっても、新しいプログラミング言語の独自の記述の仕方や最適なコーディングスタイルを理解し習得するのにはコストがかかります。

かくいう僕も最近仕事で未経験の言語に触る機会がありました。
メインの言語はC#なのですが一部のバッチ処理にPythonを使用しているプロジェクトで、新たにバッチ処理を追加するタスクが発生しました。
Pythonは未経験だったのですが、ちょうど手すき&そんなに忙しいタイミングでもなく、機能要件は割とシンプルなものだったので挑戦してみることにしました。

実装したい機能に必要なPythonの構文を一つ一つ調べてもよかったのですが、最近ChatGPT4を使い始めたこともあり、せっかくなのでChatGPTでバッチ処理を実行するスクリプトを実装してみることにしました。

そんなわけで今回は、よくありがちな機能要件をChatGPTを使いつつ実装していく流れを紹介したいと思います。

前提

まずは前提となる機能要件を定義します。
当然ながら実際の仕事の要件をそのまま載せるのは何かとよろしくないため、よくありがちな機能要件を考えてみました。

スクリプトの機能要件は以下のものとします。

  • フォルダAの中身にある特定のファイルをフォルダBにコピーする
  • コピー元とコピー先のフォルダ名は引数として指定できるようにする
  • コピーするファイルは”yyyyMMdd.log”という形式のファイルのみ
    (“20231231.log”, “20240527.log” 等)
  • フォルダAの中にさらにフォルダがあった場合、そのフォルダ階層もコピーする
  • コピーするファイルが含まれていないフォルダはコピーの対象外

なお、今回はPythonのスクリプトを作成するためすでにPythonを実行できる環境は整っているものとします。
次のセクションで実際にスクリプトも記載してあるので、もし実際に動作させてみたい人はPythonをインストールしてみてください。

実装

実は実装するだけならとても簡単です。
ChatGPTに以下のようなプロンプト(ChatGPTに対する命令文)を入力するだけです。

Pythonで以下の要件を満たすスクリプトを組んで
・フォルダAの中身にある特定のファイルをフォルダBにコピーする
・コピー元とコピー先のフォルダ名は引数として指定できるようにする
・コピーするファイルは"yyyyMMdd.log"という形式のファイルのみ
 ("20231231.log", "20240527.log" 等)
・フォルダAの中にさらにフォルダがあった場合、そのフォルダ階層もコピーする
・コピーするファイルが含まれていないフォルダはコピーの対象外

御覧の通り、Pythonのスクリプトであることを付け加えている以外は「前提」で記載した条件をコピペしただけです。
これで作られたスクリプトは以下の通りです。

import os
import shutil
import re
import sys

def copy_log_files(src_folder, dst_folder):
    date_pattern = re.compile(r"\d{8}\.log$")
    
    for root, dirs, files in os.walk(src_folder):
        # フォルダ内のlogファイルを探す
        log_files = [f for f in files if date_pattern.match(f)]
        
        if log_files:
            # コピー先フォルダの構造を保持
            relative_path = os.path.relpath(root, src_folder)
            target_path = os.path.join(dst_folder, relative_path)
            os.makedirs(target_path, exist_ok=True)
            
            for file in log_files:
                src_file = os.path.join(root, file)
                dst_file = os.path.join(target_path, file)
                shutil.copy2(src_file, dst_file)
                print(f"Copied {src_file} to {dst_file}")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python script.py <src_folder> <dst_folder>")
        sys.exit(1)
    
    src_folder = sys.argv[1]
    dst_folder = sys.argv[2]
    
    if not os.path.exists(src_folder):
        print(f"Source folder {src_folder} does not exist.")
        sys.exit(1)
    
    if not os.path.exists(dst_folder):
        os.makedirs(dst_folder)
    
    copy_log_files(src_folder, dst_folder)
    print("Copy completed.")

このスクリプトをPythonのファイルとして保存し、実行してみましょう。
ここでは仮に「test.py」という名前のPythonファイルを作成し、FolderAの中身をFolderBにコピーするものとします。
また、OSはWindowsでコマンドプロンプトから実行するものとします。

実行結果は次のようになりました。
ちなみに表示されているファイル、フォルダはこちらで適当に用意したファイルです。
もちろん表示されているもの以外にもコピーの対象にならないファイルやフォルダもFolderA内に作ってあります。

ちゃんと要件に沿ったコピー対象のみコピーされていることが確認できました。
もしこの時点で正しく動作しないようであれば、ChatGPTにエラー内容をコピペしたものをはりつけスクリプトを修正するようなプロンプトを入力しましょう。

実装のコツ

ChatGPTを使って実装を行う際に大事なのは要件をできるだけ詳細かつわかりやすく伝えることです。
今回の例で言うと要件を箇条書きで詳細に記載してわかりやすくしたところがポイントです。
要するにわかりやすい仕様書をChatGPTに渡してあげることが大事ということです。

ちなみに今回は要件がシンプルなので実は以下のようなちょっとわかりづらいプロンプトでもちゃんとしたスクリプトを出力してくれたりします。
ChatGPTすごい!

PythonでフォルダAとフォルダBを引数にしてフォルダAの中身のyyyyMMdd.logのファイルを含むフォルダ階層ごとフォルダBにコピーするスクリプトを作って

もし要件が複雑すぎてとても1つのプロンプトにまとめきれない場合は、要件を分解するのを検討してください。
今回の例で言えば、「ファイル名が特定の形式か判定する処理」と「ファイルをコピーする処理」に分割してスクリプトを作成してもらう、みたいな感じです。
さらにそれらを組み合わせるために、「条件Aを満たすファイルに対して処理Bを行う」といったようなスクリプトを作成してもらえば、あとは手動でもなんとかなりそうな気がしてきたのではないでしょうか。

あるいは単純な要件から初めてどんどん追加でプロンプトを入力するやり方も有効です。
例えば以下のような順にプロンプトを入力していくイメージです。

  1. 「ファイル名が特定の形式か判定する処理を作成して」
  2. 「指定したフォルダ内のすべてのファイルを対象に判定するようにして」
  3. 「条件を満たしたファイルを別の指定フォルダにコピーする処理をいれて」

注意点

とても便利なChatGPTですが、くれぐれも外部に公開してはいけない情報は入力しないようにしましょう。
ChatGPTに入力した情報は外部のサーバーが管理しています。
仮に個人情報や機密情報を入力してしまった場合は、個人情報保護法や秘密保持契約に引っかかる可能性があります。

外部に公開してはいけない情報とは例えば以下のようなものです。

  • 個人情報
  • サーバー情報
  • 各種ID、パスワードやアクセストークン
  • 会社名やプロジェクト名等の何に使うものか特定されかねないもの
  • 所属する組織内で使っているコードのコピペ

もちろん上記以外にもChatGPTに入力してよいか怪しいものは極力入力しないようにしましょう。

仮に上記の情報を処理するようなスクリプトをChatGPTに実装してほしい場合は、内容をぼかしてプロンプトを作成しましょう。
例えばとあるサーバーに特定のIDとパスワードでアクセスする処理を実装してほしい場合は、実際のサーバーの情報とIDとパスワードを入力するのではなく、「サーバーAにID:UserX、パスワード:Passでアクセスする処理」のような感じでプロンプトを作成し、出力結果をあなたが手動で修正するようにしてください。

学習

ここまででとりあえず「特定のバッチ処理を行うスクリプトの作成」という最低限の目標は達成できました。
ただ、これだけではあなたはChatGPTのプロンプトの作成スキルは身についても、新しいプログラミング言語のスキルが身に着いたとは言えません。

そこで次は作成されたスクリプトの各記述がどのような意味を持っているのか学習する必要があります。
早速ChatGPTに対して「一行ずつ詳しく解説して」とプロンプトを入力しましょう。
以下のような実行結果が出てきます。
(全部載せると長すぎるため、最初の部分だけ載せてます)

どうでしょうか?
少しでもプログラミング言語をかじったことがあれば、なんとなく意味がわかるのではないでしょうか。
ましてや実際にエンジニアとして働いている人であれば、得意なプログラミング言語と比較してみて「ああ、○○の言語で言う××の書き方みたいな感じね」となるでしょう。

あなたの知っているプログラミング言語と記述の仕方が異なる部分も見つかると思います。
そういった場合はさらに詳しく解説をするようプロンプトを入力してみると良いです。
例えばC#であれば変数の前に型の定義が必要だったり、処理の最後に「;」(セミコロン)を入力する必要があります。
それについて解説を求めた結果が以下です。

まだまだ不明点があれば納得のいくまで確認していきましょう。
ChatGPTの回答だけだと信ぴょう性に不安がある場合は、書籍や公式ドキュメントやネットの記事を探して確認するのも良いと思います。
いずれにせよ一から全部あなた自身が情報を探すよりは効率的に学習が進むことでしょう。

まとめ

ChatGPTとっても便利ですね!
もちろん他のAIサービスでも似たようなことはできると思います。
コーディングに特化したAIサービスもあるようなので、それらを使ってみるのも面白いかもしれません。

システム開発未経験の方が勉強の補助に使うも良し、すでにエンジニアとして活躍している人が仕事の幅を広げるために活用するも良しです。

今回はPythonのスクリプト作成でしたが、JenkinsのスクリプトやGithubActionsのジョブ等の作成にも活用できます。
それらの技術に今まで触る機会がなかった人は、これを機に簡単な処理の作成から挑戦してみてはいかがでしょうか。

せっかく便利なサービスがあるのですから、ぜひともあなたのスキルアップに活用してみてください。

コメント

タイトルとURLをコピーしました