Technology部ののっぴーです。
2023年は生成AIの発展が著しい1年でした。ここ数か月は生成AIだけでアプリやWEBサイトを作った事例もよく聞くようになりました。
自分もまったく知らない分野のソフトウェア開発に挑戦してみたくなり、ChatGPT4を利用してのRedmineプラグイン開発をおこなってみました。
結論から言うと、ChatGPT4のみで全行程をおこなうのは難しく、ある程度の開発知識・スキルは必要となりました。試行錯誤の過程を、実際の出力とあわせて紹介いたします。
目次
Redmineプラグインを作ろうと思った背景
現在ウォーターフォール型で開発している案件でRedmineでタスクを一元管理することとなりました。決め手となったのは、チケットの親子関係を複数階層にわたって設定でき、それをガントチャートとして一望できることでした。
しかし、チケットのエクスポート機能はCSV(もしくはPDF)でしか出力できず、CSVでは単純に親チケット列にIDが表示されるのみで、ガントチャートと比べて親子関係がわかりづらいという問題がありました(ガントチャート表示の際の表部分がそのままExcelとしてエクスポートされるとうれしいんですが……)。
そのため、Excel形式かつ、子チケットをスペースでインデントするエクスポート機能を作成することにしました。
■Redmine標準のCSVエクスポート
■理想のエクスポート形式
筆者のRubyスキル
- 開発経験なし
- Redmineのセットアップはできる
開発・ランタイム環境
- Ubuntu 22.04 on WSL2
- Redmine 5.0
- Ruby 3.1.4p223
- Rails 6.1.7.6
Redmineおよびランタイム環境はDocker Hubにある公式イメージ(redmine:5.0)のRuby/Railsバージョンに合わせました。今回は古いバージョンへの対応は考えず、マイナーバージョンまでをプロンプトで指定して開発することにしました。
成果物
今回作成した成果物はGitHubにあげております。
https://github.com/nohi/issue_excel_exporter
開発スタート
ここではChatGPTへのプロンプトと回答およびそれらに対するコメントを記載しています。
画像のプロンプトは最終版のみを載せておりますが、各プロンプトで平均2~3回ほど質問の再提出をしています。
最初のプロンプトと回答
では早速開発していきましょう。開発にあたって「ChatGPTで〇〇作ってみた」系の動画を参考に、プロンプトを真似してみました。
調整を5回ほど繰り返しましたが、このプロンプトを作成するまでに修正した点は下記のとおりです。
- ロールでRubyプログラマーであることを明記
- 使用するライブラリの明記
- プラグイン名やURLの指定
動作条件だけではPythonなどでプログラムを書き始めることがありました。
プロンプトをやり直すたびにライブラリを変更されることがあったため、自分でライブラリを調べてよさそうなものを使うように指示しました。
指定しないとサンプルとして適当な名前やURLでコードが生成されますが、後から変更しなおすのは手間なので最初から指定してあげたほうが良いです。
ChatGPTの回答は以下のとおりでした。
コードを省略しないようにと指示しているのに一部実装されず、コメントのみが書かれて省略されています。全部実装してほしいので、実装を続けるように指示を出しました。
2回目のプロンプトと回答
とりあえず、Excelファイルが出力されるコードができあがりました。しかし、いろいろと機能的に不満があります。
Redmine標準のCSVエクスポートではログイン中のユーザーの権限に応じて出力できるチケットやその項目名が制限されていました。また、出力する項目もユーザーが現在のチケット一覧ページで表示しているものを出力するような動作でした。
しかし、生成されたコードにはそのような機能がありません。これでは使い勝手が悪いので、Redmine標準のCSVエクスポートのように上記の機能を実装してもらうことにしました。
3回目のプロンプトと回答
実装したところ、意図したとおりに出力されるチケットが制限されているようでした。しかし、チケットの並び順は親子関係を無視して単純にチケットID順に並んでしまっていました。
親子関係にあるチケットはまとまってほしいので修正してもらいます。
4回目のプロンプトと回答
チケットの親子関係でまとまるようになりました。しかし、出力対象の項目指定に不満があります。
Redmine標準のCSVエクスポートでは、GETパラメータがない場合は、現在のセッションやデフォルトで利用するクエリをもとに自動的に出力対象を設定してくれていました。
この辺りは何度かプロンプトで指示してみてもうまくコード化してくれなかったため、仕方なくRedmineのソースコードを読み、利用しているクラスなどを指定することにしました。
5回目のプロンプトと回答
結構雑に指示しましたが、期待どおりの動作となるコードを出力してくれました。変わったのは数行なので、Redmineのソースコードからコピペしたほうが早かった気はします。
ここで変更部分を手動でマージするのも面倒になってきたので、今までの実装したコードをすべて出力してもらい、それらをコピペすることにしました。
6回目のプロンプトと回答
回答で出力されたコードをコピペしてExcelファイルが出力されるようになりました。しかし、出力される項目が固定のままでした。
この部分の修正を何度かプロンプトで指示してもうまく修正してくれなかったため、再びRedmineのソースコードを読み、CSVエクスポート部分の処理をまねることにしました。
処理をまねて自分で修正したところ、親子チケットのソート部分がデグレしてしまい、うまくまとまらなくなってしまったため、ソート部分を空の関数sort_issues()として記述し、生成AIに関数の中身を実装してもらうことにしました。同様にwrite_worksheet()関数の実装も指示しました。
7回目のプロンプトと回答
回答のコードを実装し動作確認したところ、子チケットが複数回出力されるようになっていました。同じチケットが2回以上出力されないように修正してもらいます。
このあたりでプロンプトの指示出しにも疲れてきてしまったため、スクリーンショットで現状を伝えることにしました。
8回目のプロンプトと回答
この修正により、子チケットがインデントされなくなってしまいました。重複して出力しない処理のほうが優先して働いてしまっているようです。親子関係のほうを優先するように修正してもらいます。
9回目のプロンプトと回答
いつの間にかまた出力項目が固定化されてしまっていました(どうして……)。修正してもらいましょう。
10回目のプロンプトと回答
この修正コードを実装することでやっと親子チケットがまとまるようになりました。しかし、よく見るとチケットの題名だけでなく、すべての項目でスペースによるインデントがされるようになっていました。
レベルに応じたインデントはタイトルカラムのみに適用となっていないですね。ここも修正してもらいます。
11回目のプロンプトと回答
この修正コードを実装すると今度は一部の項目が空で出力されるようになってしまいました。ここも修正してもらいます。
12回目のプロンプトと回答
ここでようやく意図したとおりに動くようになりました。最終的にできあがったコードは約110行程度でした。
ChatGPT4によるコード生成の所感
チケットのソート部分など、入出力が決まっている部分についてはある程度期待したコードを生成することができました。
一方で、アプリやフレームワーク独自の機能を呼び出して追加の実装をしてもらうのはなかなか意図したとおりにいかず、自分で調べたりソースコードを読んだりする必要があるように感じました。
Excel出力部分以外の開発について
実は記事内で実装したExcel出力部分以外にも、ダウンロードボタンの設置などもChatGPT4で作成を試みたのですが、こちらはほとんどのケースでエラーが発生し、またエラーの修正にも多くの時間がかかってしまいChatGPTだけではどうにもなりませんでした。結局他のプラグインを参考にしながら自力で作成しました。
まとめ
今回はChatGPTによるRedmineプラグイン開発に挑戦しました。生成AIの便利さを感じる一方で、現時点では利用者側が生成されたコードの取捨選択などをおこなうためのプログラミングスキルや知識も必要であると感じました。
なお、記事執筆時点ではプロンプトで画像を利用するとChatGPTへのリンク共有ができませんでした。
生成AIを業務や新規ビジネスで活用したい方へ
弊社LIGは、UI/UXの知見とグローバルな開発体制を強みに、企業のDXを戦略設計から運用まで一貫してサポートしています。
2023年からは生成AI/XRなどの先端テクノロジーの第一人者である梶谷健人氏を顧問に迎え入れ、生成AIコンサルティングサービスをスタート。AIを活用した新規事業の創出や、社内の業務改善など、あらゆる面でAI活用を支援しています。
「AIを活用したいけど、どう進めたらいいのかわからない」など、ご興味のある方は下記ページより詳細をご覧ください。