この記事は Zenn でも公開しています。
はじめに
Web版ChatGPTのSkillで、複数サイトを比較し、決まったフォーマットのExcel評価表を出力する仕組みを作っていました。
要件だけ見ると、そこまで難しくなさそうに見えます。
- URLをいくつか入力する
- サイト種別に応じた評価項目で比較する
- Excelに評価、理由、参照情報を並べる
- 毎回同じ列構成、同じシート構成で出力する
ところが、実機で試すとかなり苦戦しました。
こちらは「このフォーマットでExcelを作ってほしい」と指示しているつもりでも、ChatGPTは過去に見たことがありそうなExcel分析の形へ寄せてしまいます。1シートで出したいのに複数シートになったり、指定した列が消えたり、評価項目を勝手に作り直したりしました。
この記事では、具体的なプロジェクト名やコードは伏せつつ、Web版ChatGPTのSkillで「フォーマット通りのExcel」を出させるために効いた設計をまとめます。
作ろうとしたもの
作りたかったのは、サイト比較の評価表です。
人間が使うExcelなので、ただデータが入っていればよいわけではありません。あとから見返したときに、どの評価がどの理由に基づくのか、どのURLを見れば確認できるのかが横並びで追える必要があります。
最終的に目指した列構成は、次のような形です。
| 領域 | 列の意味 |
|---|---|
| 基本情報 | No、カテゴリ、評価項目 |
| 対象ごとの評価 | 対象Aの評価、理由、参照 |
| 比較対象ごとの評価 | 対象Bの評価、理由、参照 |
| 追加対象 | 対象数に応じて、評価、理由、参照の3列セットを増やす |
| 横断比較 | 同じ評価項目について、各サイトを横断して見たコメント |
ポイントは、評価対象ごとに「評価」「理由」「参照」を3列セットで持たせることです。
参照列を末尾にまとめるのではなく、各対象の理由の右に置く。こうすると、人間がファクトチェックするときに、評価と根拠を同じ目線の移動で確認できます。
何がうまくいかなかったか
最初の失敗は、ChatGPTが「フォーマットの指示」よりも「それっぽいExcel分析の形」を優先してしまったことでした。
| 失敗 | 起きたこと | なぜ困るか |
|---|---|---|
| シート構成が変わる | 1シート指定なのに、作業用や詳細用のシートが増える | 人間側の確認手順が崩れる |
| 列構成が変わる | 参照列が消える、末尾にまとめられる、独自列が増える | 想定したレビューができない |
| 評価項目が変わる | 用意した項目を読まず、ChatGPTが独自項目を作る | 比較の基準が毎回変わる |
| 評価記号が揺れる | 指定外の数値、ランク、記号が混ざる | 集計や比較が壊れる |
| 見た目が揺れる | 列幅、色、行高、罫線が毎回微妙に変わる | Excelとしての使い勝手が落ちる |
特に大きかったのは、ChatGPTがExcelを自力で組み立て始めることです。
モデルにとっては「Excelを作る」こと自体はできます。でも、こちらが欲しいのは自由なExcel生成ではなく、決められた型への出力です。ここを分けて考えないと、毎回それっぽいけれど微妙に違う成果物になります。
なぜ難しかったのか
今回の問題は、単にプロンプトが弱いという話ではありませんでした。
Web版ChatGPTのSkillでは、モデルが自然言語の指示、会話文脈、外部ファイル、過去の一般的なパターンを組み合わせて動きます。そのため、こちらが「このフォーマット」と書いても、モデル側の既存パターンが強いと、そちらへ引っ張られることがあります。
Excel出力では、特にこれが起きやすいと感じました。
| モデルがやりがちなこと | こちらが本当に欲しかったこと |
|---|---|
| 分析しやすそうな複数シート構成にする | 人間が見る1シートの評価表にする |
| 評価項目をよしなに補完する | 用意した評価項目をそのまま使う |
| 見やすそうな列を追加する | 指定した列以外を増やさない |
| 数値スコアやランクに置き換える | 指定した評価記号だけを使う |
| その場でExcel生成手順を考える | 固定された生成処理だけを使う |
つまり、ChatGPTの創造性や補完力が、フォーマット固定の場面では逆にノイズになります。
方針を変えた
途中から、考え方を変えました。
「ChatGPTにExcelをうまく作ってもらう」のではなく、「ChatGPTには調査と構造化だけを任せ、Excelの形は固定処理で守る」方針です。
この分担にすると、モデルに任せる範囲がはっきりします。
| 領域 | ChatGPTに任せる | 固定処理で守る |
|---|---|---|
| サイト理解 | ページ内容の把握、比較観点の整理 | なし |
| 採点 | 評価記号の選択、理由文の作成 | 許可記号の検証 |
| 根拠整理 | 参照URLや確認箇所の整理 | 参照列の配置 |
| Excel出力 | 直接は任せない | シート数、列順、列幅、罫線、色 |
| 品質確認 | 自己レビュー | レイアウトの機械検証 |
この切り分けが、かなり効きました。
指示は「やること」より「やってはいけないこと」を厚めに書く
改善後は、指示ファイルの冒頭に、絶対に守る原則を置きました。
たとえば、次のような内容です。
| 原則 | 意図 |
|---|---|
| 評価項目資料を実際に読む | 独自項目の生成を防ぐ |
| Excelは固定処理で作る | その場の思いつきで列やシートを作らせない |
| 出力は1シートだけにする | 過去パターン由来の複数シート化を防ぐ |
| 指定外の列を追加しない | 人間の確認フローを壊さない |
| 生成後に検証する | 仕様違反を出力前に見つける |
さらに、禁則事項も具体的に書きました。
抽象的に「フォーマットを守る」と書くだけでは足りません。実際に起きた失敗をもとに、「作業用シートを増やさない」「参照列を末尾にまとめない」「独自の評価項目を作らない」のように、やってほしくない形を明示しました。
LLMは自由度が高いと、親切心で別案を作ります。だから、フォーマット固定が重要な場面では、正解だけでなく不正解の形も書くのが大事でした。
評価項目は読んだ証跡を残す
評価項目を外部資料にしても、ChatGPTが実際に読まずに進むことがあります。
そこで、評価項目資料を読んだことが会話上で分かるようにしました。具体的には、資料ごとに短い識別子を置き、採点前にそれを出させる運用です。
これは厳密なセキュリティ機構ではありません。けれど、「読んだことにして進んだ」ケースを見つけやすくなります。
今回のようにフォーマットと評価基準を固定したい場合、モデルの内部状態を信じるだけでは危ういです。外から観測できるチェックポイントを作ると、失敗の発見が早くなります。
Excelの見た目はモデルに任せない
Excelは、見た目の再現が思った以上に難しいです。
列幅、行高、セルの塗り、フォント、罫線、折り返し、リンク、コメント。ひとつひとつは小さな要素ですが、少しずつズレると「人間が使う表」としての品質が落ちます。
そこで、見た目に関わる要素はできるだけ固定処理側へ寄せました。
| 固定したもの | 理由 |
|---|---|
| シート数 | 1シートで確認する運用を守るため |
| ヘッダー行 | 列順と意味を固定するため |
| 列幅 | 長い理由文や参照情報を読みやすくするため |
| 行高 | 折り返し後の視認性を保つため |
| 罫線・塗り | 既存の確認しやすい表に寄せるため |
| 評価記号の表示 | 集計と目視確認をしやすくするため |
ChatGPTには「評価内容」を作ってもらう。Excelの見た目は、固定処理で再現する。
この線引きをしたことで、出力の安定性が上がりました。
生成後の検証を手順に入れる
もうひとつ効いたのは、Excelを作ったあとに必ず検証する手順です。
検証では、次のような観点を見ます。
| 検証項目 | 見る理由 |
|---|---|
| シート数が1つか | 複数シート化していないか確認する |
| ヘッダーが指定通りか | 列の欠落や追加を見つける |
| 最終列が横断比較か | 右端の構成が崩れていないか確認する |
| 集計行があるか | 評価記号の件数確認ができるか見る |
| 各対象に参照列があるか | ファクトチェックしやすい構造か確認する |
| ファイル形式がExcelか | 出力物の取り違えを防ぐ |
この検証は「あとで人間が見る」ではなく、Skillの実行手順に組み込みました。
出力前に機械的に落とせるものは落とす。これで、「見た目はそれっぽいけど仕様違反」という成果物をかなり減らせます。
参照列は対象ごとに置く
途中までは、参照情報を最後の列にまとめる案もありました。
でも実際に見ると、評価対象ごとに参照列が分かれている方が確認しやすいです。
| 構成 | メリット | デメリット |
|---|---|---|
| 末尾に参照列を1本だけ置く | 列数は少ない | どの対象の根拠か追いにくい |
| 各対象に参照列を置く | 評価、理由、根拠を横並びで読める | 対象数に応じて列数が増える |
最終的には、列数が増えても「各対象に参照列を置く」方を選びました。
Excelは人間が見るものです。列数の少なさより、確認するときの迷いにくさを優先しました。
躓いたところ
一番印象に残っているのは、実機テスト後の振り返りです。
自分: Web版ChatGPTのSkillで検証したけど、フォーマットが全然安定しない。どこが悪いか原因を整理したい。
AI: 根本原因は、指示ファイルの制約がLLMの既存パターンより弱かったことです。正解フォーマット、禁則、生成後検証を強化する必要があります。
この「既存パターンより弱い」という見立ては、かなり腑に落ちました。
こちらは指示ファイルに仕様を書いたつもりでも、モデル側には「Excel分析ならこういう構成にする」という強い既存パターンがある。その既存パターンを上書きするには、正解レイアウト、禁則、固定処理、検証まで含めて、逃げ道を減らす必要がありました。
もう一つの躓きは、評価の中身とExcelの形を同時にモデルへ任せようとしたことです。
調査、採点、理由づけはLLMの得意領域です。一方で、列順、シート数、セル幅、参照列の位置は、LLMに自由に考えさせるほど揺れます。ここを分離するまで、出力はなかなか安定しませんでした。
この記事から持ち帰れること
Web版ChatGPTのSkillでExcelを出すときは、「Excelを作れるか」より「毎回同じ型で出せるか」が難所になります。
そのために効いたのは、次の設計です。
| 観点 | 学び |
|---|---|
| 役割分担 | LLMには調査と構造化を任せ、Excelの形は固定処理で守る |
| 指示設計 | 正解だけでなく、過去に起きた失敗形を禁則として書く |
| 外部資料 | 評価項目を読んだことが分かる証跡を作る |
| フォーマット | 1シート、列順、参照列の位置を明文化する |
| 検証 | 出力後にシート数、ヘッダー、集計行を機械的に確認する |
| 運用 | 人間が確認しやすいExcelをゴールにする |
まとめ
LLMに「いい感じにExcelを作って」と頼むと、たしかにそれっぽいものは出ます。
でも、業務で使うExcelに必要なのは「それっぽさ」ではなく、毎回同じ場所に同じ意味の情報があることです。
今回の学びは、ChatGPT Skillを安定させるには、モデルの自由度を全部なくすのではなく、自由に考えてよい部分と、絶対に守る部分を分けることでした。
調査や理由づけはChatGPTに任せる。Excelの構造や見た目は固定処理と検証で守る。
この分担にすると、Web版ChatGPTのSkillでも、フォーマットに沿ったExcel出力にかなり近づけます。