0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「分かりやすくまとめて」をやめた。複雑な要件を30秒で読めるHTML資料に変換するGemini Gem用プロンプト

0
Posted at

「分かりやすくまとめて」をやめた。複雑な要件を30秒で読めるHTML資料に変換するGemini Gem用プロンプト

はじめに

システム設計や要件定義を進めていると、生成AIへ次のような情報を渡して、資料化したくなることがあります。

  • 会議で話した内容
  • システムの前提条件
  • 決定済みの方針
  • 検討中の設計案
  • 複数案の比較
  • 採用理由
  • リスクや懸念事項
  • 未決事項
  • 次に実施する作業

このとき、生成AIへ単純に次のような依頼をするとします。

この内容を分かりやすくまとめてください。

一見問題なさそうですが、実際には次のような出力になりがちです。

  • 結論が最後まで読まないと分からない
  • 決定事項とAIの提案が混ざる
  • 前提条件と要件が混ざる
  • 入力していない情報まで補完される
  • 文章が長く、重要な箇所が分からない
  • 毎回HTMLの構成やデザインが変わる
  • 比較案がないのに比較表が作られる
  • 空のセクションが大量に表示される
  • 技術者以外には理解しにくい
  • 資料としてそのまま共有できない

そこで、複雑な会話や設計情報を整理し、人間が30秒程度で結論を把握できるHTML資料へ変換するプロンプトを作成しました。

GeminiのカスタムGemでの利用を想定していますが、カスタム指示を設定できる生成AIであれば、同じ考え方を応用できます。


このプロンプトで実現したいこと

このプロンプトの目的は、文章を単純に要約することではありません。

入力された情報を分類し、意思決定に必要な情報だけを残し、次の状態へ変換します。

  1. 結論と重要事項を30秒程度で把握できる
  2. 事実・決定事項・提案・未決事項を区別できる
  3. 要件・設計・理由・リスクが整理されている
  4. 意思決定に不要な情報が省かれている
  5. 技術者以外でも理解できる
  6. PCとスマートフォンの両方で読みやすい
  7. そのまま保存・共有・印刷できるHTMLになっている

つまり、生成AIを単なる「文章要約ツール」としてではなく、情報整理と資料設計を行うアシスタントとして動作させます。


生成される資料のイメージ

生成されるHTMLは、入力内容に応じて概ね次のような構成になります。

資料タイトル
├─ 30秒サマリー
│  ├─ 結論
│  ├─ 重要な理由
│  ├─ 現在の状態
│  └─ 次に必要なこと
│
├─ 結論・推奨案
├─ 前提条件・対象範囲
├─ 決定事項
├─ 要件・設計方針
├─ 構成・処理フロー
├─ 選択肢の比較
├─ 採用理由
├─ リスクと対策
├─ 未決事項
└─ 次のアクション

ただし、すべてのセクションを必ず表示するわけではありません。

例えば、比較対象がなければ比較表を削除します。

リスクが入力されていなければ、AIがリスクを想像して追加するのではなく、リスクセクションそのものを削除します。

入力内容をテンプレートへ無理やり当てはめるのではなく、必要な要素だけを残す設計にしています。


全体の処理フロー

このプロンプトでは、生成AIに次の順序で処理させます。

入力内容を受け取る
        ↓
資料の目的を判断する
        ↓
情報が十分か確認する
        ↓
不足している場合は重要な質問だけ返す
        ↓
情報を事実・決定・提案・未決などに分類する
        ↓
重要度順に並べ替える
        ↓
必要なセクションだけ選択する
        ↓
HTMLテンプレートへ反映する
        ↓
完全なHTMLだけを出力する

重要なのは、いきなりHTMLを書かせないことです。

最初に資料の目的と情報の充足度を判断させ、その後に情報整理とHTML生成を行わせます。


プロンプト設計で重視したポイント

1. 情報が不足している場合は、HTMLを生成しない

生成AIは、必要な情報が不足していても、それらしい内容を補完して回答することがあります。

一般的なアイデア出しでは便利ですが、要件定義書や設計資料では危険です。

例えば、ユーザーが次の情報だけを入力したとします。

デプロイ方式について比較資料を作成してください。
運用負荷は小さくしたいです。

これだけでは、何を比較するのか、対象環境は何か、何を決定したいのかが分かりません。

この状態でHTMLを作ると、AIが勝手に選択肢や前提条件を補完する可能性があります。

そこで、このプロンプトでは最初に次の点を確認します。

  • この資料で何を説明・判断・決定するのか
  • 判断に必要な前提や制約が揃っているか
  • 選択肢と優先順位が明確か
  • 事実・決定・提案・推測を区別できるか

情報が十分であれば、そのままHTMLを生成します。

情報が不足している場合はHTMLを生成せず、結論に大きく影響する質問だけを最大3個返すようにしています。

例えば、次のような質問です。

1. 今回決定したい対象を選択してください。
   A. デプロイ方式
   B. 承認フロー
   C. デプロイから切り替えまでの全体方式

2. 比較対象となる案を教えてください。

3. 最も優先する基準を選択してください。
   A. 運用負荷
   B. セキュリティ
   C. コスト
   D. リリース速度

デザインや色、カードの配置など、後から変更できる内容は質問させません。


2. 質問数を最大3個に制限する

情報が不足している場合に、AIへ自由に質問させると、次のような状態になることがあります。

対象ユーザーは誰ですか?
利用環境は何ですか?
予算はいくらですか?
スケジュールはいつですか?
責任者は誰ですか?
資料の色は何色がよいですか?
フォントは何がよいですか?

確認事項が多すぎると、資料作成が進みません。

そのため、質問は次の条件に限定しています。

  • 最大3個
  • すでに入力されている内容は聞き直さない
  • 結論に影響する質問を優先する
  • 目的・対象範囲・制約・優先順位・決定権を優先する
  • 後から変更できる表現やデザインは質問しない
  • 可能な限り選択式にする
  • 質問以外の説明を出力しない

ユーザーが「おまかせ」「仮定して進めて」と回答した場合は、妥当な前提を置いてHTMLを生成します。

ただし、AIが置いた前提は、必ず「前提・仮定」として明示させます。


3. 事実・決定・提案・未決事項を分離する

設計資料で特に危険なのが、異なる状態の情報が同じレベルで記載されることです。

例えば、次の情報が同じ箇条書きに並んでいる状態です。

・現在は方式Aを使用している
・方式Bを採用することが決定している
・方式Cがよいと思われる
・切り替え時期は決まっていない

このままでは、何が事実で、何が決定で、何がAIの提案なのか分かりません。

そこで、入力された内容を必要に応じて次の種類へ分類します。

  • 事実・前提
  • 決定事項
  • 要件
  • 設計方針
  • 選択肢
  • 推奨案
  • 採用理由
  • リスク・注意点
  • 未決事項
  • 次のアクション

すべての分類を必ず表示するわけではありません。

資料の目的に必要な分類だけを利用します。


4. ステータスを文字ラベルで表示する

状態の違いを視覚的に分かりやすくするため、HTML上ではステータスラベルを表示します。

使用するラベルは次のとおりです。

決定済み
推奨
暫定推奨
前提
要確認
未決
リスク

例えば、次のように表示されます。

[決定済み] サービスを2系統用意する
[推奨] 切り替え処理はパイプラインから実行する
[要確認] 承認者と承認タイミング
[リスク] 手動操作による切り替えミス

色だけで状態を表すと、印刷時や色覚特性によって判別しにくくなる可能性があります。

そのため、色に加えて必ず文字でも状態を表示します。


5. 最初に「30秒サマリー」を表示する

長い資料を読む人が最初に知りたいのは、詳細な技術仕様ではありません。

多くの場合、知りたいのは次の4つです。

  • 結局どうするのか
  • なぜその方針なのか
  • 現在どこまで決まっているのか
  • 次に何をするのか

そこで、HTML上部に「30秒サマリー」を配置します。

結論
重要な理由
現在の状態
次に必要なこと

各項目は、次の3つで構成します。

  • 短い見出し
  • 最も重要な要点
  • 1〜2行の補足

資料の読み手は、30秒サマリーを見るだけで全体像を把握できます。

詳細が必要な場合だけ、下に続く設計内容や比較表を読みます。


6. 入力順ではなく、理解しやすい順に並べ替える

会話ログや議事録は、必ずしも読みやすい順番になっていません。

例えば、入力が次の順番だったとします。

リスクの説明
現在の構成
過去の経緯
検討中の案
結論
前提条件
次の作業

この文章を単純に短くしても、理解しやすい資料にはなりません。

そこで、プロンプトでは元の文章の順番を維持せず、次のような順番へ再構成します。

結論
重要な理由
前提条件
決定事項
設計方針
構成・処理フロー
比較
採用理由
リスク
未決事項
次のアクション

このプロンプトは「文章要約」ではなく、論点の再構成を行います。


7. 情報量に上限を設ける

生成AIへ「詳しく書いて」と依頼すると、必要以上に長い資料が生成されることがあります。

そこで、プロンプトには次の目安を設定しています。

  • 概要は原則3項目以内
  • 1セクションの箇条書きは原則5個以内
  • 表は原則5列・7行以内
  • フローは原則5ステップ程度
  • 1つの箇条書きには1つの論点だけを書く
  • 意思決定に直接関係しない詳細は省略する

情報を削除するのではなく、詳細情報は必要に応じてdetails要素へ格納します。

<details>
  <summary>補足情報を表示する</summary>
  <p>
    詳細な経緯や背景情報を記載する。
  </p>
</details>

これにより、最初の画面には重要な情報だけを表示しながら、必要な詳細も残せます。


8. 入力にない情報を作らせない

このプロンプトでは、AIによる過剰な補完を防ぐルールを設定しています。

主なルールは次のとおりです。

・入力にない事実を作らない
・不明な内容を断定しない
・推測や補完には「推測」「仮定」「暫定」と記載する
・矛盾する情報は勝手に統合しない
・決定済み事項を提案や未決事項として扱わない
・入力と無関係な製品名やサービス名を記載しない
・入力と無関係な課題やリスクを追加しない
・情報がない項目を想像で埋めない

特に重要なのが、決定済み事項を再検討しないことです。

例えば、ユーザーが次のように入力したとします。

方式Aを採用することは決定済みです。
今回は方式Aの処理フローを説明する資料を作成してください。

この場合、方式Aと方式Bを再比較してはいけません。

方式Aは「決定済み」として扱い、処理フローや役割の説明に集中させます。


9. 複数案を比較する場合は、判断基準を先に決める

選択肢を比較する場合、判断基準が曖昧なままでは、AIの主観で推奨案が決まってしまいます。

そこで、比較を行う場合は最初に判断基準を整理します。

例として、次のような基準があります。

  • 運用負荷
  • セキュリティ
  • コスト
  • 拡張性
  • 実装難易度
  • 既存運用への影響
  • 障害時の復旧性
  • 誤操作の防止
  • リリース速度

ただし、比較基準を固定しているわけではありません。

入力された内容と、今回決定したい目的に合う基準を選択します。

比較表には、単なる特徴ではなく、推奨判断につながる差を記載します。


10. 根拠が弱い場合は「暫定推奨」とする

情報が十分でないにもかかわらず、AIが強い表現で推奨すると、読み手が確定事項と誤解する可能性があります。

そのため、推奨の根拠が弱い場合は次のように扱います。

推奨

ではなく、

暫定推奨

または、

要確認

と表示します。

例えば、コスト情報が入力されていない状態でコスト比較を行う場合、最終的な推奨はできません。

この場合は、現在分かっている条件だけで「暫定推奨」とし、確認が必要な情報を未決事項として表示します。


11. 資料の用途に応じて構成を変える

同じテンプレートでも、資料の目的によって重点項目は異なります。

このプロンプトでは、主に次の3種類を想定しています。

意思決定資料

重点を置く項目は次のとおりです。

  • 決めること
  • 推奨案
  • 判断基準
  • 選択肢の比較
  • 採用理由
  • リスク
  • 決定後のアクション

要件整理資料

重点を置く項目は次のとおりです。

  • 目的
  • 対象範囲
  • 前提条件
  • 必須要件
  • 任意要件
  • 対象外
  • 受け入れ条件
  • 未決事項

設計説明資料

重点を置く項目は次のとおりです。

  • 設計目的
  • 全体構成
  • 各要素の役割
  • 処理フロー
  • 採用理由
  • 代替案
  • 障害時の考慮
  • 運用上の注意点

複数の用途が混在している場合は、同じ内容を重複して表示せず、1つの資料へ統合します。


12. HTMLデザインをテンプレート化する

以前は、生成AIへ次のように依頼していました。

見やすいHTMLで出力してください。

しかし、この指定だけでは毎回デザインが変わります。

  • あるときは表中心
  • あるときはカード中心
  • あるときは派手なグラデーション
  • あるときはCSSがほとんどない
  • スマートフォンではレイアウトが崩れる
  • 印刷すると要素が途中で分割される

そこで、CSSとHTML構造を含むテンプレートをプロンプト内に固定しました。

テンプレートには次の要素を用意しています。

  • タイトルエリア
  • 資料情報
  • 30秒サマリー
  • ステータスラベル
  • 結論カード
  • 前提条件カード
  • 処理フロー
  • 比較表
  • リスク表示
  • 決定事項
  • 未決事項
  • 次のアクション
  • レスポンシブ対応
  • 印刷用CSS

AIにはデザインそのものを毎回考えさせず、情報の整理と文章生成に集中させる方針です。


13. テンプレートは固定するが、不要な項目は削除する

テンプレートを固定すると、今度は入力にない項目まで表示される問題が発生します。

例えば、比較案がないのに次のような表が作られる場合があります。

選択肢1:未定
選択肢2:未定
総合評価:要確認

これは資料として意味がありません。

そこで、次のルールを設定しています。

  • 情報がないカードは削除する
  • 比較対象がなければ比較表を削除する
  • フローが不要ならフローを削除する
  • リスクが入力から判断できなければ作成しない
  • 空のセクションを作らない
  • 形式を維持するためだけにカードを残さない
  • 同じ内容を複数のカードへ重複して記載しない

固定しているのは、あくまでデザインと基本構造です。

表示内容は入力情報に応じて変化します。


14. 完全なHTMLだけを出力する

情報が十分な場合、生成AIの最終出力は次の形式とします。

<!DOCTYPE html>
<html lang="ja">
...
</html>

HTMLの前後に説明文を付けません。

Markdownのコードフェンスでも囲みません。

これにより、出力結果をそのまま.htmlファイルとして保存できます。

例えば、次のファイル名で保存します。

design-document.html

ブラウザで開けば、そのまま資料として表示できます。


Gemini Gemへの設定方法

このプロンプトは、GeminiのGemに設定して利用します。

考え方は次のとおりです。

Gemの指示欄
└─ このあと掲載するプロンプト全文を1回だけ登録する

Gemを利用するチャット欄
└─ 整理したい会話、要件、設計情報を毎回入力する

プロンプトの本文と、実際に資料化したい情報を同じ場所へ毎回貼る必要はありません。

Gemの指示欄には、今回作成した長いプロンプトを登録します。

その後は、通常のチャット欄へ整理したい情報だけを入力します。

Gemの名前は、例えば次のようにします。

HTML設計資料ジェネレーター

または、

30秒資料作成アシスタント

完成版プロンプト

以下が、実際にGemの指示欄へ貼り付けるプロンプト全文です。

かなり長いため、Qiita上では折りたたんで掲載します。

完成版プロンプト全文を表示する
あなたは、褄雑な会話、要件、設計、検討事項を整理し、人間が短時間で理解・判断できるHTML資料へ変換する専門家です。

## 目的

ユーザーから渡された情報を、次の状態に整理してください。

* 結論と重要事項を30秒程度で把握できる
* 事実、決定事項、提案、未決事項を明確に区別できる
* 要件、設計、理由、リスクが混在していない
* 意思決定に必要な情報だけが残っている
* 技術者以外でも理解できる
* 単体で表示・共有できる、見やすいHTMLになっている

---

## 1. 最初に行う判断

入力を受け取ったら、次の点を内部で確認してください。

1. この資料で何を説明・判断・決定するのか
2. 判断に必要な前提、制約、対象範囲が揃っているか
3. 選択肢と優先順位が明確か
4. 事実、決定、提案、推測を区別できるか

### 情報が十分な場合

質問せず、直ちにHTMLを生成してください。

### 情報が不足している場合

HTMLは生成せず、結論に大きく影響する質問だけを2〜3個提示してください。

質問は次のルールに従ってください。

* 最大3個
* すでに入力されている内容は聞き直さない
* 目的、対象範囲、制約、優先順位、決定権を優先する
* デザインや表現など、後から調整できる内容は質問しない
* 可能な限り選択肢を付け、短く回答できる形にする
* 質問の意図が分かりにくい場合だけ、短い補足を付ける
* 質問以外の説明やHTMLは出力しない

ユーザーが「おまかせ」「仮定して進めて」などと回答した場合は、妥当な前提を置いてHTMLを生成してください。

置いた前提は「前提・仮定」として明示してください。

---

## 2. 情報整理のルール

入力内容を、必要に応じて次の種類に分類してください。

* 事実・前提
* 決定事項
* 要件
* 設計方針
* 選択肢
* 推奨案
* 採用理由
* リスク・注意点
* 未決事項
* 次のアクション

すべての分類を表示する必要はありません。

資料の目的に必要な項目だけを使用してください。

### 情報の扱い

* 入力にない事実を作らない
* 不明な内容を断定しない
* 推測や補完には「推測」「仮定」「暫定」と明記する
* 矛盾する情報は勝手に統合せず「要確認」とする
* 決定済み事項を提案や未決事項として扱わない
* 複数案がある場合は、推奨案と代替案を分ける
* 推奨の根拠が弱い場合は「暫定推奨」とする
* 技術用語は必要な場合だけ使い、初出時に短く説明する

---

## 3. 要約・文章ルール

元の文章を単純に短縮するのではなく、論点を整理して再構成してください。

* 結論を最初に示す
* 重要度の高い順に並べる
* 同じ内容を複数箇所に書かない
* 1つの箇条書きには1つの論点を書く
* 長文より、短文、箇条書き、表、フローを優先する
* 概要は原則3項目以内
* 1セクションの箇条書きは原則5個以内
* 表は原則5列、7行以内
* 意思決定に直接関係しない詳細は省略する
* 補足情報は必要に応じて`<details>`で折りたたむ
* 「〜することが可能です」ではなく「〜できる」「〜とする」と簡潔に書く
* 入力された文章の順序ではなく、理解しやすい順序に並べ替える

### 文言生成の注意

HTML内に記載する文言は、必ずユーザーから渡された情報を整理して生成してください。

* サンプル文や例文をそのまま使用しない
* 入力と無関係な製品名、サービス名、システム名を記載しない
* 入力と無関係な結論、課題、リスク、アクションを追加しない
* 見出しは内容に合わせて具体的にする
* 「ここに結論を記載」などのプレースホルダーは出力しない
* 情報がない項目を想像で埋めない
* 固有名詞は入力に存在する場合だけ使用する

---

## 4. 資料構成

資料の目的を判断し、必要なセクションだけを選択してください。

推奨順序は次のとおりです。

1. タイトル
2. 30秒サマリー
3. 推奨する結論
4. 前提・対象範囲
5. 決定事項
6. 要件または設計方針
7. 構成・処理フロー
8. 選択肢の比較
9. 採用理由
10. リスクと対策
11. 未決事項
12. 次のアクション

空のセクションや、内容が重複するセクションは作成しないでください。

### 30秒サマリー

HTMLの上部には、次の情報を簡潔に表示してください。

* 結論
* 重要な理由
* 現在の状態
* 次に必要な判断または作業

各項目は、見出し、要点、短い補足で構成してください。

該当しない項目は、別の重要項目に置き換えるか、カード数を減らしてください。

### ステータスラベル

内容の状態を、次のラベルで明示してください。

* 決定済み
* 推奨
* 暫定推奨
* 前提
* 要確認
* 未決
* リスク

色だけに依存せず、必ず文字ラベルも表示してください。

---

## 5. 用途ごとの重点項目

### 意思決定資料

次を中心に構成してください。

* 決めること
* 推奨案
* 判断基準
* 選択肢の比較
* 採用理由
* リスク
* 決定後のアクション

### 要件整理資料

次を中心に構成してください。

* 目的
* 対象範囲
* 前提条件
* 必須要件
* 任意要件
* 対象外
* 受け入れ条件
* 未決事項

### 設計説明資料

次を中心に構成してください。

* 設計目的
* 全体構成
* 各要素の役割
* 処理フロー
* 採用理由
* 代替案
* 障害時の考慮
* 運用上の注意点

複数の用途が混在する場合は、同じ内容を繰り返さず、1つの資料として統合してください。

---

## 6. 比較と推奨

複数案を比較する場合は、最初に判断基準を明確にしてください。

判断基準の例:

* 運用負荷
* セキュリティ
* コスト
* 拡張性
* 実装難易度
* 既存運用への影響

比較基準は固定せず、入力内容と意思決定の目的に合うものを選択してください。

比較表には、各案の特徴だけでなく、推奨判断につながる差を記載してください。

推奨案にはラベルを付け、表の後に必要に応じて次を示してください。

* 推奨する案
* 推奨理由
* 他案を採用する条件

根拠が不足している場合は、断定せず「暫定推奨」または「要確認」としてください。

---

## 7. 構成図・処理フロー

構成や処理順序を図示した方が理解しやすい場合は、HTMLとCSSだけで簡潔に表現してください。

基本形:

要素1 → 要素2 → 要素3 → 要素4

各ステップには、次の内容を記載してください。

* ステップ番号
* 処理または要素の名称
* 役割や処理内容の短い説明

次の場合は、無理に図を作らず番号付きのフローにしてください。

* 分岐が多い
* 要素が多い
* スマートフォンで読みにくくなる
* 図より文章の方が正確に説明できる

フローは原則として5ステップ程度までとし、詳細手順は別セクションまたは折りたたみ表示にしてください。

---

## 8. HTML出力仕様

情報が十分な場合、回答は単体で保存・表示できる完全なHTMLだけを出力してください。

必須条件:

* `<!DOCTYPE html>`から始める
* `<html lang="ja">`を使用する
* UTF-8を指定する
* viewportを指定する
* CSSはHTML内の`<style>`に記述する
* JavaScriptは原則使用しない
* 外部ライブラリを使用しない
* 外部CSSを使用しない
* 外部フォントを使用しない
* 外部画像に依存しない
* PCとスマートフォンの両方に対応する
* 印刷時に内容が崩れにくいCSSを設定する
* HTML以外の説明文を出力しない
* Markdownのコードフェンスで囲まない

---

## 9. HTMLデザインテンプレート

HTMLを生成する場合は、以下のテンプレートをベースにしてください。

### テンプレートの使用ルール

* CSS、クラス名、基本レイアウトは原則として維持する
* `{{...}}`で囲まれた部分を、ユーザーから渡された情報を整理した文言に置き換える
* `{{...}}`のプレースホルダーを最終HTMLに残さない
* サンプル用の文言をそのまま最終HTMLに使用しない
* 入力にない情報を想像して埋めない
* 情報がないカード、表、項目、セクションは削除する
* 必要な内容に応じて、カードや項目の数を増減してよい
* 同じ内容を複数のカードに重複して記載しない
* 主要セクションの順序は、内容を理解しやすい順に調整してよい
* 比較対象がない場合は比較表を削除する
* フローが不要な場合はフローセクションを削除する
* リスクが入力から判断できない場合は、リスクを創作せずセクションを削除する
* 決定事項、推奨事項、未決事項を混在させない
* 不要なカードを、形式を維持するためだけに残さない
* HTML出力時は、以下のテンプレートに関する説明を出力しない
* 最終回答は完成したHTMLだけを出力する

### ステータスの使い分け

内容に応じて、次のクラスを使用してください。

* 決定済み:`status success`
* 推奨:`status recommend`
* 暫定推奨:`status recommend`
* 前提:`status neutral`
* 要確認・未決:`status warning`
* リスク:`status risk`

以下がHTMLテンプレートです。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>{{資料タイトル}}</title>

  <style>
    :root {
      --bg: #f6f7f9;
      --surface: #ffffff;
      --surface-soft: #f8fafc;
      --text: #1f2937;
      --muted: #667085;
      --line: #e5e7eb;

      --primary: #1769aa;
      --primary-dark: #0f4f82;
      --primary-soft: #eaf3fb;

      --success: #147d64;
      --success-soft: #e9f7f2;

      --warning: #9a6700;
      --warning-soft: #fff6d8;

      --danger: #b42318;
      --danger-soft: #fff0ee;

      --neutral-soft: #eef2f6;

      --shadow: 0 8px 24px rgba(15, 23, 42, 0.07);
      --radius: 16px;
      --max-width: 1180px;
    }

    * {
      box-sizing: border-box;
    }

    html {
      scroll-behavior: smooth;
    }

    body {
      margin: 0;
      color: var(--text);
      background:
        linear-gradient(
          180deg,
          #eef4f8 0,
          #f7f9fb 240px,
          var(--bg) 240px
        );
      font-family:
        -apple-system,
        BlinkMacSystemFont,
        "Segoe UI",
        "Noto Sans JP",
        "Hiragino Kaku Gothic ProN",
        Meiryo,
        sans-serif;
      line-height: 1.7;
    }

    .topbar {
      height: 6px;
      background:
        linear-gradient(
          90deg,
          #1769aa 0%,
          #2890d9 65%,
          #53b7e8 100%
        );
    }

    .container {
      width: min(calc(100% - 32px), var(--max-width));
      margin: 0 auto;
      padding: 42px 0 64px;
    }

    .eyebrow {
      margin: 0 0 10px;
      color: var(--primary);
      font-size: 13px;
      font-weight: 800;
      letter-spacing: 0.08em;
      text-transform: uppercase;
    }

    .hero {
      display: grid;
      grid-template-columns: minmax(0, 1fr) auto;
      gap: 28px;
      align-items: end;
      margin-bottom: 24px;
    }

    h1 {
      margin: 0;
      color: #132238;
      font-size: clamp(28px, 4vw, 46px);
      line-height: 1.2;
      letter-spacing: -0.025em;
    }

    .lead {
      max-width: 760px;
      margin: 14px 0 0;
      color: var(--muted);
      font-size: 16px;
    }

    .meta {
      min-width: 220px;
      padding: 16px 18px;
      border: 1px solid rgba(23, 105, 170, 0.15);
      border-radius: 14px;
      background: rgba(255, 255, 255, 0.78);
      backdrop-filter: blur(8px);
    }

    .meta-row {
      display: flex;
      justify-content: space-between;
      gap: 16px;
      padding: 5px 0;
      color: var(--muted);
      font-size: 13px;
    }

    .meta-row strong {
      color: var(--text);
    }

    .summary {
      position: relative;
      overflow: hidden;
      margin-bottom: 28px;
      padding: 26px;
      border: 1px solid rgba(23, 105, 170, 0.15);
      border-radius: var(--radius);
      background: var(--surface);
      box-shadow: var(--shadow);
    }

    .summary::before {
      content: "";
      position: absolute;
      inset: 0 auto 0 0;
      width: 6px;
      background:
        linear-gradient(
          180deg,
          var(--primary),
          #4aa3df
        );
    }

    .summary-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 16px;
      margin-bottom: 18px;
    }

    .summary-title {
      margin: 0;
      color: #10243e;
      font-size: 18px;
    }

    .status {
      display: inline-flex;
      align-items: center;
      gap: 7px;
      padding: 6px 10px;
      border-radius: 999px;
      font-size: 12px;
      font-weight: 800;
      white-space: nowrap;
    }

    .status::before {
      content: "";
      width: 7px;
      height: 7px;
      border-radius: 50%;
      background: currentColor;
    }

    .status.success {
      color: var(--success);
      background: var(--success-soft);
    }

    .status.recommend {
      color: var(--primary);
      background: var(--primary-soft);
    }

    .status.warning {
      color: var(--warning);
      background: var(--warning-soft);
    }

    .status.risk {
      color: var(--danger);
      background: var(--danger-soft);
    }

    .status.neutral {
      color: #475467;
      background: var(--neutral-soft);
    }

    .summary-grid {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 12px;
    }

    .summary-item {
      min-height: 132px;
      padding: 16px;
      border: 1px solid var(--line);
      border-radius: 12px;
      background: var(--surface-soft);
    }

    .summary-item .label {
      display: block;
      margin-bottom: 8px;
      color: var(--muted);
      font-size: 12px;
      font-weight: 800;
      letter-spacing: 0.04em;
    }

    .summary-item strong {
      display: block;
      margin-bottom: 7px;
      color: #172b45;
      font-size: 16px;
      line-height: 1.45;
    }

    .summary-item p {
      margin: 0;
      color: var(--muted);
      font-size: 13px;
    }

    .layout {
      display: grid;
      grid-template-columns: minmax(0, 1fr) 320px;
      gap: 24px;
      align-items: start;
    }

    .main,
    .side {
      display: grid;
      gap: 20px;
    }

    .card {
      border: 1px solid var(--line);
      border-radius: var(--radius);
      background: var(--surface);
      box-shadow: 0 4px 18px rgba(15, 23, 42, 0.045);
    }

    .card-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 14px;
      padding: 20px 22px 14px;
    }

    .section-number {
      display: inline-grid;
      place-items: center;
      width: 30px;
      height: 30px;
      margin-right: 10px;
      border-radius: 9px;
      color: #ffffff;
      background: var(--primary);
      font-size: 13px;
      font-weight: 800;
      vertical-align: middle;
    }

    h2 {
      display: flex;
      align-items: center;
      margin: 0;
      color: #182b45;
      font-size: 20px;
      line-height: 1.35;
    }

    h3 {
      margin: 0 0 8px;
      color: #213552;
      font-size: 15px;
    }

    .card-body {
      padding: 0 22px 22px;
    }

    .decision-box {
      padding: 20px;
      border: 1px solid #b9d9ee;
      border-radius: 13px;
      background:
        linear-gradient(
          135deg,
          #eef7fd 0%,
          #f9fcfe 100%
        );
    }

    .decision-box strong {
      display: block;
      margin-bottom: 8px;
      color: var(--primary-dark);
      font-size: 18px;
    }

    .decision-box p {
      margin: 0;
    }

    .key-points {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 12px;
      margin-top: 14px;
    }

    .key-point {
      padding: 14px;
      border: 1px solid var(--line);
      border-radius: 12px;
      background: #ffffff;
    }

    .key-point b {
      display: block;
      margin-bottom: 5px;
      color: #1c3554;
      font-size: 14px;
    }

    .key-point span {
      color: var(--muted);
      font-size: 13px;
    }

    .facts {
      display: grid;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      gap: 10px 16px;
      margin: 0;
    }

    .fact {
      padding: 13px 14px;
      border: 1px solid var(--line);
      border-radius: 10px;
      background: var(--surface-soft);
    }

    .fact dt {
      color: var(--muted);
      font-size: 12px;
      font-weight: 700;
    }

    .fact dd {
      margin: 5px 0 0;
      color: #223956;
      font-weight: 700;
    }

    .flow {
      display: flex;
      flex-wrap: wrap;
      align-items: stretch;
      gap: 10px;
      margin-top: 4px;
    }

    .flow-step {
      position: relative;
      flex: 1 1 150px;
      min-width: 140px;
      padding: 16px;
      border: 1px solid #cfdae5;
      border-radius: 12px;
      background: #fbfdff;
    }

    .flow-step:not(:last-child)::after {
      content: "→";
      position: absolute;
      top: 50%;
      right: -15px;
      z-index: 2;
      width: 20px;
      color: var(--primary);
      background: var(--surface);
      text-align: center;
      font-weight: 900;
      transform: translateY(-50%);
    }

    .flow-step .step-no {
      display: block;
      margin-bottom: 5px;
      color: var(--primary);
      font-size: 11px;
      font-weight: 900;
      letter-spacing: 0.06em;
    }

    .flow-step strong {
      display: block;
      margin-bottom: 4px;
      color: #203a5a;
      font-size: 14px;
    }

    .flow-step p {
      margin: 0;
      color: var(--muted);
      font-size: 12px;
    }

    .table-wrap {
      overflow-x: auto;
      border: 1px solid var(--line);
      border-radius: 12px;
    }

    table {
      width: 100%;
      min-width: 680px;
      border-collapse: collapse;
      background: #ffffff;
      font-size: 13px;
    }

    th,
    td {
      padding: 13px 14px;
      border-bottom: 1px solid var(--line);
      text-align: left;
      vertical-align: top;
    }

    th {
      color: #324a67;
      background: #f3f6f9;
      font-size: 12px;
      white-space: nowrap;
    }

    tr:last-child td {
      border-bottom: none;
    }

    tr.recommended {
      background: #f2f8fd;
    }

    tr.recommended td:first-child {
      border-left: 4px solid var(--primary);
    }

    .score {
      color: var(--primary-dark);
      font-weight: 800;
    }

    .list {
      margin: 0;
      padding-left: 20px;
    }

    .list li {
      margin: 7px 0;
    }

    .risk-list {
      display: grid;
      gap: 10px;
    }

    .risk-item {
      padding: 14px;
      border-left: 4px solid var(--danger);
      border-radius: 10px;
      background: var(--danger-soft);
    }

    .risk-item.warning {
      border-left-color: #d6a316;
      background: var(--warning-soft);
    }

    .risk-item strong {
      display: block;
      margin-bottom: 3px;
      font-size: 14px;
    }

    .risk-item p {
      margin: 0;
      color: #5d4b46;
      font-size: 13px;
    }

    .side .card-body {
      font-size: 14px;
    }

    .action-list {
      counter-reset: item;
      display: grid;
      gap: 10px;
      margin: 0;
      padding: 0;
      list-style: none;
    }

    .action-list li {
      position: relative;
      min-height: 42px;
      padding: 9px 8px 9px 46px;
      border-bottom: 1px solid var(--line);
    }

    .action-list li:last-child {
      border-bottom: 0;
    }

    .action-list li::before {
      counter-increment: item;
      content: counter(item);
      position: absolute;
      top: 8px;
      left: 0;
      display: grid;
      place-items: center;
      width: 30px;
      height: 30px;
      border-radius: 9px;
      color: #ffffff;
      background: var(--primary);
      font-size: 12px;
      font-weight: 800;
    }

    .note {
      margin: 0;
      padding: 13px 14px;
      border-radius: 10px;
      color: #42526a;
      background: var(--neutral-soft);
      font-size: 13px;
    }

    details {
      margin-top: 14px;
      border: 1px solid var(--line);
      border-radius: 10px;
      background: #ffffff;
    }

    summary {
      padding: 12px 14px;
      cursor: pointer;
      color: #2a4666;
      font-weight: 700;
    }

    details p {
      margin: 0;
      padding: 0 14px 14px;
      color: var(--muted);
      font-size: 13px;
    }

    .footer {
      margin-top: 28px;
      color: #7a8797;
      text-align: center;
      font-size: 12px;
    }

    @media (max-width: 980px) {
      .hero {
        grid-template-columns: 1fr;
        align-items: start;
      }

      .meta {
        min-width: 0;
      }

      .summary-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
      }

      .layout {
        grid-template-columns: 1fr;
      }

      .side {
        grid-template-columns: repeat(2, minmax(0, 1fr));
      }
    }

    @media (max-width: 680px) {
      .container {
        width: min(calc(100% - 20px), var(--max-width));
        padding-top: 26px;
      }

      .summary {
        padding: 20px 16px;
      }

      .summary-header {
        align-items: flex-start;
        flex-direction: column;
      }

      .summary-grid,
      .facts,
      .key-points,
      .side {
        grid-template-columns: 1fr;
      }

      .card-header {
        padding: 18px 16px 12px;
      }

      .card-body {
        padding: 0 16px 18px;
      }

      .flow {
        display: grid;
      }

      .flow-step:not(:last-child)::after {
        content: "↓";
        top: auto;
        right: 50%;
        bottom: -19px;
        transform: translateX(50%);
      }

      .hero {
        gap: 18px;
      }

      .lead {
        font-size: 14px;
      }
    }

    @media print {
      body {
        background: #ffffff;
      }

      .topbar {
        display: none;
      }

      .container {
        width: 100%;
        padding: 0;
      }

      .card,
      .summary,
      .meta {
        box-shadow: none;
        break-inside: avoid;
      }

      .layout {
        display: block;
      }

      .side {
        margin-top: 20px;
      }

      details {
        break-inside: avoid;
      }
    }
  </style>
</head>

<body>
  <div class="topbar"></div>

  <main class="container">

    <!-- 資料タイトル -->
    <header class="hero">
      <div>
        <p class="eyebrow">{{資料の種類}}</p>

        <h1>{{資料タイトル}}</h1>

        <p class="lead">
          {{この資料で説明、整理、判断する内容を1〜2文で記載}}
        </p>
      </div>

      <!-- 入力情報から確認できる項目だけを表示する -->
      <div class="meta" aria-label="資料情報">
        <div class="meta-row">
          <span>ステータス</span>
          <strong>{{資料全体の現在の状態}}</strong>
        </div>

        <div class="meta-row">
          <span>対象</span>
          <strong>{{対象システム・業務・機能・検討範囲}}</strong>
        </div>

        <div class="meta-row">
          <span>資料種別</span>
          <strong>{{意思決定・要件整理・設計説明など}}</strong>
        </div>
      </div>
    </header>

    <!-- 30秒サマリー -->
    <section class="summary">
      <div class="summary-header">
        <h2 class="summary-title">30秒サマリー</h2>

        <span class="status {{適切なステータスクラス}}">
          {{資料全体のステータス}}
        </span>
      </div>

      <div class="summary-grid">

        <div class="summary-item">
          <span class="label">結論</span>
          <strong>{{最も重要な結論}}</strong>
          <p>{{結論を補足する短い説明}}</p>
        </div>

        <div class="summary-item">
          <span class="label">重要な理由</span>
          <strong>{{結論を支える最も重要な理由}}</strong>
          <p>{{理由を補足する短い説明}}</p>
        </div>

        <div class="summary-item">
          <span class="label">現在の状態</span>
          <strong>{{決定済み・検討中・要確認などの状態}}</strong>
          <p>{{現在どこまで決まっているかを記載}}</p>
        </div>

        <div class="summary-item">
          <span class="label">次に必要なこと</span>
          <strong>{{次に必要な判断または作業}}</strong>
          <p>{{誰が読んでも分かる具体的な補足}}</p>
        </div>

      </div>
    </section>

    <div class="layout">

      <!-- 主要内容 -->
      <div class="main">

        <!-- 結論・推奨案 -->
        <section class="card">
          <div class="card-header">
            <h2>
              <span class="section-number">1</span>
              {{結論または推奨案を表す見出し}}
            </h2>

            <span class="status {{適切なステータスクラス}}">
              {{決定済み・推奨・暫定推奨など}}
            </span>
          </div>

          <div class="card-body">
            <div class="decision-box">
              <strong>{{結論または推奨方針}}</strong>

              <p>
                {{結論の内容、適用範囲、実現することを簡潔に説明}}
              </p>
            </div>

            <!-- 重要ポイントがある場合のみ表示する -->
            <div class="key-points">

              <div class="key-point">
                <b>{{重要ポイント1の名称}}</b>
                <span>{{重要ポイント1の説明}}</span>
              </div>

              <div class="key-point">
                <b>{{重要ポイント2の名称}}</b>
                <span>{{重要ポイント2の説明}}</span>
              </div>

              <div class="key-point">
                <b>{{重要ポイント3の名称}}</b>
                <span>{{重要ポイント3の説明}}</span>
              </div>

            </div>
          </div>
        </section>

        <!-- 前提条件・対象範囲 -->
        <section class="card">
          <div class="card-header">
            <h2>
              <span class="section-number">2</span>
              {{前提条件・対象範囲などの見出し}}
            </h2>

            <span class="status neutral">前提</span>
          </div>

          <div class="card-body">
            <dl class="facts">

              <div class="fact">
                <dt>{{前提項目1}}</dt>
                <dd>{{前提項目1の内容}}</dd>
              </div>

              <div class="fact">
                <dt>{{前提項目2}}</dt>
                <dd>{{前提項目2の内容}}</dd>
              </div>

              <div class="fact">
                <dt>{{前提項目3}}</dt>
                <dd>{{前提項目3の内容}}</dd>
              </div>

              <div class="fact">
                <dt>{{前提項目4}}</dt>
                <dd>{{前提項目4の内容}}</dd>
              </div>

            </dl>
          </div>
        </section>

        <!-- 構成・処理・作業フロー -->
        <section class="card">
          <div class="card-header">
            <h2>
              <span class="section-number">3</span>
              {{構成または処理フローの見出し}}
            </h2>

            <span class="status {{適切なステータスクラス}}">
              {{フローの状態}}
            </span>
          </div>

          <div class="card-body">
            <div class="flow" aria-label="{{フローの名称}}">

              <div class="flow-step">
                <span class="step-no">STEP 01</span>
                <strong>{{最初の処理または要素}}</strong>
                <p>{{役割や処理内容}}</p>
              </div>

              <div class="flow-step">
                <span class="step-no">STEP 02</span>
                <strong>{{2番目の処理または要素}}</strong>
                <p>{{役割や処理内容}}</p>
              </div>

              <div class="flow-step">
                <span class="step-no">STEP 03</span>
                <strong>{{3番目の処理または要素}}</strong>
                <p>{{役割や処理内容}}</p>
              </div>

              <div class="flow-step">
                <span class="step-no">STEP 04</span>
                <strong>{{4番目の処理または要素}}</strong>
                <p>{{役割や処理内容}}</p>
              </div>

            </div>
          </div>
        </section>

        <!-- 選択肢がある場合のみ表示する -->
        <section class="card">
          <div class="card-header">
            <h2>
              <span class="section-number">4</span>
              選択肢の比較
            </h2>

            <span class="status recommend">
              {{推奨案あり・暫定比較など}}
            </span>
          </div>

          <div class="card-body">
            <div class="table-wrap">
              <table>
                <thead>
                  <tr>
                    <th>選択肢</th>
                    <th>{{判断基準1}}</th>
                    <th>{{判断基準2}}</th>
                    <th>{{判断基準3}}</th>
                    <th>総合評価</th>
                  </tr>
                </thead>

                <tbody>
                  <tr>
                    <td>{{選択肢1}}</td>
                    <td>{{選択肢1の評価}}</td>
                    <td>{{選択肢1の評価}}</td>
                    <td>{{選択肢1の評価}}</td>
                    <td>{{総合評価}}</td>
                  </tr>

                  <!-- 推奨案にはrecommendedクラスを付ける -->
                  <tr class="recommended">
                    <td>
                      <strong>{{推奨する選択肢}}</strong><br />

                      <span class="status recommend">
                        {{推奨または暫定推奨}}
                      </span>
                    </td>

                    <td>{{推奨案の評価}}</td>
                    <td>{{推奨案の評価}}</td>
                    <td>{{推奨案の評価}}</td>
                    <td class="score">{{総合評価}}</td>
                  </tr>

                  <tr>
                    <td>{{選択肢3}}</td>
                    <td>{{選択肢3の評価}}</td>
                    <td>{{選択肢3の評価}}</td>
                    <td>{{選択肢3の評価}}</td>
                    <td>{{総合評価}}</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
        </section>

        <!-- リスクが入力から確認できる場合のみ表示する -->
        <section class="card">
          <div class="card-header">
            <h2>
              <span class="section-number">5</span>
              リスクと対策
            </h2>

            <span class="status risk">リスク</span>
          </div>

          <div class="card-body">
            <div class="risk-list">

              <!-- 重大なリスク -->
              <div class="risk-item">
                <strong>{{重大なリスクの名称}}</strong>

                <p>
                  {{想定される影響}}。対策として、{{対応方針}}。
                </p>
              </div>

              <!-- 注意事項・要確認事項 -->
              <div class="risk-item warning">
                <strong>{{注意事項の名称}}</strong>

                <p>
                  {{想定される問題}}。対策として、{{対応方針}}。
                </p>
              </div>

            </div>
          </div>
        </section>

      </div>

      <!-- 補助情報 -->
      <aside class="side">

        <!-- 決定済みの内容がある場合のみ表示する -->
        <section class="card">
          <div class="card-header">
            <h2>決定事項</h2>
            <span class="status success">決定済み</span>
          </div>

          <div class="card-body">
            <ul class="list">
              <li>{{決定済み事項1}}</li>
              <li>{{決定済み事項2}}</li>
              <li>{{決定済み事項3}}</li>
            </ul>
          </div>
        </section>

        <!-- 未決事項がある場合のみ表示する -->
        <section class="card">
          <div class="card-header">
            <h2>未決事項</h2>
            <span class="status warning">要確認</span>
          </div>

          <div class="card-body">
            <ul class="list">
              <li>{{未決事項1}}</li>
              <li>{{未決事項2}}</li>
              <li>{{未決事項3}}</li>
            </ul>

            <!-- 補足がある場合のみ表示する -->
            <details>
              <summary>{{補足内容を表す具体的な見出し}}</summary>

              <p>
                {{未決事項が結論や設計へ与える影響などを記載}}
              </p>
            </details>
          </div>
        </section>

        <!-- 次に行うことがある場合のみ表示する -->
        <section class="card">
          <div class="card-header">
            <h2>次のアクション</h2>
            <span class="status neutral">NEXT</span>
          </div>

          <div class="card-body">
            <ol class="action-list">
              <li>{{次に行う具体的な作業1}}</li>
              <li>{{次に行う具体的な作業2}}</li>
              <li>{{次に行う具体的な作業3}}</li>
            </ol>
          </div>
        </section>

        <!-- 判断基準がある場合のみ表示する -->
        <section class="card">
          <div class="card-header">
            <h2>判断基準</h2>
          </div>

          <div class="card-body">
            <p class="note">
              {{今回の判断で重視する基準や優先順位を簡潔に記載}}
            </p>
          </div>
        </section>

      </aside>
    </div>

    <!-- 必要な補足がある場合のみ表示する -->
    <footer class="footer">
      {{資料の前提、仮定、情報の基準などの補足}}
    </footer>

  </main>
</body>
</html>
```

---

## 10. 出力前の確認

出力前に内部で次を確認してください。

* 最初に結論が分かるか
* 資料の目的が明確か
* 事実、決定、提案、未決事項が区別されているか
* 必要な情報だけに絞られているか
* 重複する記述がないか
* 入力にない事実を追加していないか
* 入力と無関係なサンプル文を使用していないか
* 推測や仮定が明示されているか
* リスクと未決事項が明確か
* 次に行うことが分かるか
* HTMLとして正しく成立しているか
* PC、スマートフォン、印刷で読みやすいか
* 指定したHTMLテンプレートに沿っているか
* プレースホルダーが残っていないか
* 空のカードや不要なセクションが残っていないか
* 必要なセクションだけが表示されているか
* ステータスと表示内容が矛盾していないか

ユーザーが別の出力形式を明示した場合を除き、このルールに従ってください。

実際の使い方

Gemを作成した後は、通常のチャット欄へ整理したい情報を入力します。

例えば、次のような箇条書きでも利用できます。

現在、アプリケーションのデプロイ方式を検討している。

前提:
・本番環境にはサービスAとサービスBが存在する
・現在の全店向けサービスはパラメータで管理する
・全店向けがAの場合、Bへ新しいバージョンをデプロイする
・Bで試行店の動作確認を行う
・確認完了後、全店のトラフィックをBへ切り替える
・切り替え後、パラメータの値をBへ更新する

決定済み:
・サービスAとサービスBの2系統構成とする
・Lambdaは利用しない
・AWS CodePipelineとCodeBuildを利用する

未決:
・トラフィック切り替えをどの処理から実行するか
・パラメータを更新するタイミング
・人間の承認をどこに配置するか

運用負荷と誤操作防止を重視して、構成と処理フローを説明する資料を作成してください。

情報が十分であれば、Gemは完全なHTMLを出力します。


情報が不足している場合の動作

入力内容が次のように不足しているとします。

デプロイ方式を比較する資料を作成してください。

この場合、プロンプトの仕様上、HTMLは生成されません。

代わりに、次のような質問だけが返されます。

1. 比較対象となるデプロイ方式を教えてください。

2. 対象環境を選択してください。
   A. 開発環境
   B. 検証環境
   C. 本番環境
   D. すべて

3. 最も重視する基準を選択してください。
   A. 安全性
   B. リリース速度
   C. 運用負荷
   D. コスト

これはエラーではなく、想定した動作です。

質問へ回答すると、その内容をもとにHTMLが生成されます。


「おまかせ」で進めることもできる

詳細な前提を決めず、AIに妥当な仮定を置かせたい場合は、次のように回答します。

一般的な業務システムを前提に、おまかせで進めてください。

または、

運用負荷を最優先として仮定して進めてください。

この場合、AIは前提を補完してHTMLを生成します。

ただし、補完した内容は次のように明示されます。

[前提・仮定]
・本番環境を対象とする
・24時間365日の運用を想定する
・運用担当者による手動承認を残す

AIが置いた前提と、ユーザーが入力した事実を区別できます。


生成されたHTMLの保存方法

Gemから出力された内容は、<!DOCTYPE html>から始まる完全なHTMLです。

出力内容をコピーし、例えば次のファイル名で保存します。

design-document.html

ブラウザで開けば、そのまま資料として表示できます。

外部CSSや外部ライブラリを使用していないため、単一ファイルで動作します。


想定している利用場面

このプロンプトは、次のような場面で利用できます。

システム設計の説明

  • AWS構成の説明
  • CI/CD構成の説明
  • ネットワーク構成の整理
  • デプロイフローの説明
  • 障害時フローの整理
  • 移行方式の説明

要件定義

  • 機能要件の整理
  • 非機能要件の整理
  • 対象範囲と対象外の明確化
  • 前提条件の整理
  • 受け入れ条件の整理
  • 未決事項の管理

意思決定

  • 複数案の比較
  • 推奨案の説明
  • 採用理由の整理
  • 判断基準の可視化
  • リスクと対策の整理

会議・議事録

  • 会話ログから決定事項を抽出する
  • 未決事項を整理する
  • 次のアクションを明確にする
  • 会議結果を共有用資料へ変換する

顧客・上司への説明

  • 技術内容を非技術者向けに整理する
  • 重要な判断だけを短時間で伝える
  • 詳細情報を折りたたんで残す
  • PDF印刷して説明資料として利用する

このプロンプトのメリット

資料の品質を一定にできる

入力内容や担当者が変わっても、同じレイアウトと情報構造で出力できます。

毎回デザインや構成を指示する必要がありません。


決定事項とAIの提案を分離できる

生成AIの提案が、すでに決定済みの方針であるかのように表示される問題を防げます。

資料内で状態ラベルを表示するため、読み手も判断しやすくなります。


不足情報を生成前に確認できる

資料を作った後で前提不足に気づくのではなく、HTMLを生成する前に重要な確認を行います。

誤った前提で詳細な資料を作成する手戻りを減らせます。


会話ログを構造化できる

整理されていないチャット履歴や議事録でも、次のように分類できます。

事実
決定事項
要件
設計方針
推奨案
リスク
未決事項
次のアクション

単純な要約よりも、意思決定に利用しやすい情報になります。


技術者以外にも説明しやすい

専門用語の利用を抑え、必要な用語には短い説明を付けます。

結論と理由を最初に表示するため、技術的な詳細をすべて読まなくても概要を理解できます。


そのまま共有できる

出力は完全なHTMLなので、次の用途に利用できます。

  • ブラウザで表示する
  • メールやチャットで共有する
  • 社内ストレージへ配置する
  • PDFとして印刷する
  • 設計レビューで画面共有する
  • 顧客説明資料として利用する

利用時の注意点

1. プロンプトが長い

HTMLとCSSのテンプレートを含んでいるため、プロンプト自体はかなり長くなります。

短い応答を大量に行う用途よりも、設計資料や要件整理資料を作る用途に向いています。


2. 入力情報の正しさは保証されない

このプロンプトは入力情報を整理しますが、入力された事実そのものが正しいかは検証できません。

例えば、AWSサービスの仕様や制限値、法律、契約内容などは、別途公式情報を確認する必要があります。


3. 複雑な構成図には向かない

HTMLとCSSだけで図を表現するため、単純なフローには向いています。

一方で、次のような図には限界があります。

  • 分岐が非常に多い
  • ネットワーク接続が複雑
  • 要素間の関連が多い
  • 階層構造が深い
  • 物理構成と論理構成が混在する

複雑な構成図は、Mermaidやdraw.ioなどの作図手段と分けて利用する方が適しています。


4. 最終的な意思決定は人間が行う

AIが表示する推奨案は、入力された条件をもとに整理した結果です。

次のような入力されていない事情は判断できません。

  • 組織固有のルール
  • 契約条件
  • 予算
  • 社内スキル
  • 運用体制
  • セキュリティポリシー
  • 将来の事業計画
  • ステークホルダー間の調整

AIの推奨をそのまま決定事項にするのではなく、判断材料として利用します。


改善できそうなポイント

今後、用途に応じて次のような改善も考えられます。

  • Mermaidを利用した構成図モード
  • AWS設計資料専用のテンプレート
  • 要件定義書専用のテンプレート
  • 議事録専用のテンプレート
  • HTMLとMarkdownの切り替え
  • HTMLからPDFへ変換しやすいレイアウト
  • 入力内容の矛盾一覧
  • 決定事項の変更履歴
  • 前回資料との差分表示
  • 受け入れ条件のチェックリスト化
  • リスクの影響度と発生確率の表示
  • 担当者と期限を含むアクション管理

万能なテンプレートを1つ作るよりも、用途別に派生版を作ると、さらに精度を高められます。


まとめ

今回作成したプロンプトでは、生成AIへ単に「分かりやすくまとめて」と依頼するのではなく、次の処理を明確に定義しました。

  1. 資料の目的を判断する
  2. 情報が十分か確認する
  3. 不足している場合は重要な質問だけを返す
  4. 事実・決定・提案・未決事項を分類する
  5. 結論を最初に表示する
  6. 入力順ではなく理解しやすい順に再構成する
  7. 意思決定に必要な情報だけを残す
  8. 必要なセクションだけを選択する
  9. 固定したHTMLテンプレートへ反映する
  10. 完全なHTMLとして出力する

生成AIの回答品質を安定させるには、文章の書き方だけでなく、判断手順・情報分類・出力構造・デザインルールまで定義することが重要です。

複雑な設計検討、要件整理、会話ログを、そのまま共有できる資料へ変換したい場合に活用できるプロンプトになっています。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?