부정 프롬프트의 역할과 원리
Stable Diffusion과 같은 확산 모델(Diffusion Model)은 학습 데이터의 통계적 분포에 기반하여 이미지를 생성합니다. 이 과정에서 사용자의 의도와 무관하게 왜곡된 손, 잘못된 신체 비율, 워터마크 등 원치 않는 요소가 포함될 가능성이 높습니다. 이를 보정하기 위한 핵심 메커니즘이 바로 부정 프롬프트(Negative Prompt)입니다.
부정 프롬프트는 단순히 이미지에서 무언가를 지우는 기능이 아닙니다. 이는 무분류자 가이던스(Classifier-Free Guidance, CFG) 알고리즘의 핵심 구성 요소로, 잠재 공간(Latent Space) 내에서 확률 분포를 조정하여 특정 특성이 나타날 확률을 억제하는 역할을 수행합니다.
CFG의 수학적 원리는 다음과 같이 요약할 수 있습니다.
$$ \epsilon_{\text{final}} = \epsilon_{\text{neg}} + s \cdot (\epsilon_{\text{pos}} - \epsilon_{\text{neg}}) $$
여기서 $\epsilon$은 노이즈 예측값을 의미하며, 각 변수의 의미는 다음과 같습니다.
$\epsilon_{\text{pos}}$: 긍정 프롬프트(Positive Prompt)를 조건으로 한 노이즈 예측$\epsilon_{\text{neg}}$: 부정 프롬프트(Negative Prompt)를 조건으로 한 노이즈 예측$s$: CFG Scale (가이던스 강도)
결과적으로 모델은 긍정 조건 방향으로 이동하되, 부정 조건에 해당하는 방향은 회피하는 벡터를 따라 디노이징(Denoising)을 수행하게 됩니다. CFG Scale 값이 높을수록 이러한 회피 효과가 강해지지만, 과도한 설정은 이미지의 자연스러움을 해칠 수 있으므로 적절한 수치(보통 7~10 사이)를 찾는 것이 중요합니다.
ComfyUI 노드 구성 및 데이터 흐름
ComfyUI에서 부정 프롬프트는 독립적인 노드로 구현되며, 데이터 흐름 그래프 상에서 명확하게 제어될 수 있습니다.
일반적인 워크플로우에서 부정 프롬프트 노드(CLIPTextEncode)의 출력은 KSampler 노드의 negative 입력 슬롯에 연결됩니다. 이때 긍정 프롬프트 노드와 동일한 CLIP 모델 인스턴스를 입력받아야 잠재 공간의 인코딩 일관성이 유지됩니다.
다음은 부정 프롬프트 적용을 위한 노드 구성 예시입니다.
{
"node_id": "neg_prompt_encoder",
"type": "CLIPTextEncode",
"inputs": {
"clip": ["4", "1"],
"text": "distorted anatomy, extra limbs, blurry, watermark, low quality"
},
"widgets_values": [
"distorted anatomy, extra limbs, blurry, watermark, low quality"
]
}
이 구성에서 text 필드에 입력된 키워드들은 모델이 생성 과정에서 배제해야 할 특징 벡터로 인코딩됩니다.
CFG 로직의 의사 코드 구현
부정 프롬프트가 샘플링 과정에 미치는 영향을 코드 레벨에서 이해하면 튜닝이 수월해집니다. 아래는 CFG 로직을 단순화한 Python 의사 코드입니다.
def apply_cfg_guidance(model, latent, timestep, pos_cond, neg_cond, strength=7.5):
# 긍정 및 부정 조건에 대한 노이즈 예측
noise_pos = model.predict_noise(latent, timestep, pos_cond)
noise_neg = model.predict_noise(latent, timestep, neg_cond)
# 부정 조건을 회피하고 긍정 조건을 향하도록 보정
guided_noise = noise_neg + strength * (noise_pos - noise_neg)
return guided_noise
이 코드는 부정 프롬프트의 효과가 단순한 삭제가 아니라, 노이즈 예측 벡터의 방향성을 조절하는 '힘(Vector)'으로 작용함을 보여줍니다.
효과적인 부정 프롬프트 작성 전략
무작정 많은 키워드를 나열하는 것은 오히려 모델의 혼란을 유발할 수 있습니다. 목적에 맞게 계층적으로 구성하는 것이 효율적입니다.
1. 계층적 키워드 구성
- 기본 품질 제어:
lowres, bad anatomy, cropped, text, error - 영역 특화 필터링:
watermark, signature, username, logo - 문맥 의존적 제거:
crowd, vehicles, plants(배경 단순화 필요 시)
2. 검증된 주요 키워드
다음은 실제 사용자들에게 검증된 효과적인 부정 키워드 카테고리입니다.
- 신체 비정상:
deformed hands, extra fingers, missing fingers, bad anatomy, fused fingers - 이미지 품질:
blurry, out of focus, pixelated, jpeg artifacts, grainy - 구도 방해:
border, frame, watermark, text, logo
주의사항: CLIP 모델은 주로 영문 데이터셋으로 학습되므로, 부정 프롬프트 역시 영문 키워드를 사용해야 정확한 의미 전달이 가능합니다.
문제 해결 및 트러블슈팅
문제: 여전히 깨진 손이 생성됨
부정 프롬프트만으로 해결되지 않는 경우, CFG Scale을 점진적으로 높여(예: 9~12) 가이던스 강도를 강화해야 합니다. 또한 badhandv4와 같은 전용 부정 임베딩(Negative Embedding) 모델을 활용하거나, InpaintModel을 통해 후보정하는 방식이 필요할 수 있습니다.
문제: 이미지가 과도하게 어둡거나 디테일 손실 발생
worst quality, bad와 같이 지나치게 포괄적인 부정 키워드는 모델의 표현력 자체를 제한하여 결과물을 칙칙하게 만들 수 있습니다. 이 경우 구체적이고 한정적인 키워드로 교체하고, 긍정 프롬프트에 highly detailed, sharp focus 등을 추가하여 균형을 맞춰야 합니다.
문제: 부정 프롬프트가 작동하지 않음
노드 연결 상태를 확인해야 합니다. 흔히 발생하는 실수는 다음과 같습니다.
KSampler의negative포트가 아닌 다른 곳에 연결된 경우- 긍정/부정 노드가 서로 다른 Checkpoint나 CLIP 모델을 참조하는 경우
- 입력 텍스트 없이 빈 문자열이 할당된 경우 (빈 문자열도 하나의 조건으로 작용할 수 있음)
프로덕션 레벨의 워크플로우 관리
반복적인 작업에서는 부정 프롬프트 구성을 모듈화하여 관리하는 것이 유리합니다. ComfyUI의 Group Node나 Subgraph 기능을 활용하여, 자주 사용되는 부정 프롬프트 세트(예: 인물화 전용, 제품 사진 전용)를 하나의 패키지로 묶어 재사용할 수 있습니다.
또한, JSON 형태로 저장되는 워크플로우 파일은 Git 등을 통한 버전 관리가 용이합니다. 이를 통해 특정 부정 프롬프트 조합이 결과물에 미친 영향을 히스토리로 추적하고 A/B 테스트를 수행할 수 있습니다.
API 연동을 통해 외부 시스템에서 동적으로 부정 프롬프트를 주입할 수도 있습니다. 예를 들어, 사용자 입력에 욕설이나 민감한 단어가 포함되었는지 감지하여 실시간으로 부정 프롬프트 리스트에 추가하는 안전 장치(safety filter)를 구축할 수도 있습니다.