Amazon Web Services ブログ
Amazon Bedrock でプログラム概要資料を生成しよう!!
前提:本ブログは既存システムの改修や更新に携わるエンジニアの方が既存プログラムの概要を把握する手段の選択肢の一つとして、LLMの可能性を提示したものです。実際に稼働しているシステムのプログラムは、本ブログで用いたプログラムよりも規模・複雑度ともに大きく、紹介した方法だけでは十分な結果が得られない可能性があります。後述する「改善ポイント」も参考に、カスタマイズしてご利用ください。 |
本ブログでは、既存システム更新に関わる課題解決のために、AWS の生成 AI サービスである Amazon Bedrock を使って COBOL ソースコードからプログラム概要資料を作成する活用例を解説します。実際に使用したプロンプトも紹介していきますので参考にしやすい構成になっています。また、COBOL 言語初心者の筆者が生成 AI を活用しながら COBOL 言語を学び、成果物品質を向上させていった方法についても解説します。今回紹介する方法が、既存システムの理解促進と将来の発展のための参考になれば幸いです!
はじめに
2018年、経済産業省から「DXレポート~ITシステム「2025年の崖」の克服とDXの本格的な展開~」が公開されました。あらゆる産業において、デジタルトランスフォーメーションのスピーディーな実現が求められている一方で、企業が抱える多くの問題についても言及されました。その一つが既存システムの老朽化・複雑化・ブラックボックス化している現状でした。レポートには調査結果が引用されており、既存システムの抱える問題のインパクトの大きさが伺えます。
『JUASのアンケート調査によると、約8割の企業が「レガシーシステム」を抱えており、約7割が「レガシーシステム」が自社のデジタル化の足かせになっていると回答している。』
レポートではこの既存システムが DX の足かせとなっている理由についても言及されており、「ドキュメントが整備されていないため調査に時間を要する」というものが一番多くの企業で挙げられていました。
そのような既存システムで使われているプログラミング言語の一つが COBOL 言語です。COBOL 言語は1959年に事務処理用に開発されたプログラミング言語であり、現在も多くの企業、システムで稼働しています。一方で既存システムを開発したエンジニアが離職などにより減ってきている他、現在は新たに COBOL を学ぶエンジニアが減ってきており COBOL エンジニアの絶対数が不足している現状があります。
そんな中で近年最も注目を集めているのが生成 AI です。生成 AI はテキストの理解力や表現力が非常に高く、テキスト生成や、コード生成を得意としています。AWS は昨年の re:Invent にて生成 AI を活用し情報検索を簡単にする Amazon Q というサービスや、生成 AIを用いて対話的にETLジョブのコードを生成する機能などをリリースしています。
本ブログでは、AWS の生成 AI サービスである Amazon Bedrock (サービスについての詳細はこちらをご覧ください)を用いて、COBOL のドキュメント(今回はプログラム概要資料)を作成する活用例を解説します。
なお、エンタープライズ企業におけるメインフレームモダナイゼーションの全体像は大規模で、そのマイグレーションプロセスも複雑です。限られた時間とコストでビジネスゴールを達成するために、業界のベストプラクティスをご参照ください。詳細はこちら「Mainframe Modernizationへのアプローチ(前編)」。
生成 AI の出力を組み込んだプログラム概要資料
『論より証拠』、まずは実際に生成 AIの出力を組み込んだプログラム概要資料をご紹介します。
対象とした COBOL プログラムには、AWS が公開している CardDemo というカード会社のシステムを模したものを使いました。CardDemo は画面を備えたアプリで、いくつかのバッチプログラムもあり、実際に環境を整えれば実行することもできます。
CardDemo の画面イメージは以下のようになっています。
バッチプログラムの一覧はこちらです。
実際に生成 AI の出力を組み込んだプログラム概要資料は以下のとおりです。
図1-3:生成 AI の出力を組み込んだプログラム概要資料
以降では、プログラム本体のファイルと画面定義のファイルについて詳細を示します。
プログラム本体のファイル(ファイル拡張子.cbl)
プログラム概要資料にはプログラム名、プログラム説明のほか、使用する入力ファイル、出力ファイル、変数であるデータ項目、プロシジャーの処理概要、プロシジャーの一覧、プロシジャーから呼び出されプロシジャーの一部として実行される COPYBOOK というファイルの一覧を出力しています。
画面定義のファイル(ファイル拡張子.bms)
プログラム概要資料には画面名、画面説明のほか、画面イメージ、画面項目の一覧を出力しています。
いかがでしょうか?
プログラム本体や画面定義について、人が比較的に読みやすい形でドキュメント化できたことが分かりますね。
以降では、このドキュメントを Amazon Bedrock を用いてどのように作成したのかを解説していきます。
Amazon Bedrock を用いたプログラム概要資料作成
概要資料作成プログラムの構成
今回作成した概要資料作成プログラム全体の構成は以下の通りです。
全体は Python でプログラミングしています。Amazon Bedrock は COBOL ソースコードの解析部分に利用しています。
Amazon Bedrock から利用する LLM(Large Language Model) には Anthropic Claude v2.1 を使いました。選定理由は、1/日本語での出力が必要なことと、2/後述する通り XML や JSON などが取り扱え、高品質なアウトプットが期待できたためです。
概要資料作成プログラム詳細
概要資料作成プログラムの処理は以下の通りです。
- ファイルの情報(ファイル名、ファイルパス、サイズ、ファイル拡張子、ファイル行数)を取得する
- 各ファイルについて Amazon Bedrock を使って仕様情報を取得する
- 上述の情報をプログラム概要資料(Word 形式)に書き出す
1は概要資料にファイルの一覧を出力する目的のためファイルを列挙し、さらに生成 AI では難しいが Python で可能な処理(例:行数を数える)を行ないます。
2ではファイル種別毎にプロンプトを切り替えて仕様情報を取得します。
3では1、2で取得した情報をプログラム概要資料に書き出します。例えば1の結果をもとに画面一覧を出力したり、2の結果をもとに画面詳細仕様を出力したり、と言った感じです。
このブログでは Amazon Bedrock にフォーカスして説明するため Python 部分のコードについての説明は割愛しますが、サンプルプログラムの公開を検討中ですので後続のブログをお待ちいただけると幸いです。(こちらで公開予定です。)
以降、2の Amazon Bedrock の使い方について解説していきます。
Amazon Bedrock タスク
ここからは成果物イメージでお見せした、COBOL プログラムのプログラム本体と画面定義について具体的なプロンプトをご紹介します。
COBOL プログラムのプログラム本体から概要資料生成に必要な情報を取得するために使用したプロンプトは以下のとおりです。
コードは <inputText> XML タグの中に Python で埋め込んで Amazon Bedrock の API を呼び出しました。
Outputの一例(COCRDLIC.cblを入力とした場合)
COBOL プログラムの画面定義に対して使用したプロンプトは以下のとおりです。 コードは同じく <inputText> XML タグの中に記載して Amazon Bedrock の API を呼び出します。
Outputの一例(COBIL00.bmsを入力とした場合)
プロンプトは1ファイルにつき1回の Amazon Bedrock API の呼び出しで複数の必要な情報を得られるように工夫しました。1)1回の呼び出しで複数の回答を同時に得られることでプログラム全体の実行時間の短縮とコストの削減が見込める、2)同一コードに対しての複数の項目を別々に取得する場合に比べて出力内容間の整合性がとれる可能性がある、と仮定しています。
今回のプロンプトで利用した Anthropic Claude のプロンプトテクニックについて、Anthropic のプロンプトガイドを引用して列挙します。
テクニック1:Mark different parts of the prompt/プロンプトのさまざまな部分にマークを付ける
Claude は XML タグを認識できるように微調整されています。XML タグを使用することで、プロンプトをサブセクションに区切ることができます。また JSON や YAML などの他の構造化形式も認識できます。今回のサンプルでは、指示を明確にするために XML タグを使いました。また、1回の API 呼び出しで複数の情報を得られるように JSON 形式で応答するように指示しました。
テクニック2:Put words in Claude’s mouth/クロードの口に言葉を入れる
生成 AI は回答の冒頭に、「○○○について、以下に説明します。」のような言葉を加えることがあります。これは概要資料に記載する項目としては不要です。上記プロンプトでは出力の形式を JSON にし、指示中の Condition に不要な説明を含めないように制限を示し、Assistant: の直後に JSON の“[”を指定することで、JSON のみの出力を得られるよう工夫しました。
*このプロンプトは概ねうまくいきますが、完全ではありませんでした。今回の事例では正しい出力を得るため再実行が必要なことがありました。
テクニック3:Documents before instructions/指示前にドキュメントを入れる
Claude は大きなコンテキストウィンドウがあり、大規模な COBOL プログラムもプロンプトに含めて渡すことができます。プロンプトの構造として、最初に指示を書き、次に入力となる COBOL コードを示した上で、最後に再度指示を書きました。これにより指示が守られやすくなります。
Amazon Bedrock の使い方として、使用したプロンプトは以上です。このプロンプトを使って得られた JSON 形式の応答を Python で受け取り、プログラム概要資料に出力しました。
次にこの概要資料作成プログラムを作るにあたり、どのように進めたのか説明していきます。
COBOL 初心者の私が COBOL 概要資料作成の生成 AI デモを開発した道のり
私は COBOL 言語を使ったことがありませんでしたので、当然文法についての知識もありませんでした。そのため生成 AI を使って COBOL 言語や COBOL ソースコードを理解しながら、概要資料作成プログラムを徐々に良くしていくという方法を取りました。
だいたい次のような流れで進めました。
- おおまかに質問して、全体感を把握する。
- 具体的にしたい部分に絞った質問をして、より詳細な情報を得る。
- キーワードをたまに Web 検索して、生成 AI の出力結果が正しいのか事実確認をする。
- 以降、1から3を繰り返す
Amazon Bedrock には生成 AI とインタラクティブに対話しながら LLM の出力をチェックし、質問応答を行うことができるチャットプレイグラウンドが用意されています。以下では、私がチャットプレイグラウンドを利用して COBOL 言語を学んでいった際のイメージを示します。
どのようなファイルがあるのかを質問したり、ファイルの仕様を質問したり、言語仕様の調査を行なっている様子です。
ソースコードを調査した際のイメージを以下に示します。
プログラム全体の概要を説明させたり、ソースコードを少しずつ説明させたりしてソースコード調査を行なっている様子です。
Python で概要資料作成した際のイメージを以下に示します。
Python から Word 形式のプログラム概要資料を作成するためのライブラリ調査を行なっている様子です。
このように、生成 AI との対話を通して、COBOL 言語、CardDemo に関する知識を徐々に広げながら、プロンプトを工夫したり Python 実装を行なったりして進めていきました。
本概要資料作成プログラムの作成に要した期間ですが、著者の場合で約1週間でした。
本デモ開発を通じたラーニングのシェア
本取り組みを通して得られた学びをシェアします。
1. 未知の言語、未知のシステムであっても生成 AI を使うことで、簡単に短時間で学ぶことができた
始める前は、生成 AI が COBOL 言語の情報を持っているか分からなかったが、質問することで目的に十分な知識があることが確認できました。生成 AI を使うことで、一般的な言語仕様の説明を得られる上に、目の前のソースコードについても解説が得られるので、システムが何をしているのかより早く理解することができました。
*LLM が十分に学習していない言語だった場合でも、その言語の知識を持ち込むこと(プロンプトや、RAG 等)で対応可能な可能性があります。
2. 学びを概要資料作成に活かすことで、成果物の品質がどんどん向上した
学んだ言語仕様を前提としてプロンプトを改良することで、目的に合致する情報を確実に得られるようになりました。
生成 AI では得ることが難しい情報だと分かった場合は、Python で取得するように変更しました(例:プログラム行数の取得)。その際も生成 AI を使って Python コードを生成することで、短時間で目的を達成することができました。(このブログでは割愛しましたが、Python コードの作成には Amazon CodeWhisperer を使っています。)
3. 生成 AI が出力する“本当かどうか分からない”出力も、それっぽいのでうまく使うと便利
生成 AI はソースコード内の変数名やプロシジャー名からそれっぽい説明を生成します。(例:”TRNXFILE” というファイル名の説明を「トランザクションデータを含む入力ファイル」と出力しました。)正しいかどうかは調査を進めないと分かりませんが、事前情報なくそれっぽく説明してくれるので、一旦構成を理解するのに役立ちました。
*調査が進み、生成 AI の出力が正しくないと感じたら、プロンプトでファイル名の命名ルールを与えるなどすれば、より正確な出力が得られる可能性があります。
改善ポイント
今回限られた時間の中で、意味のありそうなプログラム概要資料を得られるところまで作り込むことができました。
ここではこの方法を実際のプロジェクトで活用しようと思った時に、考えられる改善のポイントをあげておきます。
- プロンプトはまだまだ改善ができます。指示を改良する、例を示すなどすることで出力をわかりやすく、かつ安定させることができるはずです。
- 概要資料のプロシジャーの説明は、今回は表形式での説明としましたが、フローチャートなど図化を行なった方がより直観的にわかりやすくなります。Python ではグラフ構造をテキストで指示してフローチャートなどの図を出力できる Graphviz が使えます。生成 AI の出力としてこの Graphviz で使えるグラフ構造のテキストを生成させることができます。改善の一つとしてこのような改修を入れるのは有効です。
- 生成 AI の出力は時には最善とは言えないものとなる可能性があります。今回は生成 AI の出力を目視で確認し、リトライを行なっていましたが、生成 AI で出力した成果を生成 AI によって回答品質を判断し、品質が低い場合は自動でリトライさせる方法が考えられます。生成 AI の出力品質チェック用のツール(例:https://github.com/citadel-ai/langcheck)も出てきていますので、用途に合ったものを使うのも良いやり方です。
- 生成 AI で出力された情報をさらに統合的に解析し、生成 AI を通すことでより高度な情報を概要資料に含めることができます。例えば、各プログラムから使用している COPYBOOK 名を取得済みですが、逆に COPYBOOK の修正により影響を受けるファイルの一覧を出力することができます。また、各プログラムファイルから生成された説明を元に、生成 AI を使って再度プログラム全体の説明を作成することで、ボトムアップで正確な説明ができる可能性があります。
まとめ
本ブログでは、AWS の生成 AI サービスである Amazon Bedrock を使い、COBOL ソースコードのプログラム概要資料を作る方法の解説を行いました。Anthropic Claude のプロンプト例を具体的に提示し、効率的に正しい回答を得るためのプロンプトテクニックについて解説しました。
本内容はCOBOL以外のプログラム言語でも応用できる可能性があります。
プログラム概要資料作成のための概要資料作成プログラムを作ることで、解析対象のシステムをより手軽に早く理解することができるようになります。また概要資料を読んだ結果、新たな観点で調査を行いたいとなったときも、この概要資料作成プログラムに手を加えることで、短時間で調査を完了することができます。この概要資料作成プログラムは既存システム理解のための重要なツールとなると実感しました。
今回紹介した方法が、既存システムの理解促進と将来の発展のための参考になれば幸いです!