ChatGPTとMermaidでらくらくお絵かき
はじめに
何かの絵を描くのって結構めんどくさいですよね。現段階では、ChatGPTにSVGなどの図を描かせることは精度的に困難です。しかし、Mermaid記法で表現可能な図であればかなりいい感じの図が描けたのでご紹介します。
フローチャート
ここではFizz Buzzのフローチャートを作ってもらいます。
Prompt
Fizz BuzzのフローチャートをMermaid記法で出力してください。
Completion
Mermaidでは、FizzBuzzのフローチャートを次のように表現できます。このコードをMermaidでレンダリングすると、フローチャートが表示されます。
\`\`\`mermaid
graph TD
A[Start] --> B{Count n}
B --> |"n % 3 == 0"| C[Fizz]
B --> |"n % 5 == 0"| D[Buzz]
B --> |"n % 15 == 0"| E[FizzBuzz]
B --> |"Else"| F[Output n]
C --> G[Output "Fizz"]
D --> H[Output "Buzz"]
E --> I[Output "FizzBuzz"]
G --> J{Next n}
H --> J
I --> J
F --> J
J --> B
このフローチャートは、次のようなFizzBuzzのロジックを表しています。
\`\`\`
開始
数値nをカウント
nが3で割り切れる場合、"Fizz"を出力
nが5で割り切れる場合、"Buzz"を出力
nが15で割り切れる場合、"FizzBuzz"を出力
それ以外の場合、nをそのまま出力
nを次の数に進める
ステップ2に戻る
"
のせいでコンパイルエラーになったので除外する必要はありましたが、内容は問題ありませんね。
シーケンス図
レビュープロセスのシーケンス図を作ってもらいます。
Prompt
以下のフローをMermaid記法のシーケンス図で出力してください。
1. プログラマはGithubでpull-requestを作成する
2. レビューアはpull-requestをレビューしてコメントをする
3. プログラマはレビューコメントの指摘を修正したコードをpushする
4. レビューアは修正内容を確認してpull-requestをマージする
5. GithubはGithub Actionを実行してプログラムのビルド・テスト・デプロイをする。
Completion
以下が、Mermaid記法で書かれたシーケンス図です。
\`\`\`mermaid
sequenceDiagram
participant プログラマ
participant Github
participant レビューア
participant GithubAction
プログラマ->>Github: pull-requestを作成
Github->>レビューア: pull-requestを通知
レビューア->>Github: コメントを投稿
Github->>プログラマ: コメントを通知
プログラマ->>Github: 修正コードをpush
Github->>レビューア: 修正内容を通知
レビューア->>Github: pull-requestをマージ
Github->>GithubAction: ビルド・テスト・デプロイを実行
\`\`\`
このコードをMermaidを使ってレンダリングすると、指定されたフローに従ったシーケンス図が生成されます。
これもいい感じです!面倒くさくて省略したGithubからの通知なども空気を読んでちゃんと表現してくれました。
ER図
あらかじめChatGPTに生成してもらった以下のモデルでERDを作ってもらいます。
- 商品 (Product)
- 商品ID (ProductID) - 主キー
- 商品名 (ProductName)
- 商品説明 (ProductDescription)
- 単価 (UnitPrice)
- 在庫数 (StockQuantity)
- 顧客 (Customer)
- 顧客ID (CustomerID) - 主キー
- 氏名 (FullName)
- 電話番号 (PhoneNumber)
- メールアドレス (EmailAddress)
- 住所 (Address)
- 注文 (Order)
- 注文ID (OrderID) - 主キー
- 顧客ID (CustomerID) - 外部キー
- 注文日 (OrderDate)
- 配送日 (DeliveryDate)
- 配送先住所 (ShippingAddress)
- 合計金額 (TotalAmount)
- ステータス (Status)
- 注文明細 (OrderDetail)
- 注文明細ID (OrderDetailID) - 主キー
- 注文ID (OrderID) - 外部キー
- 商品ID (ProductID) - 外部キー
- 数量 (Quantity)
- 単価 (UnitPrice)
- 小計 (Subtotal)
- 仕入先 (Supplier)
- 仕入先ID (SupplierID) - 主キー
- 仕入先名 (SupplierName)
- 連絡先 (Contact)
- 電話番号 (PhoneNumber)
- メールアドレス (EmailAddress)
- 住所 (Address)
- 入庫 (InventoryReceipt)
- 入庫ID (InventoryReceiptID) - 主キー
- 仕入先ID (SupplierID) - 外部キー
- 商品ID (ProductID) - 外部キー
- 入庫日 (ReceiptDate)
- 数量 (Quantity)
- 単価 (UnitCost)
Prompt
上記のエンティティモデルのERDをmermaid形式で出力してください。
Completion
以下に、上記エンティティモデルのERDをmermaid形式で出力します。
\`\`\`mermaid
erDiagram
Product ||--o{ OrderDetail : "1対多"
Customer ||--o{ Order : "1対多"
Order ||--o{ OrderDetail : "1対多"
Supplier ||--o{ InventoryReceipt : "1対多"
Product ||--o{ InventoryReceipt : "1対多"
Product {
int ProductID
string ProductName
string ProductDescription
float UnitPrice
int StockQuantity
}
Customer {
int CustomerID
string FullName
string PhoneNumber
string EmailAddress
string Address
}
Order {
int OrderID
int CustomerID
date OrderDate
date DeliveryDate
string ShippingAddress
float TotalAmount
string Status
}
OrderDetail {
int OrderDetailID
int OrderID
int ProductID
int Quantity
float UnitPrice
float Subtotal
}
Supplier {
int SupplierID
string SupplierName
string Contact
string PhoneNumber
string EmailAddress
string Address
}
InventoryReceipt {
int InventoryReceiptID
int SupplierID
int ProductID
date ReceiptDate
int Quantity
float UnitCost
}
\`\`\`
このコードをmermaidでサポートされているツールやオンラインエディタに貼り付けることで、ERDを視覚化できます。オンラインエディタの例として、Mermaid Live Editorが利用できます。
これも完璧ですね!
Mermaidで描けない絵
現時点でSVGを使ってどの程度の絵が描けるのか試してみます。今回はスタックとキューの違いについて説明する図を作ってもらいます。図のクオリティを上げるために、あらかじめChatGPTに図のイメージを考えてもらいました。
-
スタックの図:
縦長の箱を描き、その中に横長の長方形を複数重ねる形でデータ要素を表現します。
スタックの上部に「Push」と書かれた矢印を描き、新しいデータが上から追加されることを示します。
同じく上部に「Pop」と書かれた矢印を描き、データが上から削除されることを示します。
上に重なったデータ要素が最初に取り出される「LIFO (Last In, First Out)」という概念を強調するため、データ要素の横に「最初に入ったデータ」「最後に入ったデータ」などのラベルを付けるとわかりやすくなります。 -
キューの図:
横長の箱を描き、その中に縦長の長方形を複数並べる形でデータ要素を表現します。
キューの左側に「Enqueue」と書かれた矢印を描き、新しいデータが左から追加されることを示します。
同じく右側に「Dequeue」と書かれた矢印を描き、データが右から削除されることを示します。
最初に入れられたデータ要素が最初に取り出される「FIFO (First In, First Out)」という概念を強調するため、データ要素の横に「最初に入ったデータ」「最後に入ったデータ」などのラベルを付けるとわかりやすくなります。
Prompt
上記の図をsvgコードで作成してください。
Completion
以下は、上記の説明に基づくスタックとキューの図をSVGコードで作成したものです。
\`\`\`html
<svg width="500" height="300" xmlns="http://www.w3.org/2000/svg">
<!-- Stack -->
<rect x="30" y="50" width="100" height="200" stroke="black" fill="none" stroke-width="2"/>
<text x="65" y="40" font-size="14" font-weight="bold">Stack</text>
<rect x="40" y="190" width="80" height="20" fill="lightblue"/>
<text x="45" y="205" font-size="12">最初に入ったデータ</text>
<rect x="40" y="160" width="80" height="20" fill="lightblue"/>
<rect x="40" y="130" width="80" height="20" fill="lightblue"/>
<rect x="40" y="100" width="80" height="20" fill="lightblue"/>
<text x="45" y="115" font-size="12">最後に入ったデータ</text>
<text x="25" y="80" font-size="12">Pop</text>
<text x="125" y="80" font-size="12">Push</text>
<polyline points="45,65 40,80 55,80" stroke="black" fill="none" stroke-width="1.5" />
<polyline points="125,65 120,80 135,80" stroke="black" fill="none" stroke-width="1.5" />
<!-- Queue -->
<rect x="270" y="50" width="200" height="100" stroke="black" fill="none" stroke-width="2"/>
<text x="355" y="40" font-size="14" font-weight="bold">Queue</text>
<rect x="280" y="60" width="20" height="80" fill="lightblue"/>
<text x="260" y="100" font-size="12">最初に入ったデータ</text>
<rect x="310" y="60" width="20" height="80" fill="lightblue"/>
<rect x="340" y="60" width="20" height="80" fill="lightblue"/>
<rect x="370" y="60" width="20" height="80" fill="lightblue"/>
<text x="390" y="100" font-size="12">最後に入ったデータ</text>
<text x="310" y="175" font-size="12">Enqueue</text>
<text x="370" y="175" font-size="12">Dequeue</text>
<polyline points="295,155 310,170 310,140" stroke="black" fill="none" stroke-width="1.5" />
<polyline points="370,140 385,155 370,170" stroke="black" fill="none" stroke-width="1.5" />
</svg>
\`\`\`
このSVGコードをHTMLファイルに貼り付けることで、スタックとキューの違いを示す図が表示されます。図のデザインやサイズを変
うーん、結構ぐちゃぐちゃですね。このレベルの単純な図でも現時点では厳しいようです。しかし、なんとかがんばろうとしている姿勢と、これから期待の意味を込めて★4つです!
まとめ
ChatGPT X Mermaidを使えば本当に簡単に図を描けました。今回試したのは3種類ですが、他の図のこの方法で描けるはずです。また、SVGの出力についても精度に課題はるものの可能性の片鱗は見えました。皆さんもぜひ試してみてください!
Discussion