홈 · 시작하기 · 이전: 워크플로우 이해하기 · 다음: 첫 워크플로우 만들기
프롬프트와 CLIP 이해하기¶
사람이 작성한 문장이 어떻게 조건으로 바뀌어 KSampler에 전달되는지 이해합니다.
이 장에서 배우는 것¶
- CLIP이 프롬프트를
CONDITIONING으로 바꾸는 과정 - Positive와 Negative를 나누어 사용하는 법
- 결과가 흔들리지 않는 프롬프트 작성 구조
- FLUX.1에서 텍스트 인코더 구성이 달라지는 지점
CLIP이 하는 일¶
CLIP은 사람이 작성한 문장을 모델이 계산에 사용하는 숫자 벡터로 바꿉니다.
%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 55, "rankSpacing": 70, "padding": 12}, "themeVariables": {"fontSize": "14px"}} }%%
graph LR
A["사람이 작성한 프롬프트<br/>빨간 사과, 사실적"] --> B["CLIP Text Encode"]
B --> C["숫자 벡터<br/>0.8, −0.3, 0.5, …"]
C -->|CONDITIONING| D[KSampler]
사람이 읽는 글자를 모델이 다룰 수 있는 숫자로 바꾸는 단계입니다. 이렇게 바뀐 형태를 CONDITIONING이라고 부릅니다.
Positive와 Negative¶
| 구분 | 역할 | 예시 | 효과 |
|---|---|---|---|
| Positive | 원하는 것 | a cat, blue sky, high quality |
이런 요소를 이미지에 포함 |
| Negative | 원하지 않는 것 | blurry, low quality, distorted |
이런 요소를 이미지에서 제거 |
ComfyUI 연결 구조¶
Load Checkpoint의 CLIP 출력 하나를 두 노드에 모두 연결합니다. 출력 포트 하나에서 선을 여러 개 뽑을 수 있습니다.
%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 55, "rankSpacing": 70, "padding": 12}, "themeVariables": {"fontSize": "14px"}} }%%
graph LR
LC[Load Checkpoint] -->|CLIP| P["CLIP Text Encode<br/>Positive: 원하는 것"]
LC -->|CLIP| N["CLIP Text Encode<br/>Negative: 피할 것"]
P -->|CONDITIONING| KS["KSampler<br/>positive"]
N -->|CONDITIONING| KS2["KSampler<br/>negative"]
두 노드는 같은 CLIP을 사용하지만 KSampler의 서로 다른 입력으로 들어갑니다. 바꿔 꽂으면 원하는 것과 피할 것이 뒤집힙니다.
프롬프트 작성¶
좋은 구조¶
[주제] + [스타일] + [품질] + [디테일]
예시:
a cute cat sitting on a window,
watercolor painting style,
high quality, detailed fur,
soft lighting, cozy atmosphere
피해야 하는 프롬프트¶
| 프롬프트 | 문제 |
|---|---|
cat |
주제만 있고 스타일·품질·디테일이 없어 결과가 실행마다 크게 흔들립니다 |
a very very very beautiful cat |
같은 단어를 반복해도 강조되지 않습니다. 강조는 가중치 문법 (beautiful:1.2)로 합니다 |
고양이, 예쁜 |
한국어는 인식되는 범위가 좁습니다 |
프롬프트 언어¶
CLIP은 영어 이미지-캡션 데이터로 학습됐기 때문에 영어 프롬프트를 가장 정확하게 해석합니다. 한국어·일본어는 인식되는 단어가 제한적이고, 같은 뜻이라도 결과가 크게 달라집니다. 프롬프트는 영어로 작성하세요.
Flux처럼 T5 계열 인코더를 함께 사용하는 모델은 긴 자연어 문장과 문맥을 비교적 잘 처리하지만, 이 경우에도 영어가 기준입니다.
Negative Prompt 예시¶
| 용도 | 넣을 단어 |
|---|---|
| 기본 | blurry, low quality, distorted, ugly, bad anatomy, extra limbs, watermark, text, signature |
| 사진 스타일 | cartoon, 3d render, illustration, painting, drawing |
| 일러스트 | photograph, realistic, photo |
한 변수 실험 — 프롬프트만 바꾸기¶
프롬프트를 고쳤을 때 무엇이 달라지는지 보려면 나머지를 고정해야 합니다. 아래를 고정합니다.
- 모델과 해상도
seed와control_after_generate=fixedsteps,cfg,sampler_name,scheduler
Positive만 세 번 바꿔 만듭니다.
| 실행 | Positive 프롬프트 | 관찰할 질문 |
|---|---|---|
| A | a cat |
스타일·구도가 실행마다 어디까지 흔들리는가 |
| B | a cute cat sitting on a window, watercolor painting style |
주제와 스타일을 적었을 때 무엇이 고정되는가 |
| C | B + high quality, detailed fur, soft lighting, cozy atmosphere |
품질·디테일 단어가 실제로 바꾼 것은 무엇인가 |
관찰 질문
C에서 추가한 단어 중 결과에 보이지 않는 것이 있나요? 프롬프트에 적었다고 모두 반영되지는 않습니다. 반영이 약한 단어는 가중치 문법으로 비중을 올려 다시 비교합니다.
FLUX.1의 텍스트 인코더¶
여기까지는 텍스트 인코더가 하나였습니다. FLUX.1은 CLIP-L과 T5xxl 두 개를 함께 사용합니다. T5는 CLIP이 아니고, DualCLIPLoader는 두 인코더를 한 번에 불러오는 ComfyUI 노드 이름입니다. CLIP-L은 시각적 연상을, T5xxl은 문맥과 뉘앙스를 맡습니다.
프롬프트를 작성하는 방식 자체는 같습니다. 달라지는 것은 로더 구성입니다.
필요 파일과 Dual CLIP Loader 설정 — Flux를 실제로 사용할 때
필요 파일
| 파일 | 크기 | 위치 |
|---|---|---|
clip_l.safetensors |
약 250MB | ComfyUI/models/text_encoders/ |
t5xxl_fp8_e4m3fn.safetensors |
약 5GB | ComfyUI/models/text_encoders/ |
Dual CLIP Loader 설정
clip_name1: t5xxl_fp8_e4m3fn.safetensorsclip_name2: clip_l.safetensorstype: flux
자세한 구성은 Flux 모델 가이드에 있습니다.
완료 기준¶
네 가지를 모두 만족했다면 이 장을 끝냈습니다.
- CLIP이 프롬프트를 무엇으로 바꾸는지 한 문장으로 말할 수 있다.
- Positive와 Negative가 KSampler의 서로 다른 입력으로 간다는 점을 설명할 수 있다.
- 주제·스타일·품질·디테일을 나누어 프롬프트를 작성했다.
- 같은 Seed에서 프롬프트만 바꿔 결과 차이를 확인했다.
다음 단계¶
- 첫 워크플로우 직접 만들기 — 참고 없이 구성하고 저장해 재현하기
- 프롬프트 가중치 — 특정 단어의 강도 조절
- CLIP과 Contrastive Learning — CLIP이 그렇게 작동하는 이유
홈 · 시작하기 · 이전: 워크플로우 이해하기 · 다음: 첫 워크플로우 만들기