AIにMarkdownモデルを作らせると何が壊れるのか:Model Weave Dogfoodで見えた落とし穴

Model Weave
この記事は約8分で読めます。

前回は、Model Weave自身をModel Weaveでモデル化するDogfoodの取り組みについて書きました。

Model Weaveは、Markdownを正本として、設計モデルや図、プレビュー、診断結果などを扱うためのObsidianプラグインです。

今回のDogfoodでは、Model WeaveのソースコードやドキュメントをAIに読ませ、Model Weave形式のMarkdownモデルを生成・更新していきました。

この試み自体はかなり有効でした。

人間がゼロから構造を整理するより、AIに初稿を作らせた方が速い。
ソースやREADME、仕様メモを元に、機能の一覧や関係性をそれらしく整理することもできます。

ただし、実際にやってみると、すぐに問題も見えてきました。

AIが生成したMarkdownは、人間が読むだけなら自然に見えます。
しかし、それをModel Weaveのモデルとしてパースし、図やプレビューに変換しようとすると、構造が壊れていることがあります。

今回は、その中でも特に大きかった Markdownテーブルの崩れFORMAT不一致 の話を整理します。

人間には自然でも、パーサーには壊れている

AIは、文脈を見て「こういう列があった方が便利そうだ」と判断することがあります。

たとえば、あるモデルのInputsセクションに、次のようなテーブルが必要だったとします。

| id | data | source | required | notes |
|---|---|---|---|---|

ところがAIは、他のモデルで ref 列を見ていたり、「参照先を書いた方が便利そう」と判断したりして、次のようなテーブルを作ることがあります。

| id | data | source | required | ref | notes |
|---|---|---|---|---|---|

人間が読む分には、それほど不自然ではありません。
むしろ「refがあった方が便利そう」に見えます。

しかし、Model Weaveのパーサーは、モデル種別ごとのFORMATに従ってテーブルを読み取ります。
期待している列構成と実際の列構成が違えば、正しく解析できません。

AIにとっては親切な補完でも、構造化データとしては破損になります。

AIは“似ている形式”を混ぜる

特に厄介だったのは、AIが似た形式を混ぜることです。

たとえば、data_objectapp_processrule などは、どれもMarkdownテーブルを使います。
セクション名も、FieldsInputsOutputs のように似ています。

AIはこれらを見比べて、かなり自然に「同じようなもの」と扱います。

その結果、あるモデル種別にしか存在しない列を、別のモデル種別にも追加してしまうことがあります。

例として、以下のようなズレが起きます。

# OK
| id | data | source | required | notes |

# NG
| id | data | source | required | ref | notes |

あるいは、

# OK
| id | data | target | notes |

# NG
| id | data | target | ref | notes |

こうしたズレは、単なる表記ゆれではありません。
パーサーが列位置を前提にしている場合、1列増えただけで、後続の値がすべてずれて読まれる可能性があります。

これは、AI生成Markdownを「文章」ではなく「構造データ」として扱うときに避けて通れない問題です。

“便利そうな列”が一番危ない

今回特に多かったのは、次のような列の追加です。

  • ref
  • rule
  • description
  • notes
  • source
  • target

これらは、どれも設計情報としては自然な名前です。

AIにとっても使いやすい。
人間にとっても意味が分かりやすい。

だからこそ危険です。

たとえば、notes は多くのテーブルにありそうな列です。
しかし、すべてのFORMATに存在するとは限りません。

description も同じです。
自然言語の説明を入れたくなると、AIはすぐに追加しがちです。

でも、Model WeaveのようにMarkdownをモデルとしてパースする場合、列は自由に増やせません。

列を増やしたい場合は、FORMATを変更する必要があります。
AIがその場の判断で足してよいものではありません。

Markdownテーブルは見た目より壊れやすい

もう一つ問題になったのは、テーブルセル内の記述です。

Markdownテーブルでは、| が列区切りです。

そのため、TypeScriptやプログラミング言語では自然な次のような表記が、Markdownテーブルでは危険になります。

string | null

人間には「文字列またはnull」と読めます。
しかしMarkdownテーブル内では、| が列区切りとして解釈される可能性があります。

同じように、Wikilinkのエイリアスも危険です。

[[DATA-USER|User]]

Obsidianでは自然な書き方です。
しかし、Markdownテーブルの中では | を含むため、列崩れの原因になります。

つまり、Obsidianでは便利な記法でも、構造化テーブルの中では安全とは限りません。

型表記もシンプルに寄せる必要があった

AIは、ソースコードを読ませると、プログラム寄りの型表記を自然に使います。

たとえば、

string[]
Array<string>
Optional<string>
string | null

といった表記です。

コードの説明としては自然です。
しかし、MarkdownテーブルやViewer表示、将来のパーサー互換性を考えると、こうした表記はリスクになります。

特に Array<string> のような山括弧つき表記は、MarkdownやHTMLレンダリングと相性が悪い場合があります。
string[] も、シンプルに見えても、フォーマット上は警告対象にした方が安全です。

そこで、Dogfoodモデルでは、型表記をできるだけ単純に寄せる方針にしました。

たとえば、ERの data_type では、

string
number
boolean
datetime

のような単純型を優先します。

複数値であることや任意項目であることは、型に詰め込まず、

  • required
  • not_null
  • notes

のような列で表現します。

これは少し地味ですが、かなり重要です。

プログラムとして自然な型表記が、Markdownモデルとして安全とは限らない。
この切り分けが必要でした。

frontmatterのWikilinkも注意が必要

もう一つ、Dogfoodで見えた落とし穴がfrontmatterです。

ObsidianではWikilinkをよく使います。

本文中であれば、次のような書き方は普通です。

[[DATA-MW-DFD-FLOW-ENTRY]]

しかし、frontmatterはMarkdown本文ではなくYAMLです。

そのため、frontmatter内でWikilinkを書く場合は、クォートした方が安全です。

source: "[[DATA-MW-DFD-FLOW-ENTRY]]"

未クォートのまま書くと、YAMLとして不安定になったり、ツールによって解釈が変わったりする可能性があります。

ここも、人間が見るだけなら気づきにくい部分です。
しかしAIに大量生成・更新させる場合、こうした小さな不安定要素が積み重なって、あとから大きな不整合になります。

対策としてガイドを作った

こうした問題が見えてきたので、DogfoodモデルではAI生成用の運用ガイドを作ることにしました。

主なルールは、次のようなものです。

  • MarkdownテーブルのヘッダーはFORMATに完全に合わせる
  • AIの判断で列を追加しない
  • 定義外の情報は notes や任意セクションに逃がす
  • frontmatter内のWikilinkはダブルクォートで囲む
  • テーブル内では | を含む表記を避ける
  • Wikilinkエイリアスをテーブル内で使わない
  • 型表記は単純型を優先する
  • 配列性や任意性は型ではなく別の列やnotesで表現する

これは、Model Weave固有の運用ルールでもあります。
しかし、AIでMarkdownベースの設計資料を生成する場合には、かなり一般的な知見でもあると思います。

AIは「意味が通る文章」を作るのは得意です。
一方で、「厳密な列構造を壊さずに更新する」には、明確なルールと検証が必要です。

AIに任せるほど、形式が重要になる

今回のDogfoodで分かったのは、AIを使うほど形式が重要になる、ということです。

人間が手で1ファイルずつ書くなら、多少の表記ゆれはその場で気づけます。
しかしAIに複数ファイルを生成・更新させる場合、同じミスが広範囲に広がります。

しかも、AIの出力は一見すると自然です。

だからこそ危ない。

見た目には整ったMarkdownでも、FORMATから見ると壊れている。
文章としては正しいが、モデルとしては不正。
この状態が起きます。

AI生成の設計モデルを実用に近づけるには、プロンプトだけでは足りません。

  • FORMAT仕様
  • 生成ルール
  • 診断
  • レビュー
  • 修正ガイド

このあたりをセットで用意する必要があります。

おわりに

AIにMarkdownモデルを作らせることは、十分に実用的です。

既存ソースやドキュメントから、設計モデルの初稿を作る。
人間がゼロから書くより速く、構造の叩き台としても使いやすい。

ただし、AIが生成したMarkdownをそのまま信じることはできません。

特に、Markdownテーブルを構造データとして扱う場合、列の追加、ヘッダーの不一致、セル内の |、Wikilinkエイリアス、複雑な型表記などが問題になります。

今回のDogfoodで分かったのは、AIに設計モデルを作らせるには、自由に書かせることよりも、壊してはいけない構造を明確にすることが重要だということです。

Markdownは自由に書ける形式です。
しかし、それを設計資産として機械的に扱うなら、自由さを少し制限する必要があります。

次回は、今回触れた内容の中でも、Markdownテーブル、Wikilink、型表記を安全に扱うための具体的な記法について、もう少し詳しく整理します。

Model Weave Dogfoodサンプルはこちらから

今回紹介している初回公開版ソースベースDogfood を公開しています。
ご興味のある方は是非ご覧ください。

GitHub – nejimakibird/model-weave-dogfood: This is a sample vault that expresses the specifications of model-weave itself using model-weave.
This is a sample vault that expresses the specifications of model-weave itself using model-weave. – nejimakibird/model-w…

コメント

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