見出し画像

ChatGPTにBPMNのフロー図を描かせてみた

最近BPMN2.0の勉強を始めたのだけれど、図形がたくさんあって適切に使うのにまず困るということが分かった。
また、業務の単位を大まかにしたり、細かくしたりもできるので適切な記載も慣れるまでは難しい。(下記のサイトはとても参考になります)

そこで、業務を自然言語で記述したら、自動でプロセスができるようにすれば困らないのではないかと思って、ChatGPT(GPT-4-turbo)、Claude3 Opus、Gemini Advancedにお願いしてみた。

出来た!

GPT-4-turboが出力したBPMN2.0
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
  <bpmn:process id="BarOperationProcess" isExecutable="true">
    <bpmn:startEvent id="StartEvent" name="Start">
      <bpmn:outgoing>Flow_OrderReceived</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="ViewOrderSite" name="View Order Site">
      <bpmn:incoming>Flow_OrderReceived</bpmn:incoming>
      <bpmn:outgoing>Flow_CustomerLoginCheck</bpmn:outgoing>
    </bpmn:task>
    <bpmn:exclusiveGateway id="CustomerLoginCheck" name="Is Customer Logged In?">
      <bpmn:incoming>Flow_CustomerLoginCheck</bpmn:incoming>
      <bpmn:outgoing>Flow_OrderOriginalBlend</bpmn:outgoing>
      <bpmn:outgoing>Flow_OrderRegular</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:task id="OrderOriginalBlend" name="Order Original Blend">
      <bpmn:incoming>Flow_OrderOriginalBlend</bpmn:incoming>
      <bpmn:outgoing>Flow_OrderReceivedBySystem</bpmn:outgoing>
    </bpmn:task>
    <bpmn:task id="OrderRegular" name="Order Regular Drink">
      <bpmn:incoming>Flow_OrderRegular</bpmn:incoming>
      <bpmn:outgoing>Flow_OrderReceivedBySystem</bpmn:outgoing>
    </bpmn:task>
    <bpmn:task id="ProcessOrder" name="Process Order">
      <bpmn:incoming>Flow_OrderReceivedBySystem</bpmn:incoming>
      <bpmn:outgoing>Flow_CheckBlenderOrder</bpmn:outgoing>
    </bpmn:task>
    <bpmn:exclusiveGateway id="CheckBlenderOrder" name="Is it a Blender Order?">
      <bpmn:incoming>Flow_CheckBlenderOrder</bpmn:incoming>
      <bpmn:outgoing>Flow_BartenderTask</bpmn:outgoing>
      <bpmn:outgoing>Flow_BlendOrder</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:task id="BartenderTask" name="Bartender Manual Task">
      <bpmn:incoming>Flow_BartenderTask</bpmn:incoming>
      <bpmn:outgoing>Flow_EndManualTask</bpmn:outgoing>
    </bpmn:task>
    <bpmn:task id="BlendOrder" name="Blend Order">
      <bpmn:incoming>Flow_BlendOrder</bpmn:incoming>
      <bpmn:outgoing>Flow_EndBlenderTask</bpmn:outgoing>
    </bpmn:task>
    <bpmn:endEvent id="EndManualTask" name="End Manual Task">
      <bpmn:incoming>Flow_EndManualTask</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:endEvent id="EndBlenderTask" name="End Blender Task">
      <bpmn:incoming>Flow_EndBlenderTask</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_OrderReceived" sourceRef="StartEvent" targetRef="ViewOrderSite"/>
    <bpmn:sequenceFlow id="Flow_CustomerLoginCheck" sourceRef="ViewOrderSite" targetRef="CustomerLoginCheck"/>
    <bpmn:sequenceFlow id="Flow_OrderOriginalBlend" name="To Original Blend Task" sourceRef="CustomerLoginCheck" targetRef="OrderOriginalBlend">
    <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">customerLoggedIn == true</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_OrderRegular" name="To Regular Blend Task" sourceRef="CustomerLoginCheck" targetRef="OrderRegular">
    <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">customerLoggedIn == false</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_OrderReceivedBySystem" sourceRef="OrderOriginalBlend" targetRef="ProcessOrder"/>
    <bpmn:sequenceFlow id="Flow_OrderReceivedBySystem" sourceRef="OrderRegular" targetRef="ProcessOrder"/>
    <bpmn:sequenceFlow id="Flow_CheckBlenderOrder" sourceRef="ProcessOrder" targetRef="CheckBlenderOrder"/>



    <bpmn:sequenceFlow id="Flow_BartenderTask" name="To Bartender Task" sourceRef="CheckBlenderOrder" targetRef="BartenderTask">
    <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">BlenderOrder == false</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_BlendOrder" name="To Blender Order" sourceRef="CheckBlenderOrder" targetRef="BlendOrder">
    <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">BlenderOrder == true</bpmn:conditionExpression>
    </bpmn:sequenceFlow>

    <bpmn:sequenceFlow id="Flow_EndManualTask" sourceRef="BartenderTask" targetRef="EndManualTask"/>
    <bpmn:sequenceFlow id="Flow_EndBlenderTask" sourceRef="BlendOrder" targetRef="EndBlenderTask"/>
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="BarOperationProcess">
      <bpmndi:BPMNShape id="Shape_StartEvent" bpmnElement="StartEvent">
        <dc:Bounds x="100" y="100" width="36" height="36"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Shape_ViewOrderSite" bpmnElement="ViewOrderSite">
      <dc:Bounds x="200" y="100" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_CustomerLoginCheck" bpmnElement="CustomerLoginCheck">
      <dc:Bounds x="400" y="100" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_OrderOriginalBlend" bpmnElement="OrderOriginalBlend">
      <dc:Bounds x="600" y="50" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_OrderRegular" bpmnElement="OrderRegular">
      <dc:Bounds x="600" y="150" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_ProcessOrder" bpmnElement="ProcessOrder">
      <dc:Bounds x="800" y="100" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_CheckBlenderOrder" bpmnElement="CheckBlenderOrder">
      <dc:Bounds x="1000" y="100" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_BartenderTask" bpmnElement="BartenderTask">
      <dc:Bounds x="1200" y="50" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_BlendOrder" bpmnElement="BlendOrder">
      <dc:Bounds x="1200" y="150" width="100" height="80"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_EndManualTask" bpmnElement="EndManualTask">
      <dc:Bounds x="1400" y="50" width="36" height="36"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape id="Shape_EndBlenderTask" bpmnElement="EndBlenderTask">
      <dc:Bounds x="1400" y="150" width="36" height="36"/>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNEdge id="Edge_Flow_OrderReceived" bpmnElement="Flow_OrderReceived">
      <di:waypoint x="136" y="118" />
      <di:waypoint x="200" y="118" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_CustomerLoginCheck" bpmnElement="Flow_CustomerLoginCheck">
      <di:waypoint x="300" y="140" />
      <di:waypoint x="400" y="140" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_OrderOriginalBlend" bpmnElement="Flow_OrderOriginalBlend">
      <di:waypoint x="500" y="130" />
      <di:waypoint x="600" y="90" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_OrderRegular" bpmnElement="Flow_OrderRegular">
      <di:waypoint x="500" y="150" />
      <di:waypoint x="600" y="190" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_OrderReceivedBySystem_1" bpmnElement="Flow_OrderReceivedBySystem">
      <di:waypoint x="700" y="90" />
      <di:waypoint x="800" y="140" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_OrderReceivedBySystem_2" bpmnElement="Flow_OrderReceivedBySystem">
      <di:waypoint x="700" y="190" />
      <di:waypoint x="800" y="140" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_CheckBlenderOrder" bpmnElement="Flow_CheckBlenderOrder">
      <di:waypoint x="900" y="140" />
      <di:waypoint x="1000" y="140" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_BartenderTask" bpmnElement="Flow_BartenderTask">
      <di:waypoint x="1100" y="140" />
      <di:waypoint x="1200" y="90" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_BlendOrder" bpmnElement="Flow_BlendOrder">
      <di:waypoint x="1100" y="140" />
      <di:waypoint x="1200" y="190" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_EndManualTask" bpmnElement="Flow_EndManualTask">
      <di:waypoint x="1300" y="90" />
      <di:waypoint x="1400" y="68" />
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge id="Edge_Flow_EndBlenderTask" bpmnElement="Flow_EndBlenderTask">
      <di:waypoint x="1300" y="190" />
      <di:waypoint x="1400" y="168" />
    </bpmndi:BPMNEdge>
      <!-- DI elements like bpmndi:BPMNShape and bpmndi:BPMNEdge would go here to visually layout the process -->
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>


Calude3 OpusのBPMN

なお、Geminiはインポートすら失敗していたので、難しいのかもしれない。

上記のファイルを test.bpmnとして下記サイトで読み込むとBPMNの図が表示できます。


このように、生成AIによってビジネスプロセスをBPMN2.0に基づいて書くことができた。
このように、業務プロセスを口頭で話すだけ、もしくはヒアリングした書きおこしを生成AIに入れるだけでビジネスプロセスが可視化できるというのはかなり画期的な気がする。
なぜなら、部門をまたぐ業務や、身体的操作を伴う業務に従事していてBPMNを書くための時間を取れない人が、テンプレートに従って業務を話すだけで業務フローの概要ができるし、さらに、業務の改善提案もできる。
記載したBPMNに対して効率改善と顧客満足度向上の案を出してもらい、改善後のBPMNを書かせることもできるので下手なコンサルは要らなくなる。

何度か試したが、BPMN2.0で定められたように、登場人物別にレーンを分けて表示するにもプロンプトの工夫が必要そうだった。
BPMN のファイルでは図形の位置を絶対値で指定する必要があるようなので、プロセスが長くなったり複雑になったりすると、それぞれの位置関係を認識する必要があり、それが難しいかもしれない。ここはソフトウェア側で解消できそうでもあるし、マルチモーダルの特性を生かして、出力された画像を読み込んでコードを修整するようになれば、位置の調整も改善できるかもしれない。

この分野の発展に期待(というか自分でやりたい)

プロセスの効率性と顧客満足度を高めるための改善ポイントとして、以下を提案します。そして、これらの改善点を反映したBPMN 2.0の例を提供します。

改善ポイント
オンライン予約の導入:客が事前にオンラインで席を予約し、希望のドリンクを選択できるようにします。これにより、来店時の待ち時間が短縮され、準備も効率化されます。
フィードバックシステムの導入:顧客が体験後にフィードバックを提供できるシステムを設けます。これにより、サービスの質の向上と顧客満足度の向上を図ります。
自動在庫管理:ブレンダーロボットが使用する材料の在庫を自動で追跡し、不足が予想される場合は自動で再注文するシステムを導入します。これにより、サービスの中断を防ぎます。


反映したBPMN

以下は、上記の改善点を反映したBPMN 2.0の概要です。完全なBPMN要素やダイアグラム情報は記述していませんが、主要なプロセスの流れを示しています。
このプロセスは、オンライン予約の受付から始まり、テーブルとドリンクの利用可能性を確認し、予約を確定します。その後、指定されたドリンクの準備が行われ、顧客に提供されます。加えて、フィードバックの収集と分析が行われ、在庫管理と自動注文のプロセスが繰り返し行われます。

この概要をもとに、具体的なBPMNエレメントやシーケンスフローを用いてより詳細なプロセス図を作成することができます。また、プロセスの各ステップで使用するデータオブジェクト(予約情報、フィードバックデータ、在庫データなど)や、ゲートウェイでの決定条件も具体化することで、プロセスをより明確にすることが可能です。

GPT-4-turbo

そうしてできたファイルを読み込んだのが下記。全然できてないぞ。

GPT-4-turboの改善案

続いてはClaude3 Opusで。

了解しました。業務効率と顧客満足度を高めるために、プロセスを以下のように改善します:
1. オーダーシステムにAIを導入し、顧客の好みや過去のオーダー履歴に基づいて、パーソナライズされたおすすめメニューを提示する。
2. ブレンダーロボットの数を増やし、複数のオーダーを同時に処理できるようにする。
3. バーテンダーの作業を最適化するために、オーダーシステムとブレンダーロボットをシームレスに連携させる。
4. 顧客がオーダーの進捗状況をリアルタイムで確認できるようにする。
5. オーダー完了後、顧客にフィードバックを求め、継続的な改善に活用する。


以下は、改善後のプロセスを表現したBPMN 2.0のXMLコードです:

Claude3 Opus

そうしてできたのが下記のファイル。全然ダメだ。

Claude3 Opusの改善案

早く人間を超えて世界から無駄な仕事をなくせるようになってほしいものです。

今回使ったプロンプトは下記。

下記の業務について、bpmn2.0の記法に沿って、拡張子bpmnのファイルのコードを作成してください。

# 対象となる業務の概要(どのような業務なのか、どのような目的でフロー図を作成したいのか)
-- バーの営業の業務 目的は新規に開業するバーのプロセスの作成
# 主要な登場人物(誰がどのような役割を担っているのか)
-- 客:オーダーする
-- バーテンダー:オーダーに対応する
-- ブレンダーロボット:オーダーに従ってお酒をブレンドする
# 主要な作業手順(どのような手順で業務が行われているのか)
-- 客:席に備え付けたQRコードをスマートフォンで読んでオーダーサイトを閲覧し、オーダーする。お店のアカウントを持っている顧客はログインしてオリジナルブレンドをオーダーできる
-- バーテンダー:ブレンド以外の、手作業が必要なオーダーに対応する(おつまみの提供、ブレンダーロボットへのグラスのセットなど)
-- ブレンダーロボット:オーダーに基づいてお酒をブレンドする
# 使用するツールやシステム
-- Camunda
# ドキュメントやデータの流れ
-- オーダーシステム:客のオーダーを順にためて、バーテンダーロボットに送付する。バーテンダーはオーダーシステムの画面を見て対応する
-- 顧客管理システム:ログインした客のスマートフォンに過去のオーダー情報やオリジナルブレンドの情報を表示する

この記事が気に入ったらサポートをしてみませんか?