CLIP

clip — модель, связывающая текст и картинки общим пространством

Раздел
Генеративные модели
Сокращ.
Contrastive Language-Image Pretraining
Обновлено
18.05.26

CLIP (Contrastive Language-Image Pretraining) — модель OpenAI 2021 года, которая учится одновременно понимать текст и картинки. Внутри две нейросети: image encoder превращает картинку в вектор, text encoder — текст. Обе обучены так, что эмбеддинги пары «фото + его подпись» лежат рядом в общем пространстве. В Stable Diffusion и SDXL используется только text encoder — он превращает промпт в вектор, который ведёт диффузию к нужному изображению.

Коротко

Коротко. CLIP — это пара нейросетей, которые научились говорить на одном языке: image encoder переводит картинку в вектор, text encoder — текст в вектор того же типа. Пара «фото и его описание» оказывается в пространстве рядом, неподходящие пары — далеко. В Stable Diffusion и SDXL используется только text encoder: он превращает промпт в вектор, который ведёт U-Net к нужной картинке.

Что это такое

Январь 2021-го. OpenAI выпускает CLIP. Идея простая, исполнение — нет. Модель учится на 400 миллионах пар «картинка + подпись», собранных в интернете. Никакой ручной разметки: подпись — это alt-текст изображения, заголовок поста, описание из stock-фото.

Обучение идёт через контрастную цель. В каждом батче берётся, скажем, 32 пары. Image encoder превращает 32 картинки в 32 вектора. Text encoder делает то же с 32 подписями. Модель учится так, чтобы:

  • Скалярное произведение «картинка_i × текст_i» (правильная пара) → максимально большое.
  • Скалярное произведение «картинка_i × текст_j» (неправильная пара, i ≠ j) → минимальное.

Получается пространство, в котором близость векторов означает «эта картинка про этот текст». Это первое работающее объединение зрения и языка в одной модели.

Через год Stability AI берёт text encoder CLIP, чтобы научить Stable Diffusion читать промпты. С тех пор CLIP — стандарт в open-source-диффузии:

  • SD 1.5 — один CLIP ViT-L (512-мерный эмбеддинг текста, 77 токенов максимум).
  • SDXL — два параллельно: CLIP ViT-L + OpenCLIP ViT-G. Эмбеддинги склеиваются (2048-мерный вектор).
  • SD 3 / 3.5 — два CLIP плюс T5-XXL для длинных промптов.
  • FLUX — отказался от CLIP в пользу одного T5-XXL.

Как это работает

Внутри обоих энкодеров — трансформер. Text encoder работает так же, как языковая модель, но обучен не предсказывать следующее слово, а выдавать «осмысленный» итоговый вектор.

Цикл в диффузии:

  1. Пользователь пишет промпт «cyberpunk city at dawn, neon reflections, cinematic».
  2. Токенизатор разбивает строку на 12–18 токенов.
  3. Text encoder CLIP превращает токены в 768-мерные эмбеддинги (для SD 1.5) или 2048-мерные (для SDXL).
  4. U-Net на каждом шаге диффузии получает эти эмбеддинги через cross-attention и «слушается» их, убирая шум в нужном направлении.

Важная техническая деталь: CLIP обрабатывает максимум 77 токенов (около 50–60 слов). Длинные промпты в Automatic1111 и ComfyUI разбиваются на куски и склеиваются — это «BREAK»-синтаксис.

Image encoder тоже используется — но реже. Для img2img и IP-Adapter, например, картинка-референс кодируется image encoder'ом, и её вектор подаётся как «промпт». Получается «промпт из картинки».

Пример на практике

Дизайнер пишет в Automatic1111 промпт: cinematic portrait of an old fisherman, golden hour, depth of field, anamorphic lens. 14 английских слов.

  1. Промпт токенизируется в 18 токенов (некоторые слова бьются: «cinematic» → 2 токена).
  2. CLIP ViT-L превращает их в 18 эмбеддингов по 768 чисел. Из них формируется матрица 77×768 (короткий промпт паддится до 77).
  3. Эта матрица подаётся в U-Net как cross-attention context.
  4. На каждом из 28 шагов U-Net «спрашивает» матрицу: «куда вести шум?» — и шумоподавление идёт в направлении старого рыбака с золотым часом.

Если он добавит ещё 20 слов («wearing a wool coat, weathered face, mist on the water, fishing boats in background, sunrise, depth of field, blurred background»), промпт уйдёт за 77 токенов. В A1111 модель разобьёт его на блоки и пропустит каждый через CLIP отдельно — это работает, но не идеально, длинные связки теряются.

В FLUX благодаря T5-XXL такой проблемы нет: модель читает до 512 токенов с тем же качеством.

С чем часто путают

  • CLIP и Stable Diffusion — CLIP это text encoder и image encoder, SD это диффузионная модель. SD использует CLIP, но это не одна модель.
  • CLIP и OpenCLIP — OpenCLIP это open-source реализация той же архитектуры от LAION. CLIP ViT-L — оригинал от OpenAI, OpenCLIP ViT-G — обученный сообществом на LAION-2B. В SDXL используются оба параллельно.
  • CLIP и T5 — оба text encoder, но архитектуры разные. T5 умеет читать длинные тексты (512+ токенов), CLIP ограничен 77. FLUX перешёл с CLIP на T5-XXL именно за длину контекста.
  • CLIP и VAE — VAE кодирует картинку в латент пикселей. CLIP image encoder кодирует картинку в семантический вектор. Разные пространства, разные задачи.

Частые ошибки и заблуждения

  • «CLIP понимает русский». Базовый CLIP — нет. Тренировался почти только на английском. Промпт на русском «работает», но с большой потерей качества. Для серьёзных задач переводите ключевые слова на английский.
  • «Длинный промпт = лучше результат». Не всегда. После 77 токенов CLIP начинает резать или паддить. На SDXL до 150 токенов разница минимальна, дальше всё «склейкой через BREAK». На FLUX длина не критична.
  • «CLIP знает все понятия в мире». Знает то, что встречалось в 400M парах из интернета 2020 года. Свежие термины, узкие домены, мемы после 2021-го — может пропустить или перепутать.
  • «Можно убрать CLIP из SD, чтобы ускорить». Нельзя — без текстового энкодера диффузия не знает, что генерировать. Можно квантизовать CLIP (FP8, GGUF) для экономии VRAM, и это часто делается.
  • «Эмбеддинги CLIP можно использовать для семантического поиска». Можно — и это очень популярно. Этот же CLIP лежит в основе многих систем «найди картинку по описанию» и обратно. Vector Database + CLIP — типичная пара.

Связанные термины

  • Stable Diffusion / SDXL — используют CLIP как text encoder.
  • OpenCLIP — open-source аналог, используется в SDXL.
  • T5-XXL — другой text encoder, на котором построен FLUX.
  • Cross-attention — механизм, через который U-Net «слушает» CLIP-эмбеддинги.
  • Token / Context Window — CLIP ограничен 77 токенами на проход.
  • Textual Inversion — техника обучить CLIP новому «слову» через маленькую тренировку.
  • Embedding — общее понятие, к которому относится результат CLIP.

Частые вопросы

Что значит «второй CLIP» в SDXL? В SDXL параллельно работают CLIP ViT-L и OpenCLIP ViT-G. Их эмбеддинги склеиваются. ViT-G даёт «глубокое» понимание промпта, ViT-L — «детальное». Они дополняют друг друга.

Можно ли обучить свой CLIP? Технически да. На практике стоимость огромная (нужны миллионы пар и сотни GPU-часов). Большинство сообщества использует готовые: OpenCLIP, метки LAION, ViT-варианты от Hugging Face.

Зачем CLIP заменили на T5 в FLUX? Длина контекста (CLIP — 77 токенов, T5-XXL — 512+) и качество чтения сложных промптов. T5 — это языковая модель в духе ранних LLM, она лучше «понимает» структуру предложения, чем CLIP.

Куда подключается CLIP в ComfyUI? Узел Load Checkpoint отдаёт три выхода: MODEL, CLIP, VAE. Выход CLIP подключается к двум узлам CLIP Text Encode (positive и negative). Выходы этих узлов идут в KSampler.

Сколько весит CLIP? CLIP ViT-L — ~250 МБ в FP16. OpenCLIP ViT-G — ~3.5 ГБ. T5-XXL (заменивший CLIP в FLUX) — около 9 ГБ. В FP8 / GGUF можно сжать ещё.

Как CLIP видит картинку с текстом? В SD ничего особенного: CLIP читает только промпт. Если на картинке есть надпись, image encoder увидит её как пиксели, а text encoder получит ваш промпт — две сущности параллельны. Поэтому SD до FLUX плохо рисовал текст.

Главное

CLIP — это переводчик между языком и картинками. Внутри Stable Diffusion и SDXL он отвечает за то, как промпт превращается в направление для U-Net. У него три ограничения: 77 токенов на проход, английский язык, знания до 2020 года. В FLUX от CLIP отказались в пользу T5-XXL, но в большинстве open-source моделей он по-прежнему стандарт. Знать его особенности — значит писать промпты, которые «работают», а не сражаются с моделью.