AI活用

ローカルLLMで画像プロンプトを作る|日本語から英語への変換品質を比較

ローカルLLMで日本語の依頼を画像プロンプトにする方法を解説。翻訳ではなくSubject・Style・Lightingなどの項目化、JSON Schemaでの依頼、複数モデルを固定項目で比較する手順、長文の限界、生成前の検査まで分かります。

この記事の目次
  1. 結論:翻訳ではなく項目化、評価は固定項目で複数モデル比較
  2. LLMに任せる範囲を決める
  3. 入力テンプレートを項目化する
  4. 日本語から構造化promptを得る
  5. モデルの違いを比較する
  6. 再現してほしい比較:日本語依頼10件 × 複数モデル
  7. 長文promptの限界を確かめる
  8. 生成前の検査を入れる
  9. よくある質問
  10. 日本語のまま画像モデルに渡してはいけませんか?
  11. クラウドのLLMを使えばもっと精度が出ますか?
  12. 採点を LLM にやらせてもよいですか?
  13. まとめ

ローカルLLMに画像プロンプトを作らせるなら、「日本語を英語に訳す」のではなく、Subject・Style・Composition・Lightingなどの項目に分解させてJSONで受け取ります。どのモデルが向くかは決め打ちできないため、同じ日本語依頼10件を複数モデルに通し、固定の評価項目で比べてから選びます。

情報確認日:2026年8月22日(日本時間)

結論:翻訳ではなく項目化、評価は固定項目で複数モデル比較

責任範囲

  • LLMに任せる範囲(表現の整理・構造化)と任せない範囲(事実・固有名詞の検索)
  • Subject・Style・Composition・Lighting などの入力テンプレート
  • 日本語依頼からJSON Schema付きで構造化promptを得る依頼文
  • 同じ依頼を複数のローカルモデルで比較する手順と記録表
  • 長いpromptが良いとは限らない理由と確かめ方
  • 生成前に入れる禁止語・権利・人物表現の検査

Ollamaの導入と基本操作はOllamaの使い方で扱っています。formatにJSON Schemaを渡してComfyUI用の設定JSONを作り、受信後に再検証する方法はStructured Outputsの記事、LLMの出力をComfyUIに安全に渡す役割分担はOllamaとComfyUIの連携を参照してください。この記事は「prompt本文の品質をどう作り、どう比べるか」に絞ります。画像prompt一般の書き方や、特定モデル向けのタグ辞書は扱いません。

スポンサーリンク

LLMに任せる範囲を決める

ローカルLLMが得意なのは、曖昧な日本語から「何を・どんな雰囲気で・どう構図で」を取り出して英語の句に整えることです。苦手なのは、実在する作家名・作品名・製品名を正しく引くことと、そのモデルに効くタグを知っていることです。後者はLLMの学習データと画像モデルの組み合わせに依存し、もっともらしい嘘が混ざります。

任せる 任せない
「夕方っぽく」→ 光の状態(golden hour, long shadows)に言い換える 「あの映画の雰囲気で」→ 映画名・監督名を推測して補う
主題と背景と構図を別の項目に分ける 画像モデル固有の品質タグを付け足す
否定指示(文字なし・人物なし)を negative に振り分ける 実在の人物名・ブランド名を prompt に出す
冗長な言い回しを短い句にする seedや解像度のような実行パラメータを決める

「任せない」側は、system promptで禁止するだけでなく、後述の検査で機械的に弾きます。LLMは禁止と言われても出すことがあるためです。

入力テンプレートを項目化する

出力を自由文にすると、モデルごとの癖(長さ・語順・修飾の多さ)がそのまま比較のノイズになります。先に項目を決め、各項目を短い英語句で埋めさせます。

{
  "type": "object",
  "properties": {
    "subject":     { "type": "string", "description": "main subject, one noun phrase" },
    "action":      { "type": "string", "description": "what the subject is doing, or empty" },
    "setting":     { "type": "string", "description": "place and time" },
    "style":       { "type": "string", "description": "medium and rendering style, no artist names" },
    "composition": { "type": "string", "description": "framing and camera angle" },
    "lighting":    { "type": "string", "description": "light source and mood" },
    "palette":     { "type": "string", "description": "dominant colors, or empty" },
    "negative":    { "type": "array", "items": { "type": "string" } },
    "uncertain":   { "type": "array", "items": { "type": "string" },
                     "description": "Japanese phrases the model could not map confidently" }
  },
  "required": ["subject", "setting", "style", "composition", "lighting", "negative", "uncertain"]
}

最後のuncertainが重要です。「えもい感じで」「いい塩梅に」のような、英語の句に落とせない表現を、推測で埋めずにここに入れさせます。ここが空でないときは、人が日本語の依頼を直すか、項目を補う合図になります。

最終的なprompt文字列は、LLMに作らせず、こちらのコードで項目を決まった順に連結します。連結順を固定しておけば、モデルを替えても「構造は同じで中身だけ違う」比較ができます。

// 項目をこちらの順序で連結する。LLMに最終文字列を作らせない
export function buildPrompt(p) {
  return [p.subject, p.action, p.setting, p.composition, p.lighting, p.palette, p.style]
    .filter((s) => s && s.trim())
    .join(", ");
}
export function buildNegative(p) {
  return (p.negative ?? []).join(", ");
}

日本語から構造化promptを得る

Ollamaの公式ドキュメントでは、formatにJSON Schemaオブジェクトを渡す方法が案内され、temperatureを下げること、Schemaをprompt本文にも書いてモデルに示すことが推奨されています。Schemaの設計と受信後の再検証は前述のStructured Outputs記事に任せ、ここでは依頼文の中身だけ示します。

{
  "model": "置き換える",
  "stream": false,
  "options": { "temperature": 0 },
  "messages": [
    {
      "role": "system",
      "content": "You convert a Japanese image request into structured English fields for an image generator. Rules: (1) Do not add artist names, brand names, or real person names even if implied. (2) Do not add quality tags such as 'masterpiece'. (3) Put things the user does not want into 'negative'. (4) If a Japanese phrase cannot be mapped confidently, copy it into 'uncertain' instead of guessing. (5) Each field is a short English phrase, not a sentence. Return JSON only."
    },
    { "role": "user", "content": "雨上がりの商店街を歩く制服の女の子。少しノスタルジックで、看板の文字は読めなくていい。人は他にいない感じで。" }
  ],
  "format": { "...": "上のSchemaをここに入れる" }
}

system promptを英語にしているのは、指示の解釈を安定させるためで、日本語でも動くモデルは多くあります。どちらが安定するかも、次の比較で確かめる項目の1つです。この依頼文は、Structured Outputs記事のSchema検証とComfyUI連携記事の「自由文をそのまま実行しない」規則の上で動く前提です。

モデルの違いを比較する

「日本語に強いモデル」の評判は、画像promptの項目化に当てはまるとは限りません。同じ10件を、手元にある複数のモデルに同じsystem promptとtemperature 0で通し、固定の評価項目で採点します。

再現してほしい比較:日本語依頼10件 × 複数モデル

  1. 日本語の依頼を10件用意する。短文・長文・曖昧語入り・否定指示入り・固有名詞を匂わせるもの・英語混じりを混ぜる
  2. モデルを2〜3個選び(ollama listにあるもの)、同じsystem prompt・Schema・temperature 0で10件ずつ送る
  3. 各出力を次の5項目で採点する(0〜2点)。採点は人が行い、基準を先に文章で書いておく
  4. 合計点ではなく、項目ごとの弱点を見る。「意味は正しいが冗長」「短いが固有名詞を出す」など、モデルごとの癖が分かる
評価項目 2点 0点
意味の保持 主題・場所・雰囲気が依頼どおり 主題が変わる、要素が抜ける
否定の振り分け 不要なものがすべてnegativeに入る 否定が本文に混ざる(”no text”がsubjectに入る等)
禁止の遵守 作家名・ブランド・実在人物・品質タグなし いずれかを補っている
簡潔さ 各項目が短い句 文になっている、同じ意味の語が重複
uncertainの使い方 曖昧語を推測せず入れている 推測で埋めてuncertainが空
No. 依頼の型 モデルA 合計/弱点 モデルB 合計/弱点 モデルC 合計/弱点
1 短文・主題のみ
2 画風指定(作家名を匂わせる)
3 否定指示2つ
4 曖昧語(えもい・いい感じ)
5 長文(5文以上)
6 複数主題
7 実在人物を匂わせる
8 英語混じり
9 時間帯・天候の指定
10 構図の指定(俯瞰・寄り)

この記事ではどのモデルが良いかを断定しません。採点は読者の依頼の傾向と画像モデルに依存するためです。見るべきなのは合計点より「禁止の遵守」と「uncertainの使い方」で、ここが0点のモデルは、他が高くても検査の負担が増えます。

長文promptの限界を確かめる

LLMに作らせると、promptは長くなりがちです。長いほど良いとは限らない理由は2つあります。画像モデル側のテキストエンコーダには扱えるトークン数の上限があり、超えた部分は切り捨てられるか、分割処理で重みが薄まること。もう1つは、修飾が増えるほど互いに打ち消し合い、主題がぼやけることです。

これも数値を断定せず、同じSeedで確かめます。

  1. 比較で得た構造化promptを1件選び、buildPromptで連結した「通常版」を作る
  2. 同じ項目から、subject・setting・lightingだけの「短縮版」と、各項目に形容詞を2つずつ足した「冗長版」を作る
  3. ComfyUIでSeed・sampler・steps・CFG・解像度を固定し、3本のpromptで1枚ずつ生成する
  4. 3枚を並べ、主題の明瞭さ・依頼した要素の有無・破綻を記録する
語数 主題は明瞭か 依頼要素の再現 破綻・余計な要素
短縮版
通常版
冗長版

冗長版で依頼要素の再現が上がらず、余計な要素だけ増えるなら、それが手元の画像モデルでの上限の目安です。その語数を、LLMへの依頼文に「各項目は N 語以内」として戻すと、次回から長さが安定します。

生成前の検査を入れる

LLMの出力は、Schema検証を通っていても内容の検査が必要です。禁止語・権利・人物表現は、機械的な検査と人の確認を分けて入れます。

// validate-prompt.mjs — 機械的に弾ける範囲だけ。最終判断は人が行う
const BANNED = [
  /\b(masterpiece|best quality)\b/i,          // 品質タグ(モデル依存の呪文を混ぜない)
  /\b(in the style of|by)\s+[A-Z][a-z]+/,     // 作家名を示唆する定型
  /\b(logo|trademark|brand)\b/i,              // 商標に寄る語
];
const REQUIRE_REVIEW = [
  /\b(girl|boy|child|kid|teen)\b/i,           // 未成年を示す語 → 人が内容を確認
  /\b(nude|naked|lingerie)\b/i,               // 性的表現 → 原則不可
  /[A-Z][a-z]+ [A-Z][a-z]+/,                  // 固有名詞らしい2語 → 実在人物・ブランドの可能性
];

export function checkPrompt(fields) {
  const text = Object.values(fields).flat().join(" ");
  const errors = BANNED.filter((re) => re.test(text)).map((re) => `banned: ${re}`);
  const reviews = REQUIRE_REVIEW.filter((re) => re.test(text)).map((re) => `review: ${re}`);
  if (fields.uncertain?.length) reviews.push(`uncertain: ${fields.uncertain.join(" / ")}`);
  return { ok: errors.length === 0 && reviews.length === 0, errors, reviews };
}

errorsがあれば生成せず、LLMに再依頼するか依頼文を直します。reviewsがあれば生成を止めて人が判断します。正規表現は取りこぼしがあるため、検査を通った=安全ではなく、「人が見る件数を減らす」道具として扱ってください。

人物表現は自動化しない:実在の人物に似せる指示、未成年を示す語と性的・暴力的な語の組み合わせは、検査で止めたうえで人が不可と判断する運用にします。権利面(作家名・キャラクター名・ブランド)は、LLMが「暗黙に」補った場合も同じ扱いです。

よくある質問

日本語のまま画像モデルに渡してはいけませんか?

モデルによっては日本語を解釈しますが、多くの画像モデルは英語の学習データが中心で、日本語だと意図が伝わりにくくなります。この記事の方法は、翻訳ではなく「項目に分けて英語の句にする」ことで、曖昧さを人が見える形にする狙いです。

クラウドのLLMを使えばもっと精度が出ますか?

出る場合もありますが、依頼文が外部に送られます。ローカルLLMを選ぶ理由が機密性なら、精度差よりその点を優先してください。精度を上げたいときは、まずsystem promptとuncertainの運用を整えるほうが効きます。

採点を LLM にやらせてもよいですか?

下読みには使えますが、「禁止の遵守」と人物表現の判断は人が行ってください。LLM同士で採点させると、同じ癖(固有名詞を補う等)を見逃すことがあります。

まとめ

ローカルLLMで画像promptを作るときは、翻訳させるのではなく、Subject・Setting・Style・Composition・Lighting・Negative・Uncertainの項目に分解させ、最終文字列はこちらのコードで連結します。曖昧語は推測させずuncertainに入れさせ、人が直す合図にします。

モデルの優劣は断定せず、同じ10件を複数モデルに通して固定項目で採点し、長文の上限は同じSeedで3版を比べて決めます。生成前には、禁止語を機械で弾き、人物・権利に関わる語は人が判断する検査を必ず通してください。画像を見て再依頼する自動ループは別記事で扱います。

スポンサーリンク