NanoBananaProで画像生成をしていると、「同じキャラクターを作りたいのに、毎回微妙に顔や雰囲気が変わってしまう」という悩みはありませんか?
「プロンプト(指示文)の内容は変えていないのに、なぜ?」
実は先日、ある実験をしていて、この悩みを解決する意外な「コツ」を見つけました。それは、プロンプトの内容そのものではなく「書き方(フォーマット)」にありました。
今回は、画像生成AIにおける「JSON形式」と「YAML形式」の違いと、なぜYAMLの方がキャラクター固定やニュアンスの再現に向いているのかについてお話します。
全く同じ設定なのに、書き方で結果が変わる?
今回、架空のキャラクター「アイコ」を設定し、AIに画像を生成させる実験を行いました。
設定内容:
- 名前: アイコ
- 外見: 黒髪ロング、茶色の目、オフィスカジュアル
- シーン: モダンなオフィスでPCに向かっている
この全く同じ内容を、以下の2つの形式でAIに指示しました。
- JSON形式(システム開発などでよく使われる、括弧や引用符が多い形式)
- YAML形式(箇条書きに近く、すっきりした形式)
すると、「YAML形式の方が、指示通りの要素を忠実に拾い、画像の再現性が高い」という結果にななりました。
なぜYAML形式の方が「再現性」が高いのか?
JSONもYAMLも、書いてあるデータの中身は同じです。それなのに、なぜAIの出力結果に差が出るのでしょうか?Google geminiに聞いてみました。geminiとの対話で分かった理由は、主に以下の3点です。
1. 「ノイズ」が圧倒的に少ない
AIはテキストを読み込む際、記号も含めて処理します。
- JSONの場合:
{ "hair": "long", "eyes": "brown" }のように、波括弧{}やダブルクォーテーション"、カンマ,などの記号が大量に含まれます。これらがAIにとって一種の「ノイズ」となり、肝心のキーワード(黒髪、茶色など)の印象を薄めてしまうことがあります。 - YAMLの場合:
hair: longのように記号が最小限です。そのため、AIが「意味のある単語」にダイレクトに注目でき、指示がストレートに伝わります。
2. AIが「文脈」を理解しやすい
YAMLの構造(インデントを使った箇条書き)は、人間がメモを取るスタイルに近く、自然言語(話し言葉)に近い構造をしています。
そのため、AIは「髪=ロング」「服=ブラウス」といった要素同士の結びつきを迷わず理解してくれます。
3. コメントでメモを残せる(管理が楽)
実はこれが地味ですが最大のメリットかもしれません。 JSONは標準仕様としてコメント(注釈)を書くことができませんが、YAMLは「#」を使って自由にコメントを記述できます。
- 「
# 昨日の生成で良かった設定」 - 「
# ストレートで艶がある質感にしたい」
このように、自分用のメモや、AIへの補足的なニュアンスを自由に書き足せるため、試行錯誤の履歴を残しやすく、プロンプトの管理が非常に楽になります。
4. トークン(文字数)の節約
JSONは記述が長くなりがちですが、YAMLは短く済みます。プロンプトが短いほど、AIは指示内容を忘れにくいため、結果として一貫性のある画像が生成されやすくなります。
ここで一つ、重要な補足があります。
「じゃあJSONはダメなのか?」というと、決してそうではありません。
「設計データとしての正しさ」という観点ではJSONに軍配が上がる場合もあります。
ここが使い分けのポイントです。
プロンプトを「設計データ」として扱うならJSON
もし、将来的にAIを使ってアプリ開発をしたり、プログラムで大量の画像を自動生成させたりしたい場合、JSON形式の方が適しています。
- 理由: JSONはプログラムとの相性が抜群で、データの構造が厳格だからです。「システム上で、絶対にエラーなくデータを管理・保存したい」という場合は、JSONが世界標準です。
画像の「クオリティ」を追求するならYAML
しかし、今回のように「チャット画面でAIと対話し、理想の一枚を作りたい」「人間の感覚に近い絵を出してほしい」というクリエイティブな目的であれば、YAML形式がおすすめです。
- 理由: 余計な記号が少ない分、AIが「言葉のニュアンス」を拾いやすく、結果として私たちの頭の中にあるイメージに近い画像が出力されやすくなるからです。
結論:用途に合わせて使い分けよう
今回の実験から得られた結論をまとめます。
| 目的 | おすすめの形式 | 理由 |
| 最高の一枚を作りたい | YAML形式 | ノイズが少なく、AIにイメージが伝わりやすい |
| システムで自動化したい | JSON形式 | 構造が厳格で、プログラム処理しやすい |
もしあなたが、「画像生成AIでキャラクターを一貫させたい」「指定した要素を確実に反映させたい」と考えているなら、まずはプロンプトをYAML形式(またはシンプルな箇条書き)に変えてみてはいかがでしょうか?
今回実験に使用したプロンプト例(YAML):
# キャラクター設定
character:
name: "アイコ"
appearance:
hair: "黒髪のロングヘア" # ストレートで艶がある
eyes: "茶色"
clothing: "オフィスカジュアル, 白いブラウス"
# シーン指定
scene:
location: "モダンなオフィス"
action: |
アイコがデスクでパソコンに向かっている。
真剣な表情でディスプレイを見つめている。
背景には観葉植物が見える。
lighting: "自然光, 明るい"
今回実験に使用したプロンプト例(JSON):{
"character": {
"name": "アイコ",
"appearance": {
"hair": "黒髪のロングヘア",
"eyes": "茶色",
"clothing": "オフィスカジュアル, 白いブラウス"
}
},
"scene": {
"location": "モダンなオフィス",
"action": "アイコがデスクでパソコンに向かっている。\n真剣な表情でディスプレイを見つめている。\n背景には観葉植物が見える。",
"lighting": "自然光, 明るい"
}
}


