← 기사 목록
日本語https://zenn.dev/topics/llm/feed

AI に HTML を直接生成させるのはなぜ効くのか—Markdown との比較と Zenn ワークフローへの適用

추출된 키워드

40
HTML·5Markdown·5AI·5Zenn ワークフロー·4Claude Code·4AI エージェント·4マルチエージェントワークフロー·3Retrieval-Augmented Generation·3RAG·3Mermaid·3LLM·3Karpathy·3Thariq Shihipar·3Anthropic·3SVG·3JS·3CSS·3Alpine.js·2GPT 系·2sandbox·2iframe·2間接プロンプトインジェクション·2Content Security Policy·2CSP·2Google Analytics·2Observable·2Jupyter·2MDX·2MCP·2Claude Artifacts·2Live Artifacts·2Chart.js·2Tailwind CDN·2Cloudflare R2·2Netlify·2GitHub·1Slack·1Hacker News·1draw.io·1sanitize-html·1

원문

23,984
AI に HTML を直接生成させるのはなぜ効くのか—Markdown との比較と Zenn ワークフローへの適用

AI に HTML を直接生成させるのはなぜ効くのか—Markdown との比較と Zenn ワークフローへの適用

Markdown の狭いキャンバスと HTML の広いキャンバスの対比

はじめに

あなたは、AI エージェントが吐き出した 200 行の Markdown レポートを、本当に最後まで読み切ったことがありますか?

Anthropic で Claude Code のエンジニアリングリードを務める Thariq Shihipar は、こう書いています。

I tend to not actually read more than a 100-line markdown file, and I certainly am not able to get anyone else in my organization to read it.


(100 行を超える Markdown を私自身が読み切ることはほとんどないし、組織の誰かに読ませることはもっと難しい)

マルチエージェントで生成したレポートが、誰にも読まれないまま

tmp/
ディレクトリに積み上がっていく。
/editorial
/analytics
(本記事で扱う筆者の Zenn 編集ワークフロー用カスタムコマンド。詳細は後述)でレビューを並列実行しても、最後は人間が長文の Markdown を斜め読みして判断する——そんな経験はないでしょうか。筆者は以前 12 エージェントの編集チーム でこの課題に直面しました。

AI エージェントが吐き出す Markdown レポートは、長くなるほど誰にも読まれません。本記事では Claude Code で AI に HTML を直接生成させる「不当な有効性」を、Thariq Shihipar・Karpathy らの資料と Markdown との比較で検証し、Zenn 編集ワークフローへの統合案を提示します。

本記事は、Claude Code でマルチエージェントワークフローをすでに組んでいて、AI 出力レポートの表現力に限界を感じている方を対象にしています。

なぜ今、AI に HTML を直接生成させるのか?

結論から: Markdown はテキストの「狭いキャンバス」であり、AI エージェントの思考密度に対して表現力が足りません。一方で HTML+CSS+JS+SVG は単一ファイルで成立する「広いキャンバス」であり、現代の LLM はそれを高品質に書ける学習量を持っています。

Markdown の「狭いキャンバス」問題

Markdown が苦手なものを並べてみます。

  • タブ式の比較: 5 つの選択肢を切り替えながら見比べる
  • 空間レイアウト: 並列の概念を縦並びでしか表現できない
  • インタラクション: スライダー・トグル・フィルタが置けない
  • 精密な図解: Mermaid の構文制約を超える SVG 表現
  • 実行可能なミニアプリ: その場で値を変えて挙動を試す

Thariq は元記事で 20 の出力例を比較し、HTML が「Markdown より consumable(消費しやすい)」だった例を 17 件挙げています(注: この具体数は二次まとめ記事による要約で、Thariq 元記事には個別比較が掲載されるのみ。出典: Anthropic's Thariq stopped writing Markdown — Chew Loong Nian)。これは「AI を賢くするための形式」ではなく、「AI のアウトプットを人間に届けるための形式」の話です。

Thariq 自身の言葉が核心を突いています。

HTML does not make AI agents smarter. It makes their output consumable.

— Thariq Shihipar(出典:

AgentUpdate.ai 要約

Karpathy の「視覚は脳への 10 車線高速道路」論

Andrej Karpathy も 2025 年 5 月、X で同じ方向の提案をしています。「LLM への入力としては音声が便利だが、出力としては視覚が圧倒的に効率がいい」「raw text → Markdown → HTML → interactive neural video の順に情報帯域が広がる」というものです(出典: Quasa による Karpathy 解説dsebastien.net 2026-05-12)。

Markdown は raw text に CSS が少しだけ生えたものに過ぎません。AI の応答末尾に "Format your entire response as a complete HTML document" を付けて

response.html
で開く——Karpathy のこのライフハックが SNS で話題になったのは、誰もが「Markdown の壁」に薄々気づいていたからでしょう。

Markdown ファースト vs HTML ファーストで思考が変わる

結論: Markdown → HTML 変換では、AI の思考プロセスに「インタラクション」「SVG」「空間レイアウト」が最初から織り込まれません。後から見た目だけ装飾しても、表現の天井は Markdown のままです。

たとえば、AI に「3 つの設計案を比較したい」と頼んだとき。

  • Markdown ファーストの場合: 表が出てくる。各案の長所短所が列挙される。読み手は表を上から下に走査する。
  • HTML ファーストの場合: タブ切り替えの比較ボードが出てくる。各タブ内に「適用すべきケース」「リスク」「実装サンプル」がアコーディオンで畳まれている。ユーザーの関心軸(コスト優先か、保守性優先か)でフィルタできる。

後者を Markdown から自動変換で作るのは無理です。「インタラクションを許す」と AI に伝えた瞬間に、思考の解像度が変わる——これが Thariq の言う effectiveness の正体です。

「比較ボード」「タイムライン」「決定マトリックス」「ステップガイド」など、用途別の出力パターンを「思考フレームのプリセット」として AI に与えると効きます。AI に「どんな視点で整理するか」のメタ構造を最初から渡すことで、思考の解像度が変わるのです。

実装上は、こうしたパターンを Claude Code の

.claude/agents/<role>.md
.claude/skills/<name>/SKILL.md
内に「比較を要求されたらタブ式比較ボード HTML を出す」のような出力指示として書き込んでおくと、毎回のプロンプトで指示し直さなくても自動的にパターンが適用されます。これは hooks や MCP を増やすのとは別の、もっと軽い「組織化」のアプローチです。

Markdown と HTML の比較マトリックス

結論: 入力フォーマットとしては Markdown が依然として優位、出力フォーマットとしては HTML が優位、というのがコミュニティで支持を集めつつある見方です。

観点MarkdownHTML+CSS+JS+SVG
入力トークン効率HTML→MD 変換で 68〜87.5% 削減(基準)

約 3.1〜8 倍(HTML が冗長)

出力としての表現力見出し・表・コードのみタブ・スライダー・SVG・空間レイアウト
diff レビュー行差分が読みやすい属性順・空白で差分が荒れる

編集摩擦人が直接書き直せるLLM への再プロンプトが必要

共有のしやすさGitHub・Slack で素のまま単一ファイル HTML を Netlify/R2 等にデプロイ
表抽出精度(GPT 系)60.7%53.6%

AI クローラの解釈プラットフォーム経由で HTML 化される最初からセマンティック HTML

役割分担の図: LLM の出力先を「次に誰が読むか」で選ぶ

ここまでの議論を 1 枚にまとめると、Markdown と HTML は対立するフォーマットでも、片方からもう片方への変換経路でもありません。LLM が直接ネイティブ生成できる、並列の出力選択肢です。AI に「まず Markdown を書かせて、それを HTML に変換する」のではなく、最初から「次に誰が読むか」に合わせてどちらかを生成させる——これが本記事の中核主張です。

  • 次に機械(LLM・RAG・Git)が読むなら Markdown: トークン効率と差分可読性に優れる。連鎖プロンプト・コンテキスト投入・diff レビュー・RAG インデックスに向く
  • 次に人間が読むなら HTML+CSS+JS+SVG: タブ・スライダー・SVG 図解・空間レイアウトで情報帯域を広げる。視覚・対話・空間認知に最適化された層

LLM の出力は、用途に応じて Markdown か HTML を直接書かせる形になります。レビューサマリやプロンプト断片のように「次の LLM・Git・RAG が読む」ものは Markdown、企画書・ダッシュボード・仕様書のように「人間が読む」ものは HTML です。Markdown を経由して HTML に変換する必要はなく、後者が必要なら最初から HTML を書かせます。

なお LLM に入力するコンテキスト側(原本・RAG・参照ドキュメント)も、トークン効率と意味抽出のしやすさから Markdown が依然として有利です。RAG(検索拡張生成、Retrieval-Augmented Generation)のインデックス対象として Markdown が選ばれる理由はここにあります。

この「機械が読む用途は Markdown / 人間が読む用途は HTML、どちらも LLM がネイティブ生成」という二段構えは、Thariq 元記事と Hacker News 議論 item 48071940 の上位コメント群でも繰り返し言及されている結論です。

AI に HTML を書かせる 4 つのユースケース(仕様書・シミュレータ・SVG 図解・ダッシュボード)

結論: 単一ファイル HTML として生成させ、静的ファイルホスティング(Netlify / Cloudflare R2 等)で共有 URL 化するパターンが現実的です。依存ゼロまたは Tailwind CDN + Alpine.js(軽量フロントエンドフレームワーク、Tailwind と組み合わせて HTML 1 枚に収めやすい)の組合せが定番です。Zenn 記事内では生 HTML をレンダリングできないため、コード片とスクリーンショット・外部リンクで成果物を見せます。

ユースケース 1: インタラクティブな仕様書

仕様書を HTML で書かせると、「タブで章を切り替える」「サイドバーで該当箇所にジャンプ」「該当部分にだけアコーディオンで根拠ドキュメントを畳む」といった構造が一発で出ます。Markdown 仕様書では章間ジャンプが「目次まで戻る → 目的の節を探す」という 2 ステップになるのに対し、HTML 仕様書はタブ・サイドバー・アンカーで 1 クリックに圧縮できる体験差が生まれます。

プロンプト雛形は以下のように、単一ファイル・無依存を明示するのがコツです(HN 上位コメント item 48071940 で広く共有されている定型)。

In `spec.html`, no runtime build dependencies (Tailwind CDN is allowed),
create an interactive specification document for [機能名]. Use tabs to switch
between sections. Each section should have collapsible "rationale" details.
Output a complete, self-contained HTML document.

no external dependencies ではなく no runtime build dependencies (Tailwind CDN is allowed) とすることで、ビルド不要のまま Tailwind の組版を借ります。本番運用には Tailwind CLI ビルドが Tailwind 公式推奨です。

ユースケース 2: パラメータシミュレータ

「料金プランを 5 パラメータで計算するページ」「リトライ戦略を指数バックオフのパラメータでシミュレートするページ」など。スライダーと電卓を JS で書かせると、ステークホルダーが自分の手で値を動かして納得できます。

Markdown 表で全パターンを書き出す方法と比べ、「読まれる確率」が有意に改善する例が複数報告されています(Simon Willison の解説 は、長年 Markdown 推しだった氏が「PR レビューの差分表示や CVE 解析を対話的 HTML にすることで使われるようになった」と転向理由を述べています)。

ユースケース 3: SVG での精密図解

Mermaid は Zenn ネイティブサポートで便利な反面、ノード・矢印・サブグラフといった「決まった部品」を組み合わせる宣言型 DSL のため、自由度に上限があります。たとえば下の図は、ウェブ アプリの「キャッシュヒット時 5ms / 原本フェッチ時 150ms」という分岐を Mermaid で書いたものです。

このような 「四角・ひし形・矢印」だけで完結する単純な分岐や処理フロー であれば、Mermaid で十分です。一方で、Mermaid が苦手なのは以下のような構造です。

  • 斜め線・自由曲線・任意角度の配線: たとえば AWS VPC のサブネット間トラフィックを「東西方向のフロー」「南北方向のフロー」と斜め配線で描き分けたい場合
  • 要素同士の重なり・透過レイヤ:「責任境界(外側の枠)」と「コンポーネント(内側の枠)」を半透明で重ねたい場合
  • 数値ラベル付きの確率遷移図: ステートマシンの各遷移に「0.83 / 0.17」のような確率を付けて視覚化したい場合
  • 非対称な座標配置: タイムライン上の不等間隔配置、地理的な相対位置を反映した配置など

こうした「Mermaid の語彙の外」にある図を AI に描かせるとき、SVG コードを直接生成させて

images/<slug>/foo.svg
として配置するのが有効です。SVG は Zenn の Markdown 画像記法
![](/images/ai-agent-html-output-design/diagram.svg)
で表示できます。注意点として、Zenn は SVG を
sanitize-html
経由で配信するため、
<script>
要素やアニメーション(
<animate>
等)はストリップされ、静的な図解としてのみ機能 します。

なお、もう少し凝った図をマウス操作で組みたい場合は、draw.io MCP 経由でスクリーンショットを取る方式が便利です。詳しい使い分けは別記事に整理しています。

ユースケース 4: ミニダッシュボード(GA・PR レビュー指標)

/analytics
で集めた GA データや、
/review
で集めたレビューサマリを、AI に単一 HTML のダッシュボードへ落とさせます。Chart.js を CDN で読み込ませる、あるいは SVG で棒グラフを直接書かせれば、外部依存ゼロのまま再現性のある成果物になります。たとえば 3 ペイン構成例(PV 推移グラフ・検索クエリ Top10 リスト・直帰率ヒートマップ)を 1 枚の HTML にまとめれば、編集会議に即持ち込めます。

ローカル単一 HTML 版(再現性重視)と Anthropic がホストする発展形 Live Artifacts(外部データソース連携)の 2 段構えがあります。Anthropic は 2025 年 10 月に Live Artifacts(Claude Artifacts の拡張機能。データソース連携で再オープン時に自動更新)を出しており、再オープン時に自動更新されるダッシュボードも作れるようになりました(出典: Use Live Artifacts in Claude Cowork)。

HTML 出力のデメリットと Markdown との使い分け方針

結論: HTML 出力は万能ではありません。

tmp
命の使い捨て成果物・ステークホルダー共有には強いが、原本・差分管理・CI ログには Markdown のままが正解です。

主なデメリットを整理します。

  • 編集摩擦: HTML を人が手で直すのは大変で、修正のたびに LLM に再プロンプトを投げることになりがちです。
  • トークンコスト: ある実測例では同じレポートで Markdown 3,150 トークン vs HTML 16,180 トークン(約 5 倍)という報告があります(出典:DIGIDAY: HTML は AI に不向き?)。一方で「確認漏れによる再生成回数」を含めればトータルで HTML が安いケースもあるという反論もあります(きしだのHatena 2026-05-09)。
  • diff レビューの劣化: 属性順や空白の差分で Git レビューが荒れます。
  • セキュリティ: AI 生成 HTML を社内共有する際は、以下のチェックリストで最低限の隔離を確保します。
    • 別 Origin にホスト: 社内ツールと同じ Origin に置かない(Cookie/localStorage 経由の漏洩防止)
    • iframe:
      sandbox
      属性
      sandbox="allow-scripts"
      allow-same-origin
      は外す)でスクリプト実行をユニーク Origin に隔離(HTML Living Standard
    • CSP(Content Security Policy)の付与: 外部 fetch を allowlist で制限
    • 外部 fetch の監査: 生成 HTML の
      <script>
      <img>
      fetch
      先を目検またはツールで確認
      2026 年 3 月には Claude Chrome 拡張で間接プロンプトインジェクション(外部 ウェブ ページ経由で AI に意図しない指示を流し込む攻撃)の事例も報告されています(出典:The Hacker News 2026-03)。
  • ターミナル/CI ログ環境では恩恵ゼロ: CLI 出力・CI ログには HTML は不向きです。

laiso 氏の「耐久性層別化」フレームは実践的な指針になります(出典: AI 時代のリッチテキスト形式。laiso 氏のフレームを本記事の Zenn ワークフローに当てはめて再整理しました)。

耐久性用途推奨フォーマット
数時間〜数日レビュー、データ探索、社内共有生 HTML(単一ファイル)
数週間〜数ヶ月機能仕様書、提案書MDX(Markdown + JSX) / Notebook(Jupyter / Observable 等)
半年以上製品ドキュメント、Zenn 記事Markdown 原本

「Markdown は死んだ」は誤読です。入力・原本・RAG・差分管理では Markdown が依然優位で、出力・共有・体験では HTML が優位、という役割分担が現実解です。

Zenn 編集ワークフロー(/editorial・/analytics・/review)への統合案

前提: AI エージェントで Zenn 編集ワークフローを回すとは

本セクションは、筆者が運用している「Zenn 記事の企画 → 執筆 → レビュー → 公開」を Claude Code のマルチエージェントで自動化したワークフローを前提に話を進めます。読み進めるうえで、最低限以下のイメージを共有しておきます。

  • (編集会議): 下書きスクラップを元に、編集長・SEO レビュアー・読者ペルソナなど複数の AI エージェントが議論し、ターゲット読者・構成案・絵文字・slug を決めて Issue と Draft PR を起票するスラッシュコマンド
    /editorial
  • (執筆): Researcher・Writer・Reviewer などのエージェントが協調して記事本文・図表・レビューを生成するスラッシュコマンド
    /draft
  • (追加レビュー): 構成レビュー → SEO + 技術レビュー → 読者視点 → 批判的レビュー → 編集長統合判断、の 5 ステージ逐次パイプラインで再レビューするスラッシュコマンド
    /review
  • (GA 分析): Google Analytics のデータをエージェントが読み込み、人気記事・流入キーワード・低パフォーマンス記事を要約するスラッシュコマンド
    /analytics

これら 4 つは Claude Code のカスタムスラッシュコマンドとして実装されており、最終成果物(企画書・記事ドラフト・レビューサマリ・GA レポート)はすべて Markdown ファイルとして

tmp/
や Issue コメントに書き出される構成です。「AI 編集チームを JIT で動かす」「AI 編集チームを『エコシステム』に育てた話」の連載でその全体像を扱っています。

このワークフローを使っていると、Markdown レポートが量産されすぎて、誰も読まない問題が直撃します。

/editorial
が出す企画書、
/analytics
が出す GA サマリ、
/review
が出すレビュー結論、どれも「斜め読みされて雰囲気で OK が出る」状態でした。本セクションは、その問題に対する筆者なりの実践的回答です。

統合方針: 最終出力レイヤだけ HTML 化する

結論: 既存の

/editorial
/analytics
/review
系スラッシュコマンドの最終出力レイヤだけを HTML 化するのが、低リスクで効果が高い適用ポイントです。記事原本は Markdown のまま、レビュー結果や分析レポートだけ HTML にします。

統合ポイント 1:
/editorial
の企画ドラフトを HTML 化

編集会議の企画案を「3 つの構成案を比較するタブ式 HTML」として生成させ、

tmp/editorial/<slug>/proposal.html
に保存。Cloudflare R2 にアップロードして共有 URL 化すると、共著者・編集者にレビュー依頼を出しやすくなります。Markdown 版の企画書(Issue 本文)は議事録として残しつつ、人間が「読みたくなる」のは HTML 版というすみ分けです。

統合ポイント 2:
/analytics
のレポート HTML 化

GA データの分析結果を、フィルタ可能な単一 HTML ダッシュボードとして書かせます。エージェント定義(

.claude/agents/data-analyst.md
相当)の出力指示を Markdown → HTML に切り替えるだけで適用できます。差分のイメージは次の通りです。
- 結果は Markdown 表形式で提示してください。
+ 結果は単一ファイル HTML として `tmp/analytics/<slug>.html` に書き出してください。
+ Tailwind CDN を許容、Chart.js で PV 推移を可視化、フィルタ可能なテーブルを含めてください。

/analytics seo-check <slug>
のような既存サブコマンドにもこのパターンを差し込めます。記事ごとの PV・直帰率・流入クエリを 1 画面でフィルタできる HTML を出せば、リライト判断がだいぶ楽になります。

統合ポイント 3: Claude Code hook で自動 HTML 化

Claude Code の hook 機能を使うと、

/review
の集約レポートが Markdown で生成された瞬間に hook がトリガし、バックグラウンドで HTML 版を生成・アップロードできます。詳細は公式の Claude Code Hooks reference を参照してください。

設定例(

.claude/settings.json
の hooks セクション)はおおよそ次のような形になります。
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs scripts/maybe-html-render.sh"
          }
        ]
      }
    ]
  }
}

PostToolUse
フックは JSON ペイロードを stdin で受け取るため、
jq
tool_input.file_path
を抽出してスクリプトに渡しています。詳しくは Claude Code Hooks reference を参照してください。

maybe-html-render.sh
側で
tmp/reports/**/*.md
だけを対象に Claude Code を
--output-format text
で呼び、HTML 出力を
tmp/reports/**/*.html
に書き出すフローです。本番化する場合は
sandbox
属性を付けた iframe 経由のプレビューサイトを別立てで用意します。

Zenn 記事本文に組み込むときの制約

ここまで述べた HTML 成果物を Zenn の記事本文に直接埋め込むことはできません。Zenn 公式 Markdown ガイドと zenn-editor リポジトリ の挙動から推察すると、Markdown パイプラインは

markdown-it → prism.js → sanitize-html
で構成されており、生 HTML タグは原則ストリップされます(
<br>
のみプラグインで明示許可、生
<details>
<table>
<iframe>
は使用不可)。

Zenn が許す擬似リッチ機能の一覧

  • :::message
    /
    :::message alert
    メッセージボックス
  • :::details タイトル
    アコーディオン
  • @[card](url)
    リンクカード(URL 単独行で展開)
  • Mermaid 図(公式サポート)
  • KaTeX 数式
  • Markdown 画像記法
    ![](images/<slug>/foo.svg)
    (SVG 画像も表示可)

詳細は Zenn Markdown ガイド を参照してください。

そのため Zenn 記事内では、HTML 成果物を次の 4 通りで「見せる」ことになります。

  • コードブロック:
    ```html
    で実コード片を提示する
  • スクリーンショット: 外部 URL で公開した HTML を画像化して掲載する
  • Mermaid 図: ワークフローや構造の概要図を Mermaid で代替する
  • 外部リンクカード: Netlify / Cloudflare R2 にデプロイした成果物を
    @[card]
    で誘導する

この制約は一見ネガティブですが、「Zenn 記事は永続層、HTML は即時共有層」という耐久性層別化フレームに合致しています。Zenn が許す Markdown 表現の範囲で記事 = 原本を維持し、AI 生成 HTML は動的成果物として別ホストに置く——これが現実的な落としどころです。

まとめ: AI HTML 出力をいつ使い、いつ Markdown に戻すか

本記事では、AI に HTML を直接生成させることの「不当な有効性」を、Thariq Shihipar・Karpathy・Simon Willison らの一次資料・二次資料・コミュニティ事例を突き合わせて整理しました。

  • 狭いキャンバス問題: Markdown はテキスト密度に対して表現力が足りない
  • 役割分担: 入力・原本は Markdown、出力・共有は HTML
  • ネイティブ生成が核心: 変換ではなく、最初から HTML として思考させる
  • 4 つのユースケース: 仕様書 / シミュレータ / SVG 図解 / ミニダッシュボード
  • デメリット: 編集摩擦・トークンコスト・diff・セキュリティを意識する
  • Zenn ワークフロー統合: 既存スラッシュコマンドの最終出力レイヤだけ HTML 化する

冒頭の問いに戻ります。AI が吐き出した 200 行の Markdown レポートは、誰にも読まれずに

tmp/
で朽ちていきます。一方、同じ思考プロセスをタブ式の比較ボード・SVG 図解・パラメータをいじれるシミュレータとして HTML に落とした瞬間、レポートは「読まれる成果物」に変わります。100 行を超えた Markdown を最後まで読み切れないのは、あなたが怠惰だからではなく、フォーマットが情報の帯域に対して狭すぎるだけです。

Zenn 記事という「永続層」は Markdown のままで構いません。揺らがない原本は Markdown で書き、揺れて構わないアウトプットは AI に HTML を書かせて Netlify や Cloudflare R2 に置く——この役割分担に切り替えてから、筆者の運用では「tmp/ に積まれて読まれない問題」がかなり緩和できました。少なくとも試す価値はあるはずです。

最後までお読みいただきありがとうございます。本記事が、あなたの編集チームの「読まれないレポート問題」を少しでも軽くする一助になれば幸いです。

主要参考資料