32
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI で業務フロー図を作成してみた話

Posted at

業務フローの作成は、プロセスの整理には欠かせない一方で、ツール(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="申請書作成&#xa;(仮払い要否を選択)" 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="出張申請の&#xa;承認判断" 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="申請内容の&#xa;修正・再提出" 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="申請確認・&#xa;仮払い金支払い" 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="承認&#xa;(仮払い希望)" 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="宿泊・交通の手配&#xa;および出張実施" 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="承認&#xa;(仮払い不要)" 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="経費精算書の&#xa;作成・提出" 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="精算書の&#xa;修正・再提出" 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="領収書突合・&#xa;精算額確定" 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="最終精算&#xa;(支給または返金)" 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 で表示させた結果です。

補足

以下は、インシデント対応時の業務フローを作成した結果です。
「役割」や「担当者」が増えれば、「レーン」も自動的に拡充されます。

業務フロー記述データ(インシデント対応フロー)

[発見者] (開始)
[発見者] (処理) 発見・検知
[発見者] (処理) 情報セキュリティ責任者へ報告
[情報セキュリティ責任者] (処理) 経営者への報告・対応体制構築
[対応担当者] (処理) 初動対応(システム隔離など)
[対応担当者] (処理) 状況調査・情報整理

[情報セキュリティ責任者] (分岐) 対応方針の判断
   ①自社で直せる場合 : @自社対応ルート
   ②プロの助けが必要な場合 : @外部相談ルート

@自社対応ルート
[対応担当者] (処理) 自社で対応
[対応担当者] (接続) @修復フェーズ

@外部相談ルート
[情報セキュリティ責任者] (処理) 外部専門家に相談
[情報セキュリティ責任者] (接続) @修復フェーズ

@修復フェーズ
[対応担当者] (処理) 修復作業・証拠保全(直して、何が起こったか記録する)
[対応担当者] (処理) システム復旧・動作確認
[情報セキュリティ責任者] (処理) 再発防止策の検討・実施
[経営者] (処理) 関係者への報告・公表
[経営者] (処理) 関係機関への届出(必要時)
[経営者] (終了)

Draw.io で表示させた結果

まとめ

今回の検証では、何とか許容範囲内の品質で作図することができました。
使用する AIモデル の性能に大きく依存してしまいますが、「AIがベースを作成し、人間が微調整する」 というスタイルは、フロー作成の工数を大幅に削減してくれるでしょう。

完全にノーミスというわけにはいかず、たまに接続線が変なルートを通ることもありますが、ゼロから図を描く手間を考えれば、ある程度の実現性は確保できると思われます。

32
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?