text=小川 誠 ティアンドトラスト株式会社
はじめに
ChatGPTが2022年11月に公開されて以降、さまざまなメディアで毎日のように取り上げられているのは皆さんご存じの通り。史上最速でアクティブ・ユーザー数が1億人を突破したという好意的なニュースもあれば、個人情報の収集などが法的根拠なく行われているなどの批判的なものまで、玉石混交の評価がネットに踊る。
つい先日は日本でのChatGPTの利用率がアメリカのそれに比べてかなり低いと報じられ、ChatGPTがこれからどのように仕事に関わってくるのか、あるいは取り組んでいくべきなのかに悩んでいる方も多いのではないかと思う。
筆者は、ChatGPTについて昨年末時点で存在は知っていたが、実際に使ってみたのは2023年2月とかなり遅い。そのため、ChatGPTのコア部分である生成AIに関しては、その利点と欠点を十分に把握していないことを先に白状しておく。そんな私が「ChatGPTはRPG開発にどこまで使えるか」という本記事を担当するのはいささか不安に思う読者もおられると思う。
それゆえに、本記事は「生成AIにそれほど詳しくないIBM i技術者が、RPG開発に生成AIを利用できるのかどうかを検証してみた」という内容になることをお断りしておく。あくまで利用できるかどうかの検証が目的なので、セキュリティ的な問題や、企業で利用してよいかどうかの判断基準等については一切触れないので、あらかじめご了承いただきたい。
検証に関しては、ChatGPTは主に有料版(ChatGPT Plus)、コードの検証は累積PTF C2328740が適用されたIBM i 7.4を使用した。GPTのモデルは記事内で特に断りがない場合は、GPT-4を使用している。
RPG開発のすべてのフェーズを検証することは誌面の都合上できないので、「RPGのフリーフォーム化をこれから始めるRPG Ⅲ技術者が、ChatGPTを利用してFF RPGに取り組む」という前提で、以下の作業をChatGPTと会話しながら進めることにする。
- テーブルの作成とデータの追加
- 部品展開ロジックの生成
記事内では、ChatGPTが実際に返答した内容を掲載するが、これはその時点で生成AIが「計算」した結果であり、まったく同じ質問をしても同じ結果が返ってくるわけではないことは、あらかじめ念頭においていただきたい。
ウォーミングアップ
具体的な検証を始める前に、あらためてChatGPTについてまとめておきたい。
ChatGPTは、OpenAI社が公開した対話型AI(大規模言語モデル:LLM)をチャット形式で利用できるようにしたサービスである。GPTは「Generative Pre-trained Transformer」の略であり、事前にトレーニングを行った情報を基に、次に現れるべき言葉を確率的に予測して文章を生成する。
ChatGPTは文字通りチャット形式でGPTを使用することが可能で、驚くほど自然(人間が答えたかのよう)な回答を得ることができる。
たとえば、「ILE RPGの特徴を教えてください。」という単純な質問を投げかけてみよう。すると以下のような文章が返ってくる。
ILE RPG(Integrated Language Environment RPG)は、IBMのAS/400(現在のIBM iと呼ばれる)オペレーティングシステムのためのプログラミング言語であり、特にビジネスアプリケーションの開発に使用されます。以下に、ILE RPGの主な特徴をいくつか挙げます。
1. 手続き型言語:ILE RPGは手続き型のプログラミング言語であり、手続きやサブルーチンを使用してプログラムを構築します。これにより、再利用性の高いコードを作成し、プログラムのメンテナンスや修正が容易になります。
2. ファイル指向プログラミング:ILE RPGはファイル指向のプログラミングモデルをサポートしており、データベースファイルや外部ファイルとの対話的な操作が容易です。データベースファイルのレコードの追加、更新、削除などの操作を簡潔に記述することができます。
3. データ指向プログラミング:ILE RPGは強力なデータ処理機能を提供しています。データ構造やフィールドレベルの操作が容易であり、データの整形、変換、計算などを効率的に行うことができます。
4. オブジェクト指向プログラミング(最新バージョン):最新のILE RPGバージョンでは、オブジェクト指向プログラミング(OOP)の機能が追加されました。クラス、オブジェクト、継承、ポリモーフィズムなどのOOPの概念を活用することができます。
5. ネイティブなシステム統合:ILE RPGはIBM iオペレーティングシステムと緊密に統合されており、システムリソースやデータベースとのやり取りが容易です。IBM iの特殊な機能やAPIにアクセスするための組み込み機能が提供されています。
私は、同じ質問をされてこの5つの特徴をすらすらと答える自信はない。日本語もとても自然で、これを最初に体験すると、「マニュアルを読まなくてもChatGPTがすべて教えてくれる」と「勘違い」しても不思議ではないと思う。「AIってすごいな!」と。
しかし文章をよく読んでみると、手続き型言語やファイル指向プログラミングの説明は正しいが、「オブジェクト指向プログラミング(最新バージョン)」の説明は正しくない(OOPは最新バージョンでも実装されていない)。にもかかわらず「クラス、オブジェクト、継承、ポリモーフィズムなどのOOPの概念を活用することができます。」と言い切っている。文章としては何の問題もないが、内容には誤りが含まれている。
つまり、GPTは自然な文章を計算して返してくれるが、その内容が正しいかどうかを検証することはしていないのだ。ChatGPTは、少なくとも現時点ではGoogleのような検索ツールでもないし、我々が漠然とイメージしている人間と同等のAIでもないということは理解する必要があると思う。
ChatGPTの面白いところは、間違っている部分を指摘すると、それなりの返答をしてくることだ。では続けてOOPの件についてさらにChatGPTと会話してみよう。
オブジェクト指向プログラミングが最新バージョンで追加されたと言われましたが、本当ですか?
おっしゃる通り、私の先ほどの回答において、最新のILE RPGバージョンでオブジェクト指向プログラミング(OOP)の機能が追加されたと述べましたが、これは誤りです。申し訳ありませんが、その情報は間違っています。
ILE RPGは、手続き型のプログラミング言語であり、オブジェクト指向プログラミングの機能を直接サポートしているわけではありません。最新のバージョンでも、ILE RPGは主に手続き型とファイル指向のプログラミングモデルに基づいています。
ただし、IBM i上でオブジェクト指向プログラミングを実現するために、別の言語やツールを使用することは可能です。たとえば、JavaやRPGのフレームワークであるILEastic(アイリアスティック)などのツールや拡張機能を利用することで、IBM i環境でオブジェクト指向プログラミングを実現することができます。
再度、誤った情報を提供したことをお詫び申し上げます。正確な情報をお伝えできず、申し訳ありませんでした。
あっさり間違いだったと認めたが、なにやらILEasticというツールがあるらしいという情報を教えてくれた。これがOOPと関係するものかどうかは別として、少なくとも私が知らなかった知見を教えてくれたことになる。
ちなみに、ILEasticをGoogleで検索してみると、GitHubで公開されているOSSツール(マイクロサービスを実行するためのWebアプリケーション・サーバー)とのこと。ChatGPTでやり取りする途中で次につながる情報も得られる可能性があることがおわかりだろう。今回は主題とはずれるのでこれ以上このツールには言及しないが、興味のある方はChatGPTに聞くなり、さらに検索するなどされてはいかがだろうか。
ChatGPTは何かを質問する以外に、文章の要約や、表示方法の変更を依頼するという使い方もできる。今回は箇条書きで書かれたILE RPGの特徴を表形式にまとめるよう依頼してみた。
ILE RPGの特徴が箇条書きで示されましたが、見づらいので表形式にまとめてください。
すると、見事に表形式で結果を返してくれた(図表1)。オブジェクト指向プログラミングの説明は、「ILE RPG自体は直接的なサポートはありませんが」と、その前で訂正された情報が加味されて回答されている。Chatのやり取りを基に、GPTからの回答がより洗練されていることがおわかりだろう。
ChatGPTにアクセスする際、会話のキャッチボールの中で条件を徐々に狭めていく方法が大事であるとはよく言われるが、事前に前提条件をまとめて与え、それに基づいて文章を生成してもらうという方法もある。前提条件の与え方については、プロンプト・エンジニアリング・スキルが必要になってくるが、より具体的な質問方法はネットで公開されているので、それらを参考にしながら、RPG開発にどこまでChatGPTが使用できるのかを試してみたいと思う。
なお、GPTの学習データは2021年9月までの情報なので、これ以降の出来事などについては基本的に持っていないことを理解したうえで利用する必要がある点には注意しておきたい。
データベースの作成
では、簡単な部品展開ロジックのサンプル・コードをFF RPGで作成するという課題に取り組んでみたい。順番として、最初にサンプルで使用するデータベースの作成を行い、次に実際のロジック・コードの作成をChatGPTと一緒に進めていくことにする。
IBM iのデータベース作成方法といえばDDS + CRTPFを思い浮かべる方が多いと思うが、今回は作成もデータ追加もSQLを利用することにする。まずは条件を指定して、部品マスター・テーブルBOMを作成するDDLを提案してくれるようChatGPTと会話してみよう。
指定する条件は次の3つとする。
- 2つのフィールド(ParentCodeとChildCode)を定義
- キーは2つのフィールドの複合キー
- レコード様式名はBOMR
以下のフィールドを含むテーブルBOMを作成するSQL分を提示してください。
ParentCode(10桁の文字)
ChildCode(10桁の文字)
キーは上記フィールドの複合キーとします。Db2 for iで使用するのでレコード様式名をBOMRとしてSQL文を作成してください。
以下のSQL文は、フィールド’ParentCode’と’ChildCode’を持つテーブル’BOM’を作成し、これらのフィールドを複合キーとして設定します。Db2 for iでは、テーブルを作成する際に、’FOR SYSTEM NAME’句を使用してシステム名(レコード様式名)を設定します。
上記のスクリプトは、’ParentCode’と’ChildCode’フィールドがともに10桁の文字列であり、その組み合わせが一意であることを保証します。また、テーブルのレコード様式名(システム名)として’BOMR’を設定しています。
ただし、Db2 for iのバージョンや具体的な設定によっては、このSQL文が正確に動作するどうかは異なる場合があります。具体的な状況に応じて、SQL文の調整が必要かもしれません。
すると、指定された条件に合致する(であろう)テーブルBOMを作成するDDL「CREATE TABLE」が提案された。皆さんご存じのように、IBM iでSQLを実行するには、5250画面でSTRSQLコマンドでSQLセションを開始してSQLコマンドを実行する方法と、ACSのSQLスクリプトの実行を使用する方法の2つがある。どちらを選んでも構わないが、今回はACSのツールを使用して上記DDLをコピー&ペーストして実行してみた。IBM i の場合はどのライブラリーに作成するかを指定しなければならないので、テーブル名BOMをライブラリー名で修飾して実行する。
実行結果は、SQL0199のエラー(キーワード FOR は必要でない)となった。今回はレコード様式名の指定も指示しているが、その指定方法が間違っているようだ。それを指摘してみよう。
FOR SYSTEM NAMEは正しくないようです。他の記述方法はありますか?
すみません。Db2 for iのシステム名(レコード様式名)の指定方法に誤りがありました。システム名はテーブル名として指定するのではなくテーブル作成後に’RENAME TABLE’コマンドを使用して設定します。
以下がDb2 for iでのテーブル作成とシステム名の設定を行うSQL文の例です;
ただし、注意点として’RENAME TABLE’コマンドは元のテーブル名を新しい名前に変更します。つまり、この操作後、テーブルに対する参照は新しい名前(ここではBOMR)を使用する必要があります。
なお、テーブル作成と名前の変更を一連の操作として行う場合は、各SQL文をそれぞれ実行するか、またはDb2 for iが複数のSQL文の一括実行を許可するように設定されている場合は一緒に実行することが可能です。具体的な実行方法はDb2 for iの設定や使用しているインターフェースによります。
どうもレコード様式名をシステム名と混同しているようにみえる。もしかすると、Db2 for iのDDLでレコード様式名を指定する方法を事前学習(あるいはレコード様式名を学習)していないのではないだろうか。レコード様式名をDDLで指定するにはRCDFMTを使用するので、それをChatGPTに伝えてみよう。
以下コードで、レコード様式名BOMRを含むテーブルBOMを作成することができました。
CREATE TBLE BOM(
ParentCode CHAR(10)NOT NULL,
ChildCode CHAR(10)NOT NULL,
PRIMARY KEY(ParentCode,ChildCode)
)RCDFMT BOMR;
素晴らしいですね、Db2 for iでは、’RCDFMT’を使用してレコード様式名(record format name)を指定することができます。この情報は私の回答に欠けていましたので、ご指摘いただき感謝します。
このSQL文は、’ParentCode’と’ChildCode’という名前のフィールドを持つテーブル’BOM’を作成します。これらのフィールドは10桁の文字列型で、テーブルの複合キーとっして機能します。そして、テーブルのレコード様式名は’BOMR’として設定されます。
ご自身で解決策を見つけて共有いただき、ありがとうございました。他のDb2 for iにとっても有用な情報だと思います。
生成AIの回答とわかっていても、お礼を言われるとうれしいものだ。提案されたDDLの間違いを修正することで、テーブルBOMを作成することができた。
続いて、作成したBOMテーブルにテスト用データを追加するSQL文も提案してもらおう。データについては、次に作成する部品展開プログラムで利用するので、指示を細かく出してみる。
- 作成するデータは20件程度
- ParentCodeとChildCodeは1対多
- ChildCodeが別のレコードのParentCodeになるようなデータも生成
上記テーブルにレコードを追加したいと思います。20件程度のサンプル・データを登録するSQL文を作成してください。その際、ParentCodeに対して複数のChildCodeが存在(1対多)するようにしてください。さらに、ChildCodeの値が別レコードのParentCodeになるようなレコードも含めてください。
上記SQL文のテーブル名をライブラリー名で修飾し、ACSのSQLスクリプトの実行の画面にコピー&ペーストして実行すると、テーブルBOMに20レコードが問題なく追加された。
今回は、「レコード様式名」というものをGPTが事前学習していなかったようだが、その問題を差し引いても、SQLであればIBM iでのデータベースの各処理をChatGPTと会話しながら進めていくことができそうだ、とわかったのではないかと思う。
部品展開ロジック
続いて、先程作成したテーブルBOMのデータを使用した部品展開プログラムの雛形をChatGPTに作成依頼してみよう。ここで提示する条件は以下の3つとする。
- フリーフォームRPGで記述すること
- データはテーブルから取得
- 部品展開レベルは未定
まずは条件を提示してサンプル・ロジックの作成を指示する。
IBM iのILE RPGを使用して部品展開ロジックを作成してください。
条件を箇条書きで列挙します。
- フリーフォームRPGで記述すること
- 部品情報はテーブルから取得すること
- 部品展開レベルは可変
すると、完全なプログラムではないが、サブプロシージャPartExpandを使用したコードを提案してくれた。このサブプロシージャは2つの引数を受取り、データベース・レコードに対してSETLL/READでデータを読み、読めたらデータベースに情報を出力する。しかも、検索したレコードの子部品コード(PartData.Child)を引数に自分自身を再帰的に呼び出すようになっている。2番目のパラメータExpandLevelと含めて、「部品展開レベルは可変」という条件を満たしたサンプル・コードになっている。
ILE RPGを使用して部品展開ロジックを作成するには、次のように実装することが可能です。この例では、部品の情報をDBから取得し、展開レベルは変数によって制御されます。以下にRPGの基本的なコードスニペットを示します。
このコードはRPGのプロシージャコードの一部であり、フリーフォームRPGで書かれています。
・ファイル’PartMaster’は部品マスターを参照し、部品情報を取得します。
・ファイル’PartDetail’は展開された部品情報を出力します。
この’PartExpand’プロシージャは親部品と展開レベルをパラメータとして受け取り、展開レベルに達するまで、または全ての部品が展開されるまで部品情報を読み込み、子部品に対して再帰的にこのプロシージャを呼び出します。
部品マスター(’PartMaster’)には親部品(’Parent’)
と子部品(’Child’)の情報が存在し、部品間の関係性を管理していることを想定しています。
注意:上記のコードは、部品マスター(’PartMaster’)と部品詳細(’PartDetail’)のレコードフォーマット、そして部品マスターのキーが適切に定義されていることを前提としています。このコードは一例であり、実際のシステムや要件によって調整が必要となる場合があります。
最初の指示で部品マスターの名称を指定していなかったため、架空の名称(PartMaster)でコードが生成された。これを実際のマスター(BOM)で書き換えるように指示してみよう。
上記サンプル・コードの注意点を表形式でまとめてください。
これに対しては、「以下に、上記サンプル・コードの注意点を表形式でまとめます。」という回答があり、図表2が示された。
注意点7つをわかりやすくまとめてくれた。データベースのキーに注意すること、再帰的処理を理解すること、エラーチェックなどを必ず実装することなど、重要な指摘があることがわかる。
提示されたコードと注意点を踏まえ、今回は結果をデータベースに出力するのではなく、dsply命令でジョブログに書き出すように修正したプログラムが以下である。
データベースのキー項目の属性に合わせて桁数を変更したり、再帰呼出しロジックを完成させるために、ファイル定義をPartExpandプロシージャ内に移動(ローカル定義)したりという修正は行っているが、基本的な構造はChatGPTが提示したサンプルに沿っていることがおわかりいただけると思う。
上記コードで BOM01という名称のプログラムを作成し、実際に実行した結果は以下の通り。
パラメータに親部品コードを指定すると、先程作成したテーブルBOMから親部品PARENT001 を構成する小部品を順番に検索して表示した。
このプログラムはあくまでもサンプルなので、このままのコードを基幹システムに組み込むことはしない。だが、ChatGPTとチャットしながら進めることで、FF RPGのサブ・プロシージャの再帰呼び出しが部品展開の基本的なロジックには有効なこと、テストデータなども工夫しだいで一括作成できることなどが理解できた。工夫しだいでは、RPG開発でもChatGPTを有効活用できることがおわかりいただけたのではないかと思う。
まとめ
IBM iのRPG開発において、具体的にChatGPTにどのように指示をし、どのような結果が返ってきたかを、実際のイメージを使って解説してきた。皆さんが記事タイトルの「ChatGPTはRPG開発にどこまで使えるか」から想像した内容にどこまで近づけたかは心もとない部分もあるが、少なからずRPG開発にChatGPTを利用するヒントは提示できたのではないかと思う。
繰り返しになるが、GPTは生成AIなので、何か質問するたびに「計算」が行われその結果を返す。そのため、記事に記載したのと同じ質問をChatGPTに与えても、同じ答えは返ってこないことに注意していただきたいと思う。
RPG開発者が現時点でChatGPTを利用する利点は、プログラマーの仕事を「サポートする」という点にあると思う。何も知らなくても正解を教えてくれる魔法のツールではなく、プログラミングをしていく過程でのアイデア出しや、ヒントをくれるツールという位置づけだ。
仕事のできる同僚や先輩に対して、「この仕様をフリーフォームRPGで作ってください。しかもバグなく。」なんて聞くプログラマーはいない。「このロジックはこう書こうと思っているんですけど、方向性はあっていますかね?」とか、「こういうことってRPGでできると思います?」という質問をすることで、「大丈夫だと思うよ」とか、「詳しくはわからないけれど、こういうことは可能かも」と回答をしてくれる。そんなバーチャルな同僚や先輩というのがChatGPTの現時点での私の印象だ。
最後に、ChatGPTを利用するにあたって気をつけておくべきことをお伝えする。それは、GPTの学習元のデータと、そのデータのプライバシーや著作権の問題だ。ChatGPTに使用上の規約を聞いてみると、以下の答えが返ってきた。
ChatGPTの使用上の規約は以下の通りですが、注意してください。私はAIモデルであり、法的な助言や保証を提供するものではありません。OpenAIの規約や利用条件に基づく一般的な情報を提供しますが、最終的な判断は自己責任で行ってください。
1. 情報提供の性質:ChatGPTは、一般的な情報や一般的な意見を提供することを目的としています。正確性や最新性を保証するものではありません。常に公式のソースや専門家の助言に頼ることをお勧めします。
2. プライバシーと個人情報:ChatGPTはセッション間での情報の保持や追跡は行いません。ユーザーから提供された情報は、回答を生成するために使用されますが、OpenAIのサーバー上に長期間保存されることはありません。
3. 新たな情報源としての使用:ChatGPTは、私が訓練を受けた時点で利用できた幅広い情報源から学習していますが、ユーザーが提供する情報を新たな情報源として取り込むことはありません。私は訓練データに基づいて応答を生成し、事前に収集された情報を元にします。
4. 著作権と知的財産:ChatGPTの応答は、Open
AIの所有する著作権や知的財産権の対象です。私が提供する情報は、非商用目的で利用する場合に限ります。商業利用や再配布、複製、公開などの行為は禁止されています。
以上が一般的な規約ですが、具体的な使用条件や利用規約はOpenAIの公式ウェブサイトで確認することをお勧めします。また、私は常に最新の情報を持っているわけではないため、正確性や完全性を保証するものではありません。必要な場合は、公式のソースや専門家の助言を参考にしてください。
提供される情報は、正確性や最新性を保証するものではないこと、著作権は OpenAI に帰属することなど、基本的に大事なことが含まれている。
学習元のデータに関しては、インターネット上の情報などが元になっていると言われているが、その情報がすべて正しいものばかりかと言うと、そうではないのはご存じの通り。ふだん情報収集でググった結果のページが、すべて正しい情報であるとは皆さんも思っていないはず。確固たるエビデンスに基づいて正確な情報のみで構成されているわけではない情報を基礎とする言語モデルである以上、内容的に間違いが含まれることは否めない。また、その情報にプライバシーに関する情報や著作権の問題を持つ情報が入っている可能性もある。
RPGの言語開発のサポート・ツールという位置づけの場合、利用することでプライバシー問題が顕著になることはあまりないかもしれないが、著作権については問題になる可能性はゼロではない。
利用者がChatGPTの特性を十分に理解し、効果的に仕事に生かした形で利用するためには、やはり何らかのルール作りが必要だと思う。これからも各メディアに取り上げられるChatGPTの情報に注目しながら、このツールとどうやって付き合っていくかを模索していってほしい。
著者|
小川 誠氏
ティアンドトラスト株式会社
代表取締役社長 CIO CTO
1989年、エス・イー・ラボ入社。その後、1993年にティアンドトラストに入社。システム/38 から IBM i まで、さまざまな開発プロジェクトに参加。またAS/400 、IBM i の機能拡張に伴い、他プラットフォームとの連携機能開発も手掛ける。IBM i 関連の多彩な教育コンテンツの作成や研修、セミナーなども担当。2021年6月から現職。