タグの順序と構成
モデル別の学習時タグ順、CLIPのトークン処理から見た前方優位の実体、実際に使える並び順テンプレートと実例プロンプト。
先に結論
「タグは重要な順に前へ書く」は半分正しく半分は迷信である。学習時のタグ順はモデル系列ごとに公式スキーマが公開されており、内容が違う。共通の正解はない。また推論時にタグ順が結果へ与える影響について、Onoma AI(Illustrious)も Laxhar Lab(NoobAI)も公式な定量的言明を出していない。「前が強い」を数値で裏づけた一次ソースは確認できていない。
一方で機構として順序が確実に効く場面は存在する。CLIPの因果アテンション、75トークンのチャンク分割、SDXLのpooled埋め込みの3つで、いずれも実装コードで検証できる確定事項である。順序で絵が劇的に変わるわけではないが、無視すると壊れる箇所がピンポイントで存在する。
モデル別の学習時タグ順
| 系列 | 公式に記載された学習時の並び |
|---|---|
| Illustrious XL | person count ||| character names ||| rating ||| general tags ||| artist ||| score range based rating ||| year modifier |
| NoobAI-XL | <1girl/1boy/1other/...>, <character>, <series>, <artists>, <special tags>, <general tags>, <other tags> |
| Pony V6 XL | score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up, + 自然文/タグ混在 |
差分は3点。レーティングの位置(Illustriousはスキーマ上に rating 枠があり一般タグより前。NoobAIのスキーマにはレーティング専用枠がなく、モデルカードのPrompt Prefixでは safe が先頭に置かれている)、アーティストの位置(Illustriousは一般タグの後ろ、NoobAIは前)、そして品質タグの位置が公式資料内で矛盾していること。
Illustriousの学習スキーマでは品質・年代が末尾で、v0.1モデルカードの作例も末尾に masterpiece を置く。一方NoobAIのモデルカードは同じ品質列を「Prompt Prefix(先頭)」とするが、同じLaxhar Labの公式ガイドブックは同じ文字列を at the end of the TAG(末尾)に置けと書く。同一組織の一次資料2件が食い違っている。実務的には「どちらでも動く」でよいが、同じワークフロー内では位置を固定すること。動かすと比較の条件が壊れる。
Ponyの score_* 連鎖だけは例外で、順序も内容も動かしてはいけない。モデルは各 score_x_up を個別概念として学習しておらず、長い文字列全体を1つの塊として「良い画像」に紐づけた(作者本人が “a variation of The Clever Hans effect” と表現)。公式も「score_9 単体でも使えるがフル文字列より明確に弱い」と明記している。
「前方が強い」の実体
CLIPの因果アテンション
CLIPテキストエンコーダはcausal mask付きself-attentionを使い、各トークンは自分より前のトークンしか参照できない。後ろに置いた名詞の埋め込みには、前方のすべての修飾語の文脈が流れ込む。
これが色移り(colour bleeding)を生む機構のひとつである(もう一方は、U-Net側のcross-attentionが条件を画面全体へグローバルに効かせ、テキスト側に「この色はこの領域」という情報を持てないこと)。red hair, blue dress では dress が red を吸い、逆順の blue dress, red hair では hair が blue を吸う。どちらの順でも漏れるので順序では解決しない。正解は色と名詞を分けず、blue dress red hair のようなDanbooruの複合タグをそのまま使うこと(white shirt は1,393,129件、blue dress は185,426件のpost_countを持つ実在タグ)。
75トークンのチャンク分割
CLIPの max_position_embeddings は77。BOS 1 + 本文75 + EOS 1で実効枠は75トークン。超えるとA1111もComfyUIも75トークン単位でチャンクに割り、各チャンクを独立にエンコードして連結する。
タグの位置が変わればチャンク境界が動き、どのタグが同じCLIPコンテキストに入るかが変わる。「タグを1個足しただけで絵が別物になった」の正体はたいていこれで、内容ではなく境界が動いた結果である。
| 入力 | トークン数(CLIP BPE実測) |
|---|---|
1girl | 2(数字は1文字1トークン) |
long hair / long_hair | 2 / 3(アンダースコアが1トークン、id 318) |
hatsune miku / hatsune_miku | 3 / 4 |
1girl, long hair, blue eyes | 8(カンマが各1トークン、id 267) |
カンマ直後の空白と改行は無料(, も , も1トークン)なので、読みやすさのための改行はトークン予算に影響しない。逆にアンダースコアは1個で1トークンを食い、かつ埋め込みが別物になる。long_hair と long hair はCLIPから見て違う入力である。
A1111には comma_padding_backtrack(既定20)があり、チャンクが75に達したとき直近20トークン以内のカンマ以降を次チャンクへ送ってタグの分断を防ぐ。ComfyUIにカンマを見た折り返しはない。
SDXLのpooled埋め込みは第1チャンクだけ
Illustrious / NoobAI / Pony V6 はすべてSDXLベースで、SDXLはpooled text embeddingを追加条件に使う。実装は A1111 が zs[0].pooled、ComfyUI が first_pooled = pooled[0:1] で、どちらも第1チャンクのpooledしか使わない。75トークンを超えた分や BREAK より後ろのタグはpooledに一切寄与しない。全体の画調を決めるタグ(品質・画風・アーティスト・レーティング)は第1チャンクに入れる。
重み正規化はチャンク単位(A1111)
A1111の既定Emphasis “Original” は重みを掛けたあとチャンク全体の平均を戻すため、あるタグの重みを上げると同じチャンク内の他のタグが相対的に下がる。SDXLでは作者自身が実装のdescriptionで “No norm” を推奨している。ComfyUIは平均正規化を行わないため、同じ (tag:1.4) でも両者で結果が違う。
実務用テンプレート
主要素を前へ、修飾を後ろへ、全体に効くものを第1チャンクへの3原則を満たす並びを使う。
[品質] [レーティング] [年代]
→ [人数/主体] → [キャラ名 + シリーズ] → [容姿]
→ [服装] → [表情/ポーズ] → [構図/カメラ] → [背景/照明]
→ [アーティスト]
| ブロック | 例 | 注意点 |
|---|---|---|
| 品質 | masterpiece, best quality, absurdres | normal quality はNoobAIのみ、average quality / bad quality はIllustriousのみ |
| レーティング | safe / general / sensitive | 露出を止めるためでなく構図分布を固定するために入れる。省略すると pov(explicit率63.9%)や lying(31.6%)がNSFW側の分布を引き込む |
| 年代 | newest, recent, old | 名前が衝突しつつ意味が違う。 Illustriousの old は約2019年、NoobAIの old は2005〜2010年 |
| 人数/主体 | 1girl, 2girls, solo | solo と 2girls の併記は禁止。実測共起504件(2girlsの0.036%)で事実上排他 |
| キャラ | ganyu \(genshin impact\), genshin impact | シリーズタグを併記する。 括弧は \( \) でエスケープ |
| 容姿 / 服装 | blue eyes, white shirt, black thighhighs | 色は対象と複合タグで組む。white, shirt と分けない |
| 構図/カメラ | upper body, cowboy shot, from side | from above と from below(共起0.64%)のような排他ペアを重ねない |
| アーティスト | wlop, quasarcake | NoobAIには artist: prefixを付ける流儀があり、Illustriousは素のタグ |
artist: prefixは公式資料内で不整合がある。NoobAIモデルカードのDiffusersサンプルは artist:john_kafka、Laxhar Lab公式ガイドブックも「artist tags need to add the artist: prefix」と書く一方、同ラボの公式ユーザーマニュアルは artist: prefixを「誤り」とし素の wlop を正としている。一次資料から決着できないので両方試すのが妥当。
実例プロンプト
例1: Illustrious XL(学習スキーマ準拠 / 品質タグ末尾)
1girl, hatsune miku, vocaloid, general,
long hair, twintails, aqua hair, aqua eyes,
detached sleeves, black skirt, thighhighs,
smile, closed mouth, upper body, from side,
outdoors, cherry blossoms, backlighting,
wlop, masterpiece, best quality, newest
例2: NoobAI-XL eps 1.1(モデルカード準拠 / 品質タグ先頭)
アーティストが一般タグより前に来るのがIllustriousとの構造差。
masterpiece, best quality, newest, absurdres, highres, safe,
1girl, ganyu \(genshin impact\), genshin impact,
artist:wlop,
horns, blue hair, long hair, purple eyes, ahoge,
white shirt, detached sleeves, black gloves,
smile, closed mouth, cowboy shot, looking at viewer,
snow, outdoors, depth of field
例3: NoobAI-XL v-pred 1.0(BREAK で色移りを切る)
第1チャンクに品質・レーティング・アーティスト・主体を詰め、BREAKで2人目を切り離す。
masterpiece, best quality, newest, absurdres, highres, safe,
2girls, artist:wlop,
blonde hair, twintails, red eyes, red dress, red ribbon
BREAK
blue hair, short hair, green eyes, blue dress, white thighhighs
BREAK
indoors, library, bookshelf, sunlight, from side, upper body
BREAKはA1111 / Forgeのみ有効で、ComfyUI本体では機能しない。ComfyUIで BREAK と書くと小文字化されて break(token id 2568)という普通の単語1トークンとして絵に影響する。ComfyUIではCLIPTextEncodeを2個立てて ConditioningConcat で連結するのが等価。
BREAKは色移りを減らすが消しはしない。CLIP側の混線は切れてもU-Net側のcross-attentionは連結後の全トークンを見るため、空間的な分離は保証されない。確実に分けるならRegional Prompter / Forge Couple / Attention Coupleなどの領域指定が要る。
例4: Pony Diffusion V6 XL
score連鎖は先頭固定でフル6連。Danbooruのアーティストタグは公式に除去済みで効かず、masterpiece 等の品質語も公式に不要と明言されている。
score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up,
source_anime, rating_safe,
1girl, solo, blonde hair, long hair, blue eyes,
white dress, sundress, straw hat, smile,
upper body, outdoors, day, beach
やってはいけない構成
| パターン | 何が起きるか |
|---|---|
blue, dress, red, hair と色を分離 | 因果アテンションで色が後続の名詞に流れる |
solo と 2girls を併記 | 実測共起0.036%で学習分布外。構図が崩れる直接原因 |
long_hair とアンダースコアを残す | +1トークン、かつ埋め込みが別物。A1111本体もComfyUI本体もスペースへ自動変換しない(変換するのはタグ補完拡張が候補を挿入する時だけ) |
20トークン付近で早めに BREAK | 以降のタグがSDXLのpooled埋め込みに寄与しなくなる |
Ponyで score_9, score_8_up に短縮 | 公式が「フル文字列より明確に弱い」と明記。3連短縮形は普及しているが公式が検証した記録は確認できていない |
score_9... をIllustrious / NoobAIに入れる | 学習語彙に存在せず、無意味なトークンとしてチャンク予算と構図を汚す |
順序より先に効くもの
順序調整は費用対効果としては下位である。優先順位は、1) タグ自体が有効か(post_count 0 の blond hair は正が blonde hair、big breasts は正が large breasts。非推奨タグはどこに置いても効かない)、2) 複合タグを使っているか、3) 系列に合った語彙か(品質語・レーティング語・年代タグ・アーティスト記法はすべて系列間で非互換)、4) 推論設定が公式値の範囲か、そのうえで 5) 順序。
NoobAI公式ユーザーマニュアル自身が「Sequential cue words are better」と順序を推奨しつつ、同じ節で「the effect of misuse is often not obvious, and in some cases, it can even improve」と述べている。ラボ側も順序の効果を絶対視していない。