1.はじめに
当記事では、
『取引先マスタの保守アプリ内の サブプログラム を 生成AI(Chat GPT) を用いて作成してみよう!』
という試みの中で、実施したことをまとめています。
初心者が探り探りで行って検証となっておりますので、
至らない点も多々あるかと思いますが、何卒ご容赦くださいませ...
2.目標
チームメンバーとの相談の結果、
以下の機能を持ったサブプログラム2つを作成することにいたしました。
- 取引先マスタの保守画面にて使用する想定の、
取引先コードの有無を検索しエラーチェックをする サブプログラム - 取引先マスタの登録の際に使用する想定の、
入力した郵便番号にハイフンを付与し登録する サブプログラム
この2つのサブプログラムについて
第一目標:「コンパイルが通る」
努力目標:「プログラムの想定していた動作ができる」
と目標を据えた上で作成することにしました。
3.使用した環境
区分 | 内容 |
---|---|
言語 | RPGLE |
サーバー | PUB400(IBMiが無料で提供されているパブリックサーバー) |
環境 | IBMi 7.5 |
開発ツール | IBMi Access Client Solutions(ACS) |
生成AI | ChatGPT |
「PUB400」の仕様上、日本語表記にすることでエラーが生じる懸念があったため、
エラーメッセージ等を途中で英語に変更しています。
4.目標仕様
区分 | 内容 |
---|---|
言語 | RPGLE固定フォーマット |
環境 | PUB400(IBM提供のパブリック環境) |
ファイル | TRMAST(取引先マスタ) |
5-1.検証① 取引先コードのエラーチェックサブプログラム
プロンプトとして用意したのは以下のようなものです。
あなたはシステムエンジニアで、データベースの設計のプロフェッショナルです。
取引先マスタの管理画面で用いることのできるサブプログラムの完全固定フォームのRPGLEのソースを提示してください。
変数名はわかりやすいように名付けてください。
プログラムの仕様は以下の通りです。
取引先マスタ名:TRMAST
取引先コード名:TRTRCD(10ケタ)
■ 仕様
・メインプログラム内で取引先コードを入力する欄で取引先コードを入れた状態で任意のFnキーを押下すると、
その欄に入力されている取引先コードが取引先マスタ内に存在するかを確認する。
・もし存在しない場合は「naiyo」というエラーメッセージが出る
・欄に取引先コードが未入力だと「irete」、10桁に満たない数字を入力した状態で任意のFnキーを押下したら、「tarinai」とエラーメッセージを出してほしい
■ 各画面共通Fnキーは
F3=終了
F12=前画面に戻る です。
以上
5-2.検証① 最初の結果
出力されたソースコードをそのまま入力した結果、
- 固定式フォームを指定したのにフリーフォームで記述
- CHAINなど演算項目の順序の反転
- そのままコピペしても起きる桁ずれ
等の問題が生じ、コンパイルが通ることはありませんでした。
下記に最初に出力したものを記載します。
(取引先コードの桁数やエラーメッセージが異なるのは私のミスなので見て見ぬふりを...)
最初に出力されたソースコード
FTRDSPF CF E WORKSTN
FTRMAST IF E K DISK
D MsgID S 7A
D PartnerCode S 6S 0
D PartnerCodeC S 6A
D FoundFlag S 1A INZ('N')
D Blank6 C CONST(' ')
C *IN03 IF RETURN
C *IN12 IF RETURN
C EXFMT TRDSP01
C EVAL PartnerCodeC = %EDITC(PartnerCode: 'X')
C IF PartnerCodeC = *BLANKS OR %LEN(%TRIMR(PartnerCodeC)) < 6
C EVAL MsgID = 'MSG001'
C GOTO ErrorDisplay
C ENDIF
C PartnerCode CHAIN TRMAST FoundFlag
C IF %FOUND
C EVAL FoundFlag = 'Y'
C ELSE
C EVAL MsgID = 'MSG002'
C GOTO ErrorDisplay
C ENDIF
C GOTO ProcessEnd
/FREE
// --- エラー表示処理 ---
/END-FREE
C ErrorDisplay TAG
C SELECT
C WHEN MsgID = 'MSG001'
C EVAL MSGFLD = '取引先コードは6桁の半角数字で入力してください。'
C WHEN MsgID = 'MSG002'
C EVAL MSGFLD = 'この取引先は存在しません。'
C ENDSL
C EVAL *IN99 = *ON // MSGFLD 表示用(仮想フィールド制御)
C EVAL *IN50 = *ON // PartnerCode入力欄を反転表示(仮定)
C EXFMT TRDSP01
C GOTO *INZSR
C ProcessEnd TAG
C // 正常処理があればここに続ける
C GOTO *INZSR
C *INZSR BEGSR
C Z-ADD 0 PartnerCode
C CLEAR MSGFLD
C *INLR = *ON
C ENDSR
その中でもフリーフォームの記述はプロンプト内で指摘をしたところ、
すぐに改善が見られたのですが...
5-3.検証① 問題点
前述の問題点の中でも、
- CHAINなど演算項目の順序の反転
- そのままコピペしても起きる桁ずれ
この2点では何度指摘をしても同じ返答があるだけで改善がなかなか見られず
なかなか苦戦を強いられました。
今回は初学者を想定して行った(私自身もほぼほぼ初学者であった)ため、
- そもそもどこで桁ずれが起こっているのかわからない
- どれほどズラせば改善するのかがわからない
と大きく分けて2つの点において困難な点がありました。
5-4.検証① 対策
そこで、対策方法として取ったのが
コンパイルのエラーメッセージを生成AIにそのまま送る
という手法でした。
wrkoutq [username]
というコマンドを利用し、
このエラーメッセージをコピペして生成AIに原因を聞く。
あるいは、
SEUで表示される下のエラーメッセージと原因となっている文を一緒にコピペして生成AIに原因を聞く。
このようにコンパイルのエラーメッセージを生成AIにそのまま送ることで
かなり無意味なやりとりが減り、なるべく最短経路でエラーを減らせると感じました。
5-5.検証① 結果
結果としては、
上述の対策を何度か行いブラッシュアップを行うことで、
無事コンパイルを通すことができました。
また動作に関しては、
(生成AIに聞きながら)テストプログラムを作ったところ、
取引先コードの桁数の要件は満たしているものの取引先マスタにはないコードを入力した場合のみ、
想定通りのエラーメッセージが出ず、
他は想定通りのエラーメッセージが表示されました。
おそらく、当初は取引先マスタにある「取引先コード」のみをキーとして設定していたのですが、
もう一つキーを追加した影響かと思われますが、
原因究明・修正まではいくことができませんでした。
ご参考までに、以下に最終的なソースコードを記載します。
H DFTACTGRP(*NO) ACTGRP(*CALLER)
FTRMAST IF E K DISK USROPN
D CustCode S 10A
D TRTRSC S 3A
D ErrorMessage S 50A
C *ENTRY PLIST
C PARM CustCode
C PARM ErrorMessage
C IF %Trim(CustCode) = *BLANKS
C EVAL ErrorMessage = 'irete'
C RETURN
C ENDIF
C IF %Len(%Trim(CustCode)) < 10
C EVAL ErrorMessage = 'tarinai'
C RETURN
C ENDIF
C EVAL TRTRSC = *Blanks
C OPEN TRMAST
C CustKey KLIST
C KFLD CustCode
C KFLD TRTRSC
C CustKey CHAIN TRMAST 90
C IF *IN90 = *ON
C EVAL ErrorMessage = 'naiyo'
C ELSE
C EVAL ErrorMessage = *BLANKS
C ENDIF
C CLOSE TRMAST
C RETURN
6-1.検証② 郵便番号にハイフンを付与するサブプログラム
プロンプトとして用意したのは以下のようなものです。
命令文
あなたはシステムエンジニアで、データベースの設計のプロフェッショナルです。
取引先マスタの保守画面で用いることのできるサブプログラムの完全固定フォームのRPGLEのソースを提示してください。
変数名はわかりやすいように名付けてください。
プログラムの仕様は以下の通りです。
取引先マスタ名:TRMAST
#条件
・取引先マスタの保守のメインプログラム内で取引先マスタを登録・更新する際に、
7桁の郵便番号を入力すると最初の3桁と後ろの4桁の間に-(ハイフン)を入れて
取引先マスタに登録するサブプログラム
6-2.検証② 結果
結果から申し上げると、
上述で学んだコンパイルのエラーメッセージを生成AIにそのまま送るという手法で、
およそ3回ほどのやりとりでコンパイルを通すことができました。
また動作も、想定していた通りに渡したPARMの間にハイフンを付与してくれます。
このようにシンプルなプログラムであれば、
生成AIだけで作成するというのもあながち難しいことではないのかもしれません。
ご参考までに、以下に最終的なソースコードを記載します。
H DFTACTGRP(*NO) ACTGRP(*CALLER)
D ZIPGPT PR EXTPGM('ZIPGPT')
D In_ZipCode 7A CONST
D Out_ZipCode 8A
D ZIPGPT PI
D In_ZipCode 7A CONST
D Out_ZipCode 8A
D workZip3 S 3A
D workZip4 S 4A
D dash S 1A INZ('-')
C EVAL workZip3 = %SUBST(In_ZipCode:1:3)
C EVAL workZip4 = %SUBST(In_ZipCode:4:4)
C EVAL Out_ZipCode = workZip3 + dash + workZip4
C RETURN
7.まとめ
結果として、
既に生成AIはある程度プログラム作成のサポートを行えるほどの能力はあり、
画面表示の伴わないシンプルなサブプログラムくらいであれば、
生成AIだけでも作成ができる可能性を感じました。
ですが、同時に
- 桁ずれなどに関しては何度聞いても同じことを返してくる場合も多々あり、
自力で直す必要がある場面も見られる - 生成AI特有のハルシネーションが多々見られる
といった点を鑑みると、
完全な初学者が生成AIのみを用いてプログラム作成をするのは少し難しいような感じを受けました。
とはいえ、
- プログラムを作成しはじめるまでのコマンド等の手順
- 既存のソースコードの解説
などは非常に精度の高い回答をしていたので、
プログラムを自力で作成したい人の足掛かりとしては非常に有効だと考えられます。
■ 当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。