特殊なPrompt指定

Last-modified: 2025-06-30 (月) 16:43:15

プロンプトの特殊構文です。
Stable Diffusion web UIにおけるprompt指定方法の詳細な解説です。

() プロンプトの強弱

語句を( )、[ ]で囲むことでプロンプトの効果を強調、控えめにできます。

(abc)・・・abcへの注目度を1.1倍増加する。→ abcの効果を1.1倍する。
[abc]・・・abcへの注目度を1.1倍減少する。→ abcの効果を1/1.1倍=0.91倍する。

(school uniform:1.2)の様に空白を挟んでいても、括弧で括ってる範囲全部効きます。

 

倍率は数字入力により指定することができます。

(abc:3.12)・・・abcへの注目度を3.12倍増加する。
 

括弧を重ねると、重ねた回数だけ倍になります。

(…:1.10) = (…)
(…:1.21) = ((…))
(…:1.33) = (((…)))
(…:1.46) = ((((…))))
(…:1.61) = (((((…)))))

(…:0.91) = […]
(…:0.83) = [[…]]
(…:0.75) = [[[…]]]
(…:0.68) = [[[[…]]]]
(…:0.62) = [[[[[…]]]]]
 

文章を選択して「Ctrl」+上下キーを押すことで強弱変更できます。

例えば、abcを選択後またはabcを入力後、
「Ctrl+↑」を押す毎に
abc → (abc:1.1) → (abc:1.2) → 以降、0.1倍ずつ増加
「Ctrl+↓」を押す毎に
abc → (abc:0.9)  → (abc:0.8) → 以降、0.1倍ずつ減少
  • 変動量は、Settings→User interfaceで変更可能。

NovelAI用の呪文をStable Diffusion向けに変換する

NovelAI(NAI)のプロンプト強調の記述ルールは、Stable Diffusionと異なります。
匿名としあきの作成した素晴らしいブックマークレットがあるのでそちらを活用しましょう。
リンク⇒スレ閲覧時に便利なブックマークレット2

或いは Extensions からインストールできる novelai-2-local-prompt を使うのも良いかもしれません。

 
NAI手動変換

NAI手動変換

(…:1.0500) {…}
(…:1.1025) {{…}}
(…:1.1576) {{{…}}}
(…:1.2155) {{{{…}}}}
(…:1.2763) {{{{{…}}}}}

(…:0.9524) […]
(…:0.9070) [[…]]
(…:0.8638) [[[…]]]
(…:0.8227) [[[[…]]]]
(…:0.7835) [[[[[…]]]]]

[A:B:num] スケジュール構文

指定stepを基準に、生成途中でプロンプトのON/OFFを切り替えることができます。

基本形
 [A:B:数字]
 [from:to:when]を意味する。
A:(from:)は省略可

つまり、“数字”stepまでは“A”で生成し、それ以降は“B”で生成する指定です

途中から途中まで…は入れ子にして使います。

TIPS
Q:なぜ()ではなく[ ]を使うの?
A:(abc)と(abc:1.1),[abc]はすでに強調文として使われているかららしい。
詳しいPRはこちら:https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#prompt-editing

指定数字が0~1の場合 → 全ステップ数に対する割合で指定

 [A:B:0.5]
 [この語句から:この語句へ:このステップで切り替え]

Sampling Stepsが100の場合
 0~50step   :プロンプトAが適用される
 50~100step:プロンプトBが適用される
 [A:0.5]
 これは[B:A:0.5]のBが省略された形を意味します。

Sampling Stepsが100の場合
 0~50step   :なにもしない
 50~100step:プロンプトAが適用される
 [A::0.5]
 これは[A:B:0.5]のBが省略された形を意味します。

Sampling Stepsが100の場合
 0~50step   :プロンプトAが適用される
 50~100step:なにもしない

指定数字が1以上の整数の場合 → 変化するステップ数を直接指定

step数を直接指定する以外は、上記の割合で指示した場合と考え方は同じです。

例:

Sampling Stepsが100の場合
 [A:10]  =  [A:0.1]  = どちらも10step以降からAが有効
 [A:50]  =  [A:0.5]  = どちらも50step以降からAが有効

使用例

moutainとlake単独で存在するのではなく、moutainの中にlakeが内包する形で出力されやすくなります。先に実行されるプロンプトが絵の概要を生成し、後のプロンプトがディテールとして生成されます。そういった順番のノイズ除去が行われます。

moutain,lake[moutain:lake:20]
スケジュール構文使用例_moutain_lake単独.pngスケジュール構文使用例_[moutain:lake:20].png
山と池が生成される山の中に池が生成される
(平地の部分は大きな低山でしたが、一部が池になりました)

sampling steps : 60 , Seed:1 ,Sampler :Euler a ,512×512pixel,Clip skip 2 , CFG scale:7.5,model:anyloraCheckpoint_bakedvaeFtmseFp16NOT.safetensors

スケジュールの入れ子構造

公式が想定しているスケジュール構文の応用です。(ぶっちゃけあんまり使わない)
スケジュール構文は、入れ子にして使用することができます。

応用例1

この呪文を見ていきましょう

[[red::0.2]:green:0.8]
上記の式を一般化すると、
[A:B:0.8]
A=[C::0.2]と同義です。

したがって、上記プロンプト構文の生成結果は、

全体の80%まで[red::0.2]
20%を過ぎるまでredが有効

20%を過ぎたらredが消え
そこから次のgreenが80%くらいで入ってくるまで何もなし

0→red→20%→無し→80%→green→100%の流れです。

応用例2

この呪文を見ていきましょう

[(partially [[blue:green:0.2]:red:0.35] hair:1.2):0.1]

上記プロンプト構文の生成結果は、

10%を過ぎた段階でこの呪文の読み込み開始。(それまでは無)
20%くらいまでpartially blue hairの1.2倍に
20%過ぎたらpartially green hairの1.2倍に
35%以降でpartially red hair の1.2倍に
となっています。

スタート→無→10%→partially blue hair 1.2倍→20%→partially green hair 1.2倍→35%→partially red hair 1.2倍→100%終了

うまく使えば、メッシュやインナーカラーに使えるらしい。他には瞳の色など。

複雑なpromptが正常に機能しているかわからなくなったとき

プログラムを書き換えて、プロンプトの実行状況を表示する方法がある。

もっと見る

★プログラムのバックアップを取ってから実行してね
これするともしかしたらgit pull時にerror: Your local changes to the following files would be overwritten by merge:みたいなエラー出るかも↑みて解消
\modules\prompt_parser.pyを開き
60~80行目付近にある文章を編集する。

■変更前

    def get_schedule(prompt):
        tree = parser.parse(prompt)
        return [[t, at_step(t, tree)] for t in collect_steps(steps, tree)]

    promptdict = {prompt: get_schedule(prompt) for prompt in set(prompts)}
    return [promptdict[prompt] for prompt in prompts]


ScheduledPromptConditioning = namedtuple("ScheduledPromptConditioning", ["end_at_step", "cond"])
ScheduledPromptBatch = namedtuple("ScheduledPromptBatch", ["shape", "schedules"]

■変更後

   def get_schedule(prompt):
        tree = parser.parse(prompt)
        return [[t, at_step(t, tree)] for t in collect_steps(steps, tree)]

    res = [get_schedule(prompt) for prompt in prompts]
    for t in res:
        print(t)
    return res


ScheduledPromptConditioning = namedtuple("ScheduledPromptConditioning", ["end_at_step", "cond"])
ScheduledPromptBatch = namedtuple("ScheduledPromptBatch", ["shape", "schedules"]

その状態で生成を実行すると、例えば下記のpromptをSampling Steps100で入れた場合
[(partially [[blue:green:0.2]:red:0.35] hair:1.2):0.1]
コマンドプロンプト上に

[[100, '']]
[[10, ''], [20, '(partially blue hair:1.2)'], [35, '(partially green hair:1.2)'], [100, '(partially red hair:1.2)']]

と表示されます。
ここでは
[Sampling step,'プロンプト']の形式で書かれていますので、
つまり
スタート→無→step10→partially blue hair 1.2倍→step20→partially green hair 1.2倍→step35→partially red hair 1.2倍→step100終了

Sampling Stepsが50の場合には

[[50, '']]
[[5, ''], [10, '(partially blue hair:1.2)'], [17, '(partially green hair:1.2)'], [50, '(partially red hair:1.2)']]

と表示されます。
この場合も上記と同じですが、今回は50が最大なので1%=0.5stepとなります。
よって10%=step5,20%=step10,35%=step17,100%=step50となり
そのため
スタート→無→step5→partially blue hair 1.2倍→step10→partially green hair 1.2倍→step17→partially red hair 1.2倍→step50終了
という意味になります。

Sampling Stepsが20の場合には

[[20, '']]
[[2, ''], [4, '(partially blue hair:1.2)'], [7, '(partially green hair:1.2)'], [20, '(partially red hair:1.2)']]

と表示されます。
この場合最大stepが20で1%=0.2stepのため
10%=step2,20%=step4,35%=step7,100%=step20となります。
スタート→無→step2→partially blue hair 1.2倍→step10→partially green hair 1.2倍→step17→partially red hair 1.2倍→step20終了
という意味になります。

スケジュールによる遅延入力や除外

もっと単純なスケジュール構文の応用は「単純なスケジュールで要素の影響をコントロールする」という使い方。
特に全体・構図などへの影響をコントロールするときに便利。

[A:0.1] 遅延させて全体、構図への影響を抑える

例えば表情や体の一部などパーツ向けのプロンプトを入力したときには
「部位をクローズアップして構図が偏ってしまうプロンプト」や
「全体に影響を与えてしまって要素が強く出過ぎてしまうプロンプト」などがある。
特徴的なプロンプトに限らず、強調入力をした場合も引っ張られやすくなる。かといって注目度を減らしてしまうと要素が出にくくなってしまう。
そこで構図・要素の偏りを抑えつつも、指定したプロンプトを出したいという場合に

 [ A , :5]・・・5step前までは無し、5step目から A , を有効化する。

このようなスケジュールを入力することで「全体の構図が固まってきてからプロンプトを追加してその要素を出す」という、構図に影響を与えにくい呪文を組むことができる。stepタイミングは1~5辺りや0.1とかで良いが、要素や設定によって調節する。

この記法はネガティブプロンプトにも応用でき、単純にネガティブすると構図にも影響を与えてしまう場合にも、構図への影響を抑制しつつその要素を抑えることを狙える。
品質用のプロンプトなどにも応用できる。

[A:990] 記入情報の除外

プロンプトをテキストの手入力で管理している場合、一旦外したいときには一々消したり書いたりと手間がかかる。そこでスケジュール構文を応用し、

 [ A , :0]・・・0step目=最初から有効にする。
↓
 [ A , :9990]・・・9990step目から有効=(stepが9990未満なら)有効にしない。

このように使うことでプロンプトのテキスト上で疑似的に簡単なON/OFF設定などを作ることができる。

※注意点として、スケジュール構文などの切り替えはLoRAなどの記述には適応されない。

[<lora:lorafile:1.0>:9990]
[<lora:lorafile:1.0>:2]
どのタイミングの指定であってもLoRA自体は最初から有効化された状態で生成が行われる。

[A|B] 交互指定

プロンプトの内容を交互に切り替える指定ができます。

基本形
[A|B] C
[]の中に|を入れて区切ることでStepごとに切り替えて、
上記の例なら1Step目は"A C"、2Step目は"B C" 、3Step目は"A C"…とループで繰り返す。

この指定によりAとBを混ぜる生成も実行できます。
指定する内容は|の区切りで増やすことができます。

[A|B|C|D|E|F|G] ・・・1Stepごとに左から順番に切り替えていき、ループして繰り返す。

公式の生成例では[cow|horse]で牛と馬を混ぜています。
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#alternating-words

エスケープ処理

\(hogehoge\) とか ¥(hogehoge¥) とかあるのって何?

その \ とか ¥ はエスケープ処理ってやつだ。
例えばwebui系統で toshiaki (futaba), って入力したいとする。
するとfutabaの前後にカッコがあるから、futabaが1.1倍に強調されちゃうよね。
そこで toshiaki \(futaba\), という入力にすることで強調効果を回避できる仕組みが、webui系統には用意されてる。
このように「特別な意味がある文字や記号を別の文字に置き換えること」をプログラミング界隈ではエスケープ処理と呼ぶ…って庭に来たジュウシマツがゆってた。

:D ←要注意

上記エスケープ処理関係の一つとして「 :D 口を開けた笑顔」「 :o 口を小さく丸く開ける」「 c: U字口の笑顔」など、AA系タグ由来のプロンプトには注意が必要となる。
通常、平で使う場合には「 :c 」などをそのまま入力しても問題ないが、一部の特殊構文([]系)と組み合わせてしまうと構文記号として判別されていまい、出力が上手くいかなくなる。
そういった場合については「 \:3 」のように、対応記号の前に\記号を入れておくと問題なく機能する。

そういった場合でなくても、\処理に対応しているなら平で使う際も\をつけておいていい。
特殊構文のあるUIでプロンプト入力をしていくなら特殊記号の前には\を入れる癖をつけておこう。

AND 融合出力

補足

  • 2022/10/06より追加された機能
  • サンプラーによってはAND構文は使えないことがある。
    • Euler aは対応済み。DDIM, PLMS and UniPCは1111のVer.1.6.0で対応した*1
  • AND文を使用すると生成に通常より時間がかかります。
    • 処理としては「ANDで分割した2枚(複数枚)の画像を同時に融合させながら出力する」みたいな代物なので。

BREAK プロンプトの分割

BREAKの使用例

  • BREAKはWebUI系で利用できる特殊なキーワード。
    公式wikiにごく短い説明がある。
  • breakではなくBREAK
  • まずWebUIの画像生成は75トークンごとにグループ分割して生成処理をしている。
    BREAKを入力すると、グループの残りトークンを空トークンで埋めて、次のグループに移行する。
    • トークンは近いトークンと一緒になりやすいが、
      BREAKでは(空トークン分で)トークン同士の分割を明示的にできる。
      つまり、BREAKを境界として、お互いの干渉を起こしにくくする。
      例えば色移りの防止などに利用できる。
  • 2023/1/16の1111アプデで実装された機能
  • 240 無念 Name としあき 23/02/19(日)16:24:46 ID:qLW8bEds No.1068513211 そうだねx6
    >AND構文とBREAK構文の違いがわからない
    白い猫BREAK黒い犬
     →白い猫と黒い犬が描かれる

  • SD1.5→Pony→IL…とモデルが進化していく中で、色移りのトラブルも次第に減ったため、BREAK構文も現在では昔ほどには使用されなくなっている。

# コメント

構文ルールとして、#を使うとその行の後ろがコメント扱い、Promptsとして読み込まれなくなる。(ver 1.8.0/2024年3月から)

# (記入例)
any prompts, # and comment
# add comment
↓出力
any prompts,

この方式による除去はPrompts処理から完全に除去され、PNGなどへのメタデータにも残らない仕様となっている。

メタデータ上には残したいがPromptsとして無効にしたい場合は、[xxx:9990]のような記述で取り除く
ただしLoRAはスケジュール構文では封じることができない。