生成AI×システム構築 〜設計編〜

AI

システム開発の現場でも、生成AIの活用が徐々に広がってきています。実際に使う機会も増えてきましたが、現状ではまだ「便利な補助ツール」としての使い方が中心のように感じます。

個人的には、生成AIを前提にした作業フローに変えていくことで、作業時間の短縮・品質の向上・要求スキルの低減といった効果が期待できるのではないかと思っています。

正直なところ、理想は「作りたいシステムの内容をプロンプトに入力すれば、すぐに動作するものが出力される」ような状況です。
(……とはいえ、そんな未来が来たら自分の仕事が無くなってしまいそうですが)

もちろん現時点ではそこまでの完成度は難しいかもしれませんが、最低限のたたき台になるようなプロトタイプを素早く作ることなら、すでに十分実現可能です。
もし打ち合わせの最中に、動くプロトタイプをサッと出せるようになれば、関係者全体のイメージが揃いやすくなり、認識齟齬や後戻りも減らせるのではないでしょうか。

今回は開発者目線での話になってしまいましたが、発注側の立場でも同様に、言葉では伝えにくいイメージを生成AIでビジュアル化できれば、意思疎通のハードルが下がり、開発コストの削減にもつながると思います。

まずは「どこまで生成AIに頼って作れるか?」を試してみて、何が足りないのか、どうすればもっと活用できるのかを探ってみたいと思います。そして最終的には、実際の業務にどう取り入れていけるかを検証していきます。

結論

最終的に完成したシステムはこんな感じです。
入力チェックが行われ、データも登録されます。

構築してみてわかったポイントです。

● 必要最低限のシステムは生成AIで構築可能
● コーディングほぼ無し
● ある程度の開発知識があると便利

それでは実際に作ってみたいと思います。

設計

まずは、何のシステムを作るかを決めたいと思います。

本格的なシステムではなく、必要に応じて機能を追加できるような、最低限の小さなシステムから始めるのが良さそうです。複雑すぎると試行錯誤しづらくなってしまいますし。

そこで、今回は「在庫管理システム」を題材にしてみることにしました。

選んだ理由:

  • 管理するデータの種類が少なくシンプル
  • 各機能の関連性が比較的少ないため分かりやすい
  • 生産管理、販売管理、会計などに比べて、最小構成での導入がしやすい

🤔 在庫管理システムとは?

その名の通り、「在庫を管理するためのシステム」です。
基本的には、以下のような内容を記録・把握できるようにします:

  • どの商品が、今いくつあるか
  • いつ・どの商品が入庫/出庫されたか

目的としては、次のような点が挙げられます:

  • 現在の在庫数を正確に把握する
  • 入出庫の履歴を残し、トレーサビリティを確保する
  • 欠品や過剰在庫を防止する
  • 発注や補充の判断材料を提供する

より高度なシステムでは、「ロケーション(保管場所)管理」「ロット番号・有効期限管理」などの機能もありますが、今回は最小構成で進めるため、それらは一旦除外します。

要件定義

今回作る在庫管理システムの要件としては、こんな感じでしょうか。

  • 商品の在庫数を管理できる
  • 商品の入庫処理ができる
  • 商品の出庫処理ができる
  • 現在の在庫状況を照会できる
  • 入出庫の履歴を確認できる

この要件をもとに、生成AIを使って実際の機能を作っていこうと思います。
それではChatGPTに要件を入力して、必要な機能を聞いてみます。

宗一郎
宗一郎

在庫管理システムで下記の要件を満たす、最低限の機能を教えてください。
・商品の在庫数を管理する
・商品の入庫ができる
・商品の出庫ができる
・現在の在庫状況を確認できる
・入出庫の履歴を確認できる

ChatGPT
ChatGPT

✅ 最低限必要な機能一覧

機能カテゴリ機能名内容
品管理商品マスタ登録商品情報(商品コード、商品名、単位など)を登録・管理する
入出庫管理入庫登録機能商品が倉庫や店舗に入ったときに、数量・日時・担当者などを記録する
出庫登録機能商品が出ていくときに、数量・日時・出庫理由などを記録する
在庫数量管理在庫数更新機能入出庫処理により、現在庫数を自動で更新する
現在庫照会機能商品ごとの在庫数を確認できる機能(一覧表示・検索機能など)
履歴管理入出庫履歴参照機能過去の入庫・出庫情報を一覧で確認できる機能

✅ 補足:必要となる基本的なデータ構造(テーブル)

  1. 商品テーブル(商品マスタ)
    • 商品ID、商品名、単位、在庫数 など
  2. 入出庫履歴テーブル
    • 商品ID、入出庫区分(入庫/出庫)、数量、日時、担当者、備考など

✅ シンプルな操作フロー例

  • 商品を登録する(初期登録)
  • 入庫時に記録する → 在庫数が増加し、履歴に記録される
  • 出庫時に記録する → 在庫数が減少し、履歴に記録される
  • 現在の在庫を照会する → 商品ごとの在庫数を一覧表示
  • 履歴を参照する → 入出庫の操作履歴を時系列で確認

機能と言いつつ、テーブル定義やフローまで教えてくれましたね。

画面設計

機能一覧から、画面のある機能としては下記になります。
・商品マスタ登録
・入庫登録
・出庫登録
・現在庫照会
・入出庫履歴参照

最初にこれらの機能の画面イメージを固めて行きましょう。
まず最初に、在庫を管理する商品データのメンテナンス画面です。

やりたいことと画面項目をChatGPTに投げて、画面イメージを作ってもらいましょう。

宗一郎
宗一郎

下記の機能の画面イメージをHTMLで作成してください。
【機能概要】
商品マスタのメンテナンス(登録、更新、削除)を行う
【画面項目】
商品コード
商品名
単位

ChatGPT
ChatGPT
商品マスタ登録のHTMLコード
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>商品マスタ メンテナンス</title>
  <style>
    body {
      font-family: sans-serif;
      padding: 2rem;
      background-color: #f4f4f4;
    }
    h1 {
      text-align: center;
    }
    table {
      width: 100%;
      border-collapse: collapse;
      margin-top: 1rem;
    }
    th, td {
      border: 1px solid #ccc;
      padding: 0.5rem;
      text-align: left;
    }
    th {
      background-color: #eee;
    }
    input[type="text"] {
      width: 90%;
      padding: 0.4rem;
    }
    .form-area {
      margin-bottom: 1rem;
    }
    .form-area label {
      display: inline-block;
      width: 100px;
    }
    .buttons {
      margin-top: 1rem;
    }
    .buttons button {
      margin-right: 0.5rem;
      padding: 0.5rem 1rem;
    }
  </style>
</head>
<body>

  <h1>商品マスタ メンテナンス</h1>

  <div class="form-area">
    <label for="code">商品コード</label>
    <input type="text" id="code"><br><br>

    <label for="name">商品名</label>
    <input type="text" id="name"><br><br>

    <label for="unit">単位</label>
    <input type="text" id="unit"><br><br>

    <div class="buttons">
      <button onclick="register()">登録</button>
      <button onclick="update()">更新</button>
      <button onclick="remove()">削除</button>
      <button onclick="clearForm()">クリア</button>
    </div>
  </div>

  <h2>登録済み商品一覧</h2>
  <table id="productTable">
    <thead>
      <tr>
        <th>商品コード</th>
        <th>商品名</th>
        <th>単位</th>
      </tr>
    </thead>
    <tbody>
      <!-- 登録された商品がここに表示されます -->
    </tbody>
  </table>

  <script>
    const table = document.getElementById("productTable").getElementsByTagName("tbody")[0];

    function register() {
      const code = document.getElementById("code").value.trim();
      const name = document.getElementById("name").value.trim();
      const unit = document.getElementById("unit").value.trim();
      if (!code || !name || !unit) {
        alert("すべての項目を入力してください");
        return;
      }

      const row = table.insertRow();
      row.insertCell(0).innerText = code;
      row.insertCell(1).innerText = name;
      row.insertCell(2).innerText = unit;

      row.onclick = () => {
        document.getElementById("code").value = row.cells[0].innerText;
        document.getElementById("name").value = row.cells[1].innerText;
        document.getElementById("unit").value = row.cells[2].innerText;
      };

      clearForm();
    }

    function update() {
      const code = document.getElementById("code").value.trim();
      const name = document.getElementById("name").value.trim();
      const unit = document.getElementById("unit").value.trim();
      if (!code) {
        alert("商品コードを入力してください");
        return;
      }

      for (let i = 0; i < table.rows.length; i++) {
        if (table.rows[i].cells[0].innerText === code) {
          table.rows[i].cells[1].innerText = name;
          table.rows[i].cells[2].innerText = unit;
          clearForm();
          return;
        }
      }

      alert("該当する商品コードが見つかりません");
    }

    function remove() {
      const code = document.getElementById("code").value.trim();
      if (!code) {
        alert("商品コードを入力してください");
        return;
      }

      for (let i = 0; i < table.rows.length; i++) {
        if (table.rows[i].cells[0].innerText === code) {
          table.deleteRow(i);
          clearForm();
          return;
        }
      }

      alert("該当する商品コードが見つかりません");
    }

    function clearForm() {
      document.getElementById("code").value = "";
      document.getElementById("name").value = "";
      document.getElementById("unit").value = "";
    }
  </script>

</body>
</html>

✅ このHTMLでできること

  • 商品コード、商品名、単位の入力
  • 登録 → テーブルに表示
  • テーブル行クリック → フォームに再表示
  • 更新/削除 → 商品コードで該当行を操作
  • 入力クリア

結構長いソースが生成されました。
そしてよく見たら、単体でメンテナンスまでできるようにプログラムされてますね。。。
ここまでやってくれるんですね。

では、画面イメージを表示してみてもらいましょう。

宗一郎
宗一郎

このHTML結果を画像で出力してください。

ChatGPT
ChatGPT

必要十分ですね。
今回はこのままとしておきますが、デザインを指示すれば更にやってはくれそうです。

また、画像にすると漢字は読めますが細部が微妙に怪しいです。
先程のHTMLコードをHTMLファイルとして保存してブラウザに表示してみます。

折り返しは違いますが、内容的には同じものが表示されましたね。
こちらはフォントを使っているので漢字も大丈夫です。

こういったやり方で、残りの機能も画面のHTMLを作成してもらいます。
商品マスタ登録と同様のプロンプトで、各機能に入力した内容は下記になります。

機能【機能概要】【画面項目】
入庫登録入庫登録を行う機能商品コード、商品名(表示項目)、単位(表示項目)、数量、入庫日
出庫登録出庫登録を行う機能商品コード、商品名(表示項目)、単位(表示項目)、数量、出庫日
現在庫照会現在庫の照会を行う機能・検索項目
商品コード(あいまい検索)
・一覧項目
商品コード、商品名、現在庫数、単位
入出庫履歴参照入出庫履歴の照会を行う機能・検索項目
商品コード(あいまい検索)、入出庫日(From)、入出庫日(To)
・一覧項目
商品コード、商品名、入出庫日、入出庫区分、入出庫数、単位

出力されたHTMLコードを表示した画面は下記になりました。

機能設計

次に、この機能の内容を設計書に起こしてみましょう。

宗一郎
宗一郎

この商品マスタメンテナンスの設計書を作成したいです。
下記の項目について出力してください。
・画面項目説明(項目名、型、長さ、初期値)
・処理概要(初期処理、各ボタン押下時の処理内容)
・チェック処理(各ボタン押下時のチェック処理内容、エラーメッセージ)
・DB更新内容(登録、更新、削除時の処理内容)
反映先のテーブルは商品マスタです。

ChatGPT
ChatGPT

✅️ 画面項目説明

項目名長さ初期値備考
商品コード文字列10一意のコード、主キー
商品名文字列50商品の名称
単位文字列10「個」「本」など

✅️ 処理概要

● 初期処理

 ・商品マスタテーブルから全件取得し、一覧(登録済み商品一覧)に表示する。

● 登録ボタン押下時

 ・入力内容をチェック
 ・チェックOKの場合、商品マスタに新規登録
 ・一覧に反映

● 更新ボタン押下時

 ・入力された商品コードをキーに既存データを検索
 ・チェックOKの場合、該当レコードを更新
 ・一覧を更新

● 削除ボタン押下時

 ・入力された商品コードをキーに商品マスタから削除
 ・一覧からも削除

● クリアボタン押下時

 ・入力項目(商品コード、商品名、単位)を初期化(空欄)

✅️ チェック処理

対象チェック内容エラーメッセージ
共通必須チェック(商品コード、商品名、単位が空でないこと)「すべての項目を入力してください」
登録時商品コードの重複チェック(すでに存在していればエラー)「この商品コードは既に登録されています」
更新・削除時該当商品コードの存在チェック(なければエラー)「該当する商品コードが見つかりません」

✅️ DB更新内容(商品マスタ)

● 登録処理

 ・INSERT INTO 商品マスタ (商品コード, 商品名, 単位)
 ・入力値を元に新規レコードを追加

● 更新処理

 ・UPDATE 商品マスタ
  SET 商品名 = :商品名, 単位 = :単位
  WHERE 商品コード = :商品コード

● 削除処理

 ・DELETE FROM 商品マスタ WHERE 商品コード = :商品コード

いやー、ここまで作ってくれるんですね。
他の機能も同様に作成してもらって、仕様に齟齬がないかを確認します。
プロンプトは商品マスタ登録と同様で、機能名の部分だけ変更します。

宗一郎
宗一郎

[機能名]の設計書を作成したいです。
下記の項目について出力してください。
・画面項目説明(項目名、型、長さ、初期値)
・処理概要(初期処理、各ボタン押下時の処理内容)
・チェック処理(各ボタン押下時のチェック処理内容、エラーメッセージ)
・DB更新内容(登録、更新、削除時の処理内容)
反映先のテーブルは商品マスタです。

今回は画面に出力してもらいましたが、Excelに直接出力してもらっても良いかもですね。
テンプレートがあれば、添付して追記してもらうことも可能です。

テーブル設計

在庫管理システムに必要な機能は揃いましたが、設計としてはテーブル定義を明確にしておきたいです。
機能設計でも出てきましたが、今回の機能からすると商品マスタ、在庫、入出庫履歴あたりが必要そうですね。
何が必要か聞いてみましょう。

宗一郎
宗一郎

この在庫管理システムで必要になるテーブルと項目を教えてください。

ChatGPT
ChatGPT

✅ 必要なテーブル一覧

テーブル名用途
商品マスタ商品の基本情報を管理
在庫商品ごとの現在庫数を保持
入出庫履歴入出庫の履歴を記録

🧩 各テーブルの定義(項目例)

① 商品マスタ(PRODUCTS

論理項目名物理名備考
商品コードPRODUCT_CODEVARCHAR2(10)主キー、一意商品識別
商品名PRODUCT_NAMEVARCHAR2(50)
単位UNITVARCHAR2(10)“個”、”本” など
登録日時CREATED_ATDATE登録日時
最終更新日時UPDATED_ATDATE最終更新日時

② 在庫(STOCKS

論理項目名物理名備考
商品コードPRODUCT_CODEVARCHAR2(10)主キー(商品マスタと外部キー)
現在庫数STOCK_QTYNUMBER現在の在庫数
最終更新日時UPDATED_ATDATE在庫が更新された日時

商品マスタと1対1。マスタに統合する場合もあります。

③ 入出庫履歴(STOCK_HISTORY

論理項目名物理名備考
履歴IDHISTORY_IDNUMBER主キー、自動採番
商品コードPRODUCT_CODEVARCHAR2(10)商品マスタと外部キー
入出庫区分TYPECHAR(3)‘IN’=入庫、’OUT’=出庫
数量QTYNUMBER入庫 or 出庫した数量
入出庫日HISTORY_DATEDATE実際の入出庫日
登録者CREATED_BYVARCHAR2(50)処理を行ったユーザーやバッチ名
登録日時CREATED_ATDATEデータ登録日時

在庫テーブルの補足説明に、商品マスタに統合する場合もあると説明がありますね。
確かに今までに作成してきた機能では、商品マスタの中で現在庫を管理していました。
あと、入出庫履歴テーブルに「登録者」の項目がありますが、今回ユーザー管理までは想定してないので不要そうです。

指定していませんでしたが、物理名や型、備考も違和感なく作ってくれていますね。
テンプレートを読み込ませて、テーブル定義書として出力できそうです。

まとめ

ここまでで5画面、6機能、3テーブルの設計を終えました。
プロンプト入力は要件で1回、画面設計で5回、機能設計で6回、テーブル設計で1回の計13回です。これを人手で設計するとなると1日といったところでしょうか。

概要から詳細に落とし込む作業に生成AI使えますね。
内容を広げたり、形式を変えたりするのに非常に頼りになります。
今回は行いませんでしたが、プロンプトで追加指示することで機能追加したり、エラーメッセージ番号を付加したりもできそうです。別の機会にやってみましょう。

設計としては一通り終わりました。
要件をある程度決めてスタートしたせいもありますが、特に躓くこともなかったです。
長くなってしまったので一旦区切り、製造へと進んで行こうと思います。

コメント

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