ComfyUIでEmbedding(Textual Inversion)を使うには、fileをComfyUI/models/embeddingsに置き、promptの中にembedding:ファイル名と書くだけです。専用ノードは不要で、Text Encoder側に「新しい単語」を足す仕組みなので、model本体に手を入れるLoRAとは適用先が違います。
情報確認日:2026年8月22日(日本時間)
結論:Embeddingは「単語の追加」、LoRAは「modelの補正」
責任範囲
- Embeddingが何を追加するのか、Text Encoderの側から説明する
- 配置先・一覧での認識・再読み込みの手順を現行UI(2026年8月時点)で示す
- 公式READMEで確認した呼び出し記法と重み指定の書き方を掲載する
- LoRAとの違いを適用先・file・強度・学習対象の4点で表にする
- Negative Embeddingの副作用と、効かないときの確認順を示す
LoRAの配置やLoad LoRAノードの接続、trigger wordの基礎はComfyUIでLoRAを使う方法で扱っているため、この記事では繰り返しません。
Embeddingは何を追加するのか
Embeddingは、promptを数値に変換するText Encoder(CLIP)に対して「新しい単語1つ分のベクトル」を追加するfileです。Textual Inversionという学習手法で、数枚〜数十枚の画像から「この概念を表す単語があったとしたら、どんなベクトルか」を逆算して作られます。
重要なのは、画像を描く本体(UNetやDiTなどのdiffusion model)には一切触れない点です。追加されるのは語彙だけなので、modelが元々描けない画風や物体を新しく描けるようにはなりません。「modelがすでに持っている表現のうち、言葉で指名しにくい組み合わせに名前を付ける」と理解すると、効く範囲と効かない範囲が読めます。
- prompt文字列をtokenに分割する
- 各tokenを辞書からベクトルに変換する(Embeddingはここに1語分を差し込む)
- Text Encoderが文脈つきのconditioningに変換する
- KSamplerがconditioningを手がかりにlatentを生成する
公式の例示ページにも「Embeddings are basically custom words so where you put them in the text prompt matters.」とあり、promptの中での位置が結果に影響する点はふつうの単語と同じです。
ComfyUIでEmbeddingを読み込むには
配置先はComfyUI/models/embeddingsです。LoRAと違って専用のLoaderノードがなく、読み込みはprompt側で行うため、一覧に出るかどうかを目で確認する場所がLoad LoRAほど分かりやすくありません。次の順で確認します。
- 配布元でbase model(SD1.5 / SDXL など)、license、fileのhashを確認する
- fileを
ComfyUI/models/embeddingsに保存する(拡張子は配布元のまま) - 起動中なら
Rキー、またはメニューの「Refresh node definitions」で定義を再読み込みする(現行UI・2026年8月時点) - CLIP Text Encodeのprompt欄に
embedding:と入力し、候補にfile名が出るか確認する
候補の表示はfrontendの機能で、版によって挙動が変わります。候補が出なくても、file名が正しければembedding:ファイル名の記述自体は有効です。候補が出ないときは、後述の「効かないとき」の手順でfile名と配置先を先に疑ってください。
実行はいつもどおりCtrl + Enter(macOSはCmd + Enter)のQueue promptです。読み込みに失敗した場合、promptの中のembedding:は通常の文字列として解釈され、エラーにならないまま無視されることがあります。「エラーが出ないから効いている」とは判断できない点を覚えておいてください。
Prompt内での呼び出し方
公式READMEと例示ページで確認した記法は次のとおりです。
embedding:SDA768.pt
embedding:SDA768
(embedding:SDA768:1.2)
- 拡張子
.ptは省略できます - 重みは通常のprompt強調と同じ
(…:1.2)の形で指定します - Positive側でもNegative側でも同じ記法です
subfolderに分けて置いた場合は、embedding:subfolder/ファイル名のようにpathを含めて書く必要があります。階層ごと認識されるかは環境によるため、最初はembeddings直下に置いて動作を確かめ、あとから整理するほうが切り分けしやすくなります。
書く位置にも意味があり、公式例のred embedding:catのように修飾語の後ろに置くと「赤い(Embeddingの)猫」として解釈されます。人物や画風のEmbeddingなら主語の位置、品質系なら文末など、ふつうの単語を置く場所と同じ感覚で扱います。
LoRAと何が違うのか
Embeddingは「言葉を増やす」、LoRAは「描き方を補正する」です。同じ「追加学習の成果物」でも、手を入れる層が違います。
| 項目 | Embedding(Textual Inversion) | LoRA |
|---|---|---|
| 適用先 | Text Encoder(CLIP)の語彙 | MODELとCLIPの重み(Load LoRAで両方に適用) |
| fileと配置先 | 数KB〜数百KB、models/embeddings |
数MB〜数百MB、models/loras |
| 読み込み方 | promptにembedding:名前 |
Load LoRAノードを配線 |
| 強度調整 | prompt強調(…:1.2)のみ |
strength_modelとstrength_clipを別々に |
| 学習対象 | 単語ベクトル(modelの表現力の範囲内) | modelの内部表現(新しい画風・形状も学習可) |
| 得意なこと | 指名しにくい概念・人物・品質傾向に名前を付ける | 画風・キャラクター・衣装など表現そのものを変える |
判断の目安は「modelが元々描けるか」です。すでに描ける要素を呼び出しやすくしたいならEmbedding、描けない要素を足したいならLoRAが候補になります。両方を同時に使うこともできますが、効果の切り分けが難しくなるため、最初は片方ずつ確認するのが安全です。複数のLoRAを重ねるときの考え方はComfyUIで複数LoRAを使う方法に分けています。
Negative Embeddingは万能の品質改善ではない
Negative promptに入れる前提で配布される「悪い手」「低品質」をまとめたEmbeddingがあります。手軽なので常用されがちですが、Text Encoderに「避ける概念」を1語で大量に渡す仕組みなので、狙った欠点以外も一緒に遠ざけます。
期待できること
- 長いNegative promptを1語で置き換えられる
- 学習元と近いmodelでは崩れやすい部位の改善が見込める
起こりうる副作用
- 画風が学習元の傾向に引き寄せられ、狙いのLoRAと喧嘩する
- 色味・コントラストが一律に変わる
- base modelが違うと効かないどころか破綻を増やす
効果量は配布元の主張ではなく、自分のmodelとpromptで同一seedの有無比較をして決めてください。「入れると良くなる」という一般論は、学習元と同じ系統のmodelでしか成り立ちません。
同一seedでEmbeddingの有無を比較する
比較はEmbeddingだけを変数にします。seedの固定方法とcontrol_after_generateの扱いはComfyUIでSeedを固定する方法を参照してください。
固定するもの
- checkpoint・VAE
- prompt本文・negative prompt本文
- seed(control_after_generate は fixed)
- sampler・scheduler・steps・CFG
- width・height
- LoRA・ControlNet は外す
変えるもの
- embedding:名前 の有無(または重みだけ)
| 条件 | 狙った部位の変化 | 狙っていない変化(色・画風・構図) | 破綻 | 判定 |
|---|---|---|---|---|
| なし(基準) | — | — | 基準 | |
| あり(重み1.0) | ||||
| あり(重み0.7) | ||||
| あり(重み1.3) |
見るのは「狙った部位が変わったか」より先に「狙っていない部分がどれだけ動いたか」です。同一seedで初期ノイズが同じでも、Text Encoderの出力が変われば生成経路が変わるため、構図が大きく動くこと自体は異常ではありません。構図が動きすぎて比較にならないときは重みを下げ、それでも差が見えないならbase互換性を疑います。
効かないときの確認順
確認は互換性から始めます。Embeddingはエラーを出さずに無視されることがあるため、配線やfile名より前にbase modelを疑うほうが早く原因にたどり着けます。
- base modelの系統が一致しているか。SD1.5用のEmbeddingはText Encoderの次元が違うSDXLでは使えません。SDXLはText Encoderを2つ持つため、SDXL用として配布されたfileだけが対象です。FLUXなどCLIP以外のText Encoderを主に使うmodelでは、従来のEmbeddingがそのまま効くとは限らないため、配布元の対応modelを確認してください。
- 配置先が
models/embeddingsか。extra_model_pathsで別pathを指定している場合はそちらも確認します。 - file名の綴りとpathが一致しているか。空白や全角文字を含むfile名は改名してから試します。
- 再読み込みしたか。
Rキーで定義を更新し、それでも候補に出なければ再起動します。 - 書いた場所が正しいText Encodeか。Load LoRAを挟んでいる場合、CLIPがLoRA適用後のものかも確認します。
- 重みが極端でないか。重みを極端に下げると変化が見えにくく、極端に上げると破綻が先に出やすくなります。1.0を基準に上下して比較します。
- 他の要素と干渉していないか。LoRA・ControlNet・長いNegative promptを外し、Embeddingだけの状態で比較し直します。
コンソールにembeddingを含む警告が出ていれば、読み込み失敗の直接の手がかりになります。ログの文言は版で変わるため、file名が含まれる行を探してください。
よくある質問
Embeddingに専用ノードはありますか?
標準ノードにはありません。CLIP Text Encodeのprompt欄にembedding:名前と書くのが公式の方法です。custom nodeで一覧表示を補助するものはありますが、記法自体は変わりません。
.ptと.safetensorsのどちらを使うべきですか?
配布元が提供する形式をそのまま使います。.ptはPythonのpickle形式で任意コードを含められるため、出所が不明なfileは避け、hashを配布元と照合してから置いてください。
LoRAとEmbeddingを同じ概念で両方使う意味はありますか?
作者が「LoRAと対になるEmbedding」として配布している場合は意味があります。そうでない組み合わせは、どちらが効いたか分からなくなるため、片方ずつ同一seedで確認してから重ねてください。
まとめ
Embeddingはmodels/embeddingsに置き、promptにembedding:名前と書けば使えます。足されるのはText Encoderの語彙だけで、modelの描き方を変えるLoRAとは役割が違います。効かないときは配線より先にbase modelの系統を確認し、Negative Embeddingも含めて同一seedの有無比較で自分の環境での効果を確かめてください。