프롬프트를 열 번 고쳐 써도 원하는 그림이 안 나오는 상황은 이미지 생성을 붙여 본 사람이면 다 겪는다. 이때 대부분 프롬프트를 계속 고친다. 형용사를 더하고, 콤마를 옮기고, "highly detailed"를 붙인다. 그런데 프롬프트는 손잡이 하나일 뿐이고, 종종 가장 무딘 손잡이다.
이 글은 프롬프트 말고 무엇이 있는지, 그리고 원하는 것이 안 나올 때 어떤 순서로 만져야 하는지를 정리한다. 확산 모델과 Stable Diffusion은 앞의 글이 다뤘으니, 여기서는 다이얼을 돌리는 쪽에 집중한다.
손잡이는 네 층에 나뉘어 있다
생성 한 번이 일어나는 과정을 아주 줄이면 이렇다. 시드에서 잠재 노이즈를 만들고, 그 노이즈를 정해진 횟수만큼 깎아 나가고, 마지막에 이미지로 디코드한다. 손잡이는 이 흐름의 서로 다른 자리에 끼어든다.
층마다 성격이 다르다. 왼쪽은 거칠고 싸다. 오른쪽은 정밀하고 비싸다. 원하는 것이 안 나올 때 오른쪽부터 손대는 것이 가장 흔한 시간 낭비다 — LoRA를 학습시키기 전에 네거티브 프롬프트 한 줄로 끝나는 경우가 많다.
시드를 고정하지 않으면 아무것도 알 수 없다
가장 먼저 할 일은 실험을 가능하게 만드는 것이다. 시드는 잠재 노이즈를 정하는 난수 씨앗이고, 시드가 다르면 다른 모든 값이 같아도 그림이 통째로 달라진다.
시드를 안 고정한 채로 CFG를 7에서 9로 바꾸고 "좋아졌다"고 판단하는 것은 아무 근거가 없다. 그림이 달라진 이유가 CFG인지 시드인지 구별할 방법이 없기 때문이다.
import torch
gen = torch.Generator(device="cuda").manual_seed(20260905)
image = pipe(
prompt=prompt,
generator=gen, # 같은 시드 → 같은 출발 노이즈
guidance_scale=7.5,
num_inference_steps=30,
).images[0]
여기서 주의할 점이 하나 있다. 같은 시드가 같은 그림을 보장하는 것은 같은 환경 안에서다. GPU 종류, 라이브러리 버전, 정밀도(fp16/fp32), 배치 크기가 달라지면 부동소수점 연산 순서가 바뀌어 결과가 미묘하게 달라진다. 팀 안에서 결과를 주고받으려면 시드뿐 아니라 모델 체크포인트 해시와 파이프라인 버전까지 함께 기록해 둔다.
실험할 때 쓰는 방법은 시드 여러 개를 고정해 두고 격자로 보는 것이다. 시드 넷을 정해 놓고 손잡이 하나를 세 값으로 바꾸면 그림 열두 장이 나온다. 이 격자를 보면 "이 설정이 나은가"와 "이 시드가 운이 좋았나"를 구별할 수 있다.
CFG와 steps가 실제로 하는 일
CFG(classifier-free guidance) scale은 프롬프트를 따르는 방향으로 얼마나 세게 밀지를 정하는 값이다. 모델은 매 단계에서 프롬프트를 준 예측과 안 준 예측을 둘 다 만들고, 그 차이를 CFG 배만큼 증폭해 더한다.
이면 프롬프트를 준 예측 그대로이고, 가 커질수록 "프롬프트 방향"이 과장된다. 그래서 프롬프트를 안 따르는 것 같으면 CFG를 올리고 싶어지는데, 여기가 함정이다.
증폭이 지나치면 값이 정상 범위를 벗어나면서 색이 타고 윤곽이 뭉개진다. 채도가 비현실적으로 올라가고 대비가 극단으로 가는 그 특유의 모습이다. 프롬프트를 더 잘 따르는 게 아니라 그림이 망가지는 것이다.
steps는 노이즈를 몇 번에 나눠 깎을지다. 적으면 덜 정리된 그림이 나오고, 늘리면 좋아지다가 어느 지점부터 평평해진다. 대부분의 샘플러에서 그 지점은 25~40 사이이고, 100으로 올려도 시간만 네 배 든다. 샘플러는 그 깎는 방식이다 — 같은 steps에서도 샘플러마다 결과와 수렴 속도가 다르고, 적은 steps에서 잘 도는 것과 많은 steps에서 좋아지는 것이 갈린다.
여기서 중요한 것은 셋이 서로 얽혀 있다는 사실이다. 샘플러를 바꾸면 알맞은 CFG 구간이 옮겨 가고, steps를 줄이면 CFG를 낮춰야 하는 경우가 많다. 그리고 증류로 단계를 크게 줄인 빠른 모델들은 CFG 12에서 가장 좋다 — 일반 모델의 78을 그대로 쓰면 결과가 무너진다. 새 모델을 쓸 때는 그 모델의 권장 구간을 먼저 확인한다.
네거티브 프롬프트는 CFG와 한 몸이다
네거티브 프롬프트는 "이것을 피하라"고 주는 텍스트다. 위 수식의 자리에 빈 텍스트 대신 네거티브 프롬프트의 예측을 넣는 방식으로 동작한다. 그러니까 결과는 "네거티브에서 멀어지는 방향"으로 밀린다.
이 구조에서 두 가지가 따라 나온다. 첫째, CFG가 1이면 네거티브 프롬프트가 아무 일도 안 한다. 차이 항에 곱해지는 값이 0이 되기 때문이다. 둘째, 네거티브에 너무 많은 것을 적으면 방향이 흐려진다. 스무 개를 나열하는 것보다 실제로 나오고 있는 문제 두세 개를 적는 편이 낫다.
형태를 고정해야 할 때 — 조건을 밖에서 준다
프롬프트로는 "어떤 것"을 말할 수 있지만 "정확히 이 자세, 이 구도"는 말할 수 없다. 이때 그림 밖에서 조건을 준다.
| 도구 | 고정하는 것 | 쓰는 자리 |
|---|---|---|
| ControlNet (포즈·깊이·엣지) | 형태와 구도 | 같은 자세로 옷만 바꾸기, 스케치를 그림으로 |
| 인페인팅 마스크 | 바꿀 영역 | 배경은 그대로 두고 물체만 교체 |
| 이미지-투-이미지 (denoise 강도) | 원본과의 거리 | 스타일만 바꾸기, 해상도 올리기 |
| 참조 이미지 어댑터 | 스타일·인물의 정체성 | 같은 사람·같은 화풍 유지 |
| 지역별 프롬프트 | 어느 영역에 무엇을 | 왼쪽은 숲, 오른쪽은 도시 |
확산 모델 제어와 편집은 앞의 글이 자세히 다뤘으므로 여기서는 고르는 기준만 적는다. 바꾸지 말아야 할 것이 무엇인지로 고른다. 자세를 지켜야 하면 ControlNet, 영역을 지켜야 하면 마스크, 원본 그림의 배치를 대충 지켜야 하면 이미지-투-이미지, 인물의 얼굴을 지켜야 하면 참조 어댑터다.
이 도구들에도 강도 조절이 있다. ControlNet의 conditioning scale, 이미지-투-이미지의 denoise 강도가 그것이다. 강도를 1에 가깝게 올리면 조건을 그대로 베끼고, 낮추면 프롬프트가 이긴다. 스케치가 그대로 남아 그림이 뻣뻣하다면 이 값을 내리는 것이 첫 수다.
LoRA까지 가는 기준
앞의 세 층으로 안 되면 마지막이 모델 가중치를 옮기는 것이다. 대개 LoRA를 쓴다 — 모델 전체를 다시 학습하지 않고 작은 저차원 행렬만 얹어 특정 화풍이나 특정 인물·제품 쪽으로 모델을 기울이는 방법이다.
여기까지 가야 하는 경우는 실제로 정해져 있다.
- 모델이 모르는 대상을 그려야 할 때. 우리 회사 제품, 특정 인물, 사내 캐릭터처럼 학습 데이터에 없던 것
- 말로 설명이 안 되는 화풍을 반복해서 써야 할 때. "우리 브랜드 일러스트 톤"은 프롬프트 스무 줄로도 안 잡힌다
- 같은 조건을 수천 장에 걸쳐 일관되게 유지해야 할 때
반대로 여기까지 안 가도 되는 경우가 훨씬 많다. 한두 장만 필요하다면 인페인팅으로 고쳐 쓰는 편이 빠르고, 화풍이 널리 알려진 것이면 프롬프트로 충분하며, 형태 문제라면 ControlNet이 답이다. LoRA는 데이터 20~50장을 모으고 학습을 돌리고 강도를 다시 튜닝하는 일이므로, 그 비용을 낼 이유가 분명할 때만 간다.
한 번에 하나만 바꾼다
마지막은 방법론이다. 손잡이가 이렇게 많으면 두세 개를 동시에 바꾸고 싶어지는데, 그러면 무엇이 효과가 있었는지 영영 모른다. 실무에서 쓰는 순서는 대개 이렇다.
- 시드 넷을 고정한다. 이후 모든 비교는 이 시드들 위에서 한다
- 프롬프트와 네거티브를 먼저 손본다. 가장 싸고, 여기서 끝나는 일이 많다
- CFG를 세 값으로 훑는다. 낮은 쪽도 반드시 넣는다 — 대개 올리는 것보다 내리는 것이 효과가 있다
- steps와 샘플러를 본다. 품질이 아니라 속도 문제일 때가 많다
- 형태가 문제면 조건을 밖에서 준다. ControlNet·마스크·참조 이미지
- 그래도 안 되면 LoRA를 고려한다
그리고 바꿀 때마다 설정을 그림과 함께 남긴다. 프롬프트, 네거티브, 시드, CFG, steps, 샘플러, 모델 해시를 이미지 메타데이터나 옆의 JSON에 적어 두면 두 주 뒤에 "그때 그 설정"을 다시 찾을 수 있다. 이걸 안 해서 마음에 드는 그림을 다시 못 만드는 일이 정말 흔하다.
정리
- 손잡이는 네 층이다 — 프롬프트, 샘플링(CFG·steps·샘플러), 밖에서 주는 조건, 모델 가중치
- 왼쪽부터 만진다. LoRA를 학습시키기 전에 네거티브 한 줄로 끝나는 일이 많다
- 시드를 고정하지 않으면 어떤 비교도 근거가 없다. 시드 넷을 두고 격자로 본다
- CFG는 올릴수록 잘 따르는 값이 아니다. 지나치면 색이 타고 뭉개지며, 모델마다 구간이 다르다
- 네거티브 프롬프트는 CFG가 1이면 아무 일도 안 한다. 그리고 짧을수록 방향이 선명하다
- 형태·영역·정체성을 지켜야 하면 조건을 밖에서 준다. 무엇을 바꾸지 말아야 하는지로 도구를 고른다
- LoRA는 모델이 모르는 대상, 말로 안 되는 화풍, 대량 일관성 — 이 셋일 때만 간다
- 설정을 그림과 함께 남긴다. 안 남기면 다시 못 만든다
읽어주셔서 감사합니다. 😊

