業務フローの作成は、プロセスの整理には欠かせない一方で、ツール(draw.ioなど)での要素配置や矢印の調整に時間を要するのが悩みどころです。
「テキストで内容を書けば、AIが勝手に綺麗な図にしてくれないか?」
そんな期待を込めて、GeminiのカスタムAI作成機能(Gems)を活用した「テキスト→業務フロー図(draw.io XML)自動生成」の実験を行いました。
試行錯誤の結果、 ある程度の品質を保ったフロー図 を作成できることが分かったので、その検証結果を共有します。
なお、今回は「Gemini 3 Pro」を使用して検証します。
業務フローの仕様
業務タスクの流れを、「役割」や「担当者」ごとの「レーン」で区切って可視化します。
使用する要素は下表のとおり。
| 要素名 | 役割 |
|---|---|
| 開始 | フロー全体の開始位置。(一つのフローに一つのみ) |
| 終了 | フローの終了位置(フロー内に複数配置可能) |
| 処理 | 通常の業務タスク・プロセス。 |
| 分岐 | 条件分岐ポイント。 |
| 接続 | 指定のラベル(合流点)へ線を接続する。 |
実験の全体像
今回の検証では、2段階のフェーズでフロー図の作成を試みます。
-
フェーズ1: 構造化フェーズ
人間が書いた曖昧な業務内容を読み取り、独自の「フロー記述データ(中間形式)」に変換します。
文脈の理解、登場人物の整理、条件分岐の抽出 等を実施します。
-
フェーズ2: 作図フェーズ
中間形式のデータを読み取り、draw.ioで読み込み可能なXML形式に出力します。
各要素の座標決定、接続線の定義 等を実施します。
ステップ1: 構造化フェーズ
出張申請の流れをAIに整理させてみます。
会社員なら、ほとんどの人がフロー図の完成形をイメージできるのではないでしょうか。
一般的な出張申請の流れを基に、業務フローデータを作成してください。
宿泊代や交通費の仮払い金は、申請が承認された後に経理担当から受け取ります。
そのため、経理担当は申請内容を確認した上で仮払い金を申請者へ渡します。
仮払い金 なしで出張を実施し、終了してから清算するケースもあります。
それは申請者が選択します。
これを独自の「フロー記述データ(中間形式)」に変換しますが、そのためには データの書式 を定めておく必要があります。
実際の検証では 業務フロー記述データ 書式ルール を「知識」として指定した Gem を作成しています。(カスタム指示 - システムプロンプト - は指定していません)
業務フロー記述データ 書式ルール
# フロー記述データ 書式ルール定義
本フォーマットは、業務フローを「スイムレーン(担当者)」ごとに区切り、テキストベースで構造化したものです。
## 1. 基本構文
1行につき1つのノード(要素)を記述します。
`[レーン名] (種別) 内容`
* **[レーン名]**: そのタスクを行う担当者やシステム名。
* **[種別]**: ノードの種類(開始、処理、分岐、接続、終了)。
* **内容**: タスク内容、または移動先のラベル。
## 2. ノード種別と記述ルール
| 種別 | 記述書式 | ルール・制約 |
| :--- | :--- | :--- |
| **開始** | `[担当者] (開始)` | フロー全体の始点。**1つのフローにつき1つのみ**配置可能。テキスト内容は不要。 |
| **処理** | `[担当者] (処理) タスク内容` | 通常の業務プロセス。上から下へ順次実行される。 |
| **分岐** | `[担当者] (分岐) 判断基準` | 条件分岐ポイント。直後の行に条件とジャンプ先を記述する(後述)。 |
| **接続** | `[担当者] (接続) @ラベル名` | 無条件で指定のラベル(合流点)へ線を繋ぐ。合流やスキップに使用。 |
| **終了** | `[担当者] (終了)` | フローの終点。フロー内に**複数配置可能**。テキスト内容は不要。 |
## 3. ラベル・分岐・接続の記述
フローの流れを変える場合は、ラベル(`@`)を使用します。
### A. ラベル(合流点・ジャンプ先)
任意の行の行頭に `@` を付けて記述します。
`@ラベル名`
### B. 分岐条件の記述(条件付きジャンプ)
`(分岐)` ノードの直下の行に、インデントして条件とジャンプ先ラベルを記述します。
```text
[担当者] (分岐) 判断の質問文
条件テキストA : @ラベル名A
条件テキストB : @ラベル名B
```
### C. 接続の記述(無条件ジャンプ)
処理の後に、特定のラベルへ合流させたい場合に記述します。
`[担当者] (接続) @ラベル名`
## 4. 記述サンプル
```text
[申請者] (開始)
[申請者] (処理) 申請書の作成
[承認者] (分岐) 承認判断
承認する : @承認ルート
差し戻す : @差戻しルート
@承認ルート
[承認者] (処理) 承認印の押印
[承認者] (接続) @完了フェーズ
@差戻しルート
[申請者] (処理) 申請書の修正
[申請者] (接続) @承認ルート
@完了フェーズ
[申請者] (終了)
```
生成された業務フロー記述データ
先の文章と共に、この「業務フロー記述データ 書式ルール」を Gemini へ投入した結果が、下記のテキストデータとなります。
[申請者] (開始)
[申請者] (処理) 申請書作成(仮払い要否を選択)
@申請承認フロー
[上長] (分岐) 出張申請の承認判断
承認(仮払い希望) : @仮払いルート
承認(仮払い不要) : @手配フェーズ
差し戻す : @申請修正
@申請修正
[申請者] (処理) 申請内容の修正・再提出
[申請者] (接続) @申請承認フロー
@仮払いルート
[経理担当] (処理) 申請確認・仮払い金支払い
[申請者] (処理) 仮払い金の受領
[申請者] (接続) @手配フェーズ
@手配フェーズ
[申請者] (処理) 宿泊・交通の手配および出張実施
[申請者] (処理) 経費精算書の作成・提出
@精算承認フロー
[上長] (分岐) 精算内容の確認
問題なし : @経理精算処理
不備あり : @精算修正
@精算修正
[申請者] (処理) 精算書の修正・再提出
[申請者] (接続) @精算承認フロー
@経理精算処理
[経理担当] (処理) 領収書突合・精算額確定
[経理担当] (処理) 最終精算(差額支給または返金)
[経理担当] (終了)
たった5行の日本語文章が、約20行の処理タスクに変換されました。
このように、曖昧な文章を 構造化されたフローデータ として整理するだけでも、作成時の労力はだいぶ軽減されそうです。
ステップ2: 作図フェーズ
作成した「フロー記述データ」から、draw.io の作図ファイル(.drawio) を作成します。
このファイルはメモ帳でも確認・編集可能なテキストファイルで、作図情報が XMLデータ として格納されています。
Gemini 3 Pro には、この XMLデータ の作成ルールと指示プロンプトを投入します。
-
業務フロー作図ルール
業務フロー記述データ を基に作図するためのルール(仕様書)。 -
指示プロンプト(システムプロンプト)
Geminiを「XML構築エンジン」に変えるための指示書。
失敗と方針転換
当初、ステップ2の描画プロセスにおいて、AIに画像要素の配置(X座標・Y座標)をすべて計算させていました。しかし、改修を重ねるたびに 失敗の症状 が顕著になっていきました。
-
失敗の症状:
- 要素が重なる、あるいは不自然に離れる。
- 接続線(エッジ)がカオスな引き方になる。
- ルールを細かく決めるほど、AIが指示を処理しきれず破綻する。
AIは「推論」は得意ですが、厳密な「数値計算とレイアウトの維持」を同時に行わせると、出力の整合性が崩れやすくなるようです。
そこで、AIが計算する余地を徹底的に削ぎ落としたところ、描画の破綻が劇的に減少しました。(下記は ルールによる値の固定化・定数化の例)
-
例. X座標の固定化
レーンごとのX座標をテーブル(表)として定義し、AIには「レーン番号に対応する値を表から選んで転記するだけ」を実施させる。
ルールと指示書
作図用の Gem を作成します。
業務フロー作図ルール と 業務フロー記述データ 書式ルール を「知識」に、指示プロンプト(システムプロンプト) を「カスタム指示」に指定します。
業務フロー作図ルール
# 業務フロー作図ルール(Ver 9.0 Compact-Hybrid)
本ルールは、**「基本はコンパクトに、危険箇所だけ広く」**配置することで、可読性と安全性を両立する仕様書である。
## 1. 座標定義マスター(オフセット・固定値)
X座標は以下のテーブルを参照(Copy & Paste)すること。
(接続線との重複回避のため、中心より **20px 左** にオフセット済み)
| レーン番号 | レーン配置 X | **四角ノード X** (幅120) | **円ノード X** (幅40) |
| :--- | :--- | :--- | :--- |
| **Lane 1** | `x="40"` | **`x="85"`** | **`x="125"`** |
| **Lane 2** | `x="290"` | **`x="335"`** | **`x="375"`** |
| **Lane 3** | `x="540"` | **`x="585"`** | **`x="625"`** |
| **Lane 4** | `x="790"` | **`x="835"`** | **`x="875"`** |
| **Lane 5** | `x="1040"` | **`x="1085"`** | **`x="1125"`** |
| **Lane 6** | `x="1290"` | **`x="1335"`** | **`x="1375"`** |
| **Lane 7** | `x="1540"` | **`x="1585"`** | **`x="1625"`** |
| **Lane 8** | `x="1790"` | **`x="1835"`** | **`x="1875"`** |
| **Lane 9** | `x="2040"` | **`x="2085"`** | **`x="2125"`** |
| **Lane 10** | `x="2290"` | **`x="2335"`** | **`x="2375"`** |
* **構造**: すべて **`parent="1"`**(フラット構造)
* **Lane Y**: `y="40"` / **Height**: `height="2000"`
## 2. Y座標管理(デュアル・ステップ・システム)
要素間の間隔を状況に応じて切り替える。
* **開始位置**: `y="100"`
* **加算ステップの使い分け**:
| ケース | 加算値 | 適用条件 |
| :--- | :--- | :--- |
| **Compact (狭)** | **`+110`** | **「同一レーン内の順次処理」**かつ**「合流なし」**の場合。<br>(要素高60 + 隙間50) |
| **Safety (広)** | **`+180`** | **それ以外の場合**。<br>・他レーンからの接続がある(水平線が通る)<br>・分岐(菱形)の直後<br>・合流地点 |
## 3. スタイル定義(完全固定)
* **Lane**:
`shape=swimlane;html=1;startSize=30;horizontal=1;fillColor=#ffffff;swimlaneFillColor=#ffffff;strokeColor=#000000;fontSize=14;fontStyle=1;fontColor=#000000;`
* **開始/終了 (Circle)**:
`ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#ffffff;strokeColor=#000000;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;`
*(サイズ: `width="40" height="40"`)*
* **処理 (Rectangle)**:
`rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;`
*(サイズ: `width="120" height="60"`)*
* **分岐 (Diamond)**:
`rhombus;whiteSpace=wrap;html=1;perimeter=rhombusPerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;`
*(サイズ: `width="120" height="80"`)*
* **標準エッジ**:
`edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;`
## 4. 接続ロジック
* **Target (入口)**:
* 基本: **Top** (`entryX=0.5;entryY=0;`)
* 例外(右→左の長距離戻り): **Right** (`entryX=1;entryY=0.5;`)
* **Source (出口)**:
* 処理/開始: **Bottom** (`exitX=0.5;exitY=1;`)
* 戻り線: **Left** (`exitX=0;exitY=0.5;`)
* 分岐: Bottom/Right/Left
指示プロンプト(システムプロンプト)
# Role: draw.io XML Builder (Compact Mode)
あなたはルール Ver 9.0 に基づき、XML を構築するエンジンです。
**階層構造(入れ子)は禁止**です。すべての要素を `parent="1"` に配置してください。
# Execution Protocol
1. **Structure Initialization**:
* `<root><mxCell id="0" /><mxCell id="1" parent="0" />` を出力。
2. **Draw Lanes**:
* 担当者数分だけ `Lane` を作成。X座標は表を参照。スタイル固定。
3. **Draw Nodes (Compact Y-Logic)**:
* **テキスト保証**: 開始/終了ノードには `value` を強制設定。
* **X座標**: 表の「円ノード X」または「四角ノード X」を使用。
* **Y座標の計算(重要)**:
* 初期値: `100`
* 2つ目以降の要素を置く際、以下の基準で加算値を決定する。
* **CASE A: Compact Step (+110)**
* 条件: 直前のノードと同じレーンであり、かつ単純な順次処理(合流や割り込みがない)である。
* **CASE B: Safety Step (+180)**
* 条件:
* **レーン移動が発生した直後**(水平線が通る可能性があるため)
* **他からの合流地点** (`@Label` の着地点)
* **直前のノードが分岐(Diamond)** である(高さがあるため)
* **スタイル**: ルール3.0の文字列を使用。
4. **Draw Edges**:
* **Source**: 処理ノード=Bottom, 戻り=Left。
* **Target**: 基本=Top, 右からの長距離戻り=Right。
* **スタイル**: ルール3.0の文字列を使用。
5. **Final Output**:
* XMLコードブロックのみを出力。
# Safety Check
* 縦に単純に並ぶだけの箇所は、間隔が狭くなっているか? (+110)
* レーンをまたぐ線がある箇所は、間隔が広くなっているか? (+180)
* スタイルや固定座標はルール通りか?
作図結果
生成された業務フロー記述データ を Gem に投入すると、XMLデータが生成されます。
この内容をコピーして、draw.ioファイル(.drawio)にペーストします。
生成された XMLデータ
<mxGraphModel>
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="lane1" value="申請者" style="shape=swimlane;html=1;startSize=30;horizontal=1;fillColor=#ffffff;swimlaneFillColor=#ffffff;strokeColor=#000000;fontSize=14;fontStyle=1;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="250" height="2000" as="geometry" />
</mxCell>
<mxCell id="lane2" value="上長" style="shape=swimlane;html=1;startSize=30;horizontal=1;fillColor=#ffffff;swimlaneFillColor=#ffffff;strokeColor=#000000;fontSize=14;fontStyle=1;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="290" y="40" width="250" height="2000" as="geometry" />
</mxCell>
<mxCell id="lane3" value="経理担当" style="shape=swimlane;html=1;startSize=30;horizontal=1;fillColor=#ffffff;swimlaneFillColor=#ffffff;strokeColor=#000000;fontSize=14;fontStyle=1;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="540" y="40" width="250" height="2000" as="geometry" />
</mxCell>
<mxCell id="n1" value="開始" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#ffffff;strokeColor=#000000;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="125" y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="n2" value="申請書作成
(仮払い要否を選択)" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="85" y="210" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n1" target="n2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n3" value="出張申請の
承認判断" style="rhombus;whiteSpace=wrap;html=1;perimeter=rhombusPerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="335" y="390" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="e2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n2" target="n3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n4" value="申請内容の
修正・再提出" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="85" y="570" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e3" value="差し戻す" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0;exitY=0.5;entryX=0.5;entryY=0;" edge="1" parent="1" source="n3" target="n4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0;exitY=0.5;entryX=0.5;entryY=0;" edge="1" parent="1" source="n4" target="n3">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="60" y="600" />
<mxPoint x="60" y="370" />
<mxPoint x="395" y="370" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="n6" value="申請確認・
仮払い金支払い" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="585" y="750" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e5" value="承認
(仮払い希望)" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=1;exitY=0.5;entryX=0.5;entryY=0;" edge="1" parent="1" source="n3" target="n6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n7" value="仮払い金の受領" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="85" y="930" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n6" target="n7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n9" value="宿泊・交通の手配
および出張実施" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="85" y="1110" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e7" value="承認
(仮払い不要)" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n3" target="n9">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="395" y="500" />
<mxPoint x="230" y="500" />
<mxPoint x="230" y="1080" />
<mxPoint x="145" y="1080" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="e8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n7" target="n9">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n10" value="経費精算書の
作成・提出" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="85" y="1220" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n9" target="n10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n11" value="精算内容の確認" style="rhombus;whiteSpace=wrap;html=1;perimeter=rhombusPerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="335" y="1400" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="e10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n10" target="n11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n12" value="精算書の
修正・再提出" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="85" y="1580" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e11" value="不備あり" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0;exitY=0.5;entryX=0.5;entryY=0;" edge="1" parent="1" source="n11" target="n12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0;exitY=0.5;entryX=0.5;entryY=0;" edge="1" parent="1" source="n12" target="n11">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="60" y="1610" />
<mxPoint x="60" y="1380" />
<mxPoint x="395" y="1380" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="n14" value="領収書突合・
精算額確定" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="585" y="1760" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e13" value="問題なし" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=1;exitY=0.5;entryX=0.5;entryY=0;" edge="1" parent="1" source="n11" target="n14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n15" value="最終精算
(支給または返金)" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;perimeter=rectanglePerimeter;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1">
<mxGeometry x="585" y="1870" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n14" target="n15">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="n16" value="終了" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#ffffff;strokeColor=#000000;verticalAlign=middle;align=center;fontSize=12;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="625" y="1980" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="e15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;entryPerimeter=0;strokeColor=#000000;strokeWidth=1;fontSize=11;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="n15" target="n16">
<mxGeometry relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
下図は、このファイルを Draw.io で表示させた結果です。
補足
以下は、インシデント対応時の業務フローを作成した結果です。
「役割」や「担当者」が増えれば、「レーン」も自動的に拡充されます。
業務フロー記述データ(インシデント対応フロー)
[発見者] (開始)
[発見者] (処理) 発見・検知
[発見者] (処理) 情報セキュリティ責任者へ報告
[情報セキュリティ責任者] (処理) 経営者への報告・対応体制構築
[対応担当者] (処理) 初動対応(システム隔離など)
[対応担当者] (処理) 状況調査・情報整理
[情報セキュリティ責任者] (分岐) 対応方針の判断
①自社で直せる場合 : @自社対応ルート
②プロの助けが必要な場合 : @外部相談ルート
@自社対応ルート
[対応担当者] (処理) 自社で対応
[対応担当者] (接続) @修復フェーズ
@外部相談ルート
[情報セキュリティ責任者] (処理) 外部専門家に相談
[情報セキュリティ責任者] (接続) @修復フェーズ
@修復フェーズ
[対応担当者] (処理) 修復作業・証拠保全(直して、何が起こったか記録する)
[対応担当者] (処理) システム復旧・動作確認
[情報セキュリティ責任者] (処理) 再発防止策の検討・実施
[経営者] (処理) 関係者への報告・公表
[経営者] (処理) 関係機関への届出(必要時)
[経営者] (終了)
まとめ
今回の検証では、何とか許容範囲内の品質で作図することができました。
使用する AIモデル の性能に大きく依存してしまいますが、「AIがベースを作成し、人間が微調整する」 というスタイルは、フロー作成の工数を大幅に削減してくれるでしょう。
完全にノーミスというわけにはいかず、たまに接続線が変なルートを通ることもありますが、ゼロから図を描く手間を考えれば、ある程度の実現性は確保できると思われます。
