로컬 LLM으로 ComfyUI 완전 자동화: 프롬프트 생성부터 이미지 검수까지
로컬 LLM을 ComfyUI에 연동해 프롬프트 자동 생성부터 이미지 품질 검수까지 전체 워크플로우를 자동화하는 실전 가이드.
매번 ComfyUI에서 수동으로 프롬프트를 입력하고 이미지를 확인하는 작업이 반복되고 있다면, 로컬 LLM을 활용해 이 과정을 완전히 자동화할 수 있습니다. 직접 구축한 워크플로우를 공유합니다.
전체 워크플로우 구조
자동화 파이프라인은 크게 3단계로 구성됩니다:
- 프롬프트 생성 — 로컬 LLM이 주제/키워드를 받아 최적화된 프롬프트 작성
- 이미지 생성 — ComfyUI API를 통해 자동 생성
- 품질 검수 — LLM이 생성된 이미지를 분석하고 재생성 여부 결정
필요한 도구
- ComfyUI: 이미지 생성 엔진 (GitHub)
- Ollama: 로컬 LLM 실행 환경
- Python 3.10+: 자동화 스크립트
- Llama 3 또는 Mistral: 프롬프트 생성용 모델
1단계: ComfyUI API 활성화
ComfyUI를 API 모드로 실행합니다:
# ComfyUI 실행 (API 서버 포함)
python main.py --listen 0.0.0.0 --port 8188
API 엔드포인트 확인:
curl http://localhost:8188/system_stats
2단계: Ollama로 로컬 LLM 설정
# Ollama 설치 및 모델 다운로드
curl -fsSL https://ollama.ai/install.sh | sh
ollama pull llama3
ollama pull llava # 이미지 분석용 (멀티모달)
3단계: 프롬프트 자동 생성
import requests
import json
def generate_prompt(theme: str, style: str = "photorealistic") -> str:
"""로컬 LLM으로 ComfyUI 프롬프트 생성"""
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "llama3",
"prompt": f"""Create a detailed ComfyUI image generation prompt for: {theme}
Style: {style}
Include: subject, lighting, atmosphere, technical details
Format: comma-separated tags, English only
Output only the prompt, no explanation.""",
"stream": False
}
)
return response.json()["response"].strip()
# 사용 예시
prompt = generate_prompt("sunset over mountains", "cinematic")
print(prompt)
# 출력: golden hour sunset, mountain peaks, dramatic clouds,
# cinematic lighting, 8k resolution, sharp focus...
4단계: ComfyUI API로 이미지 생성
import websocket
import uuid
def generate_image(prompt: str, negative_prompt: str = "") -> str:
"""ComfyUI API를 통한 이미지 생성"""
workflow = {
"3": {
"class_type": "KSampler",
"inputs": {
"seed": random.randint(0, 99999999),
"steps": 20,
"cfg": 7,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["5", 0]
}
}
# ... 전체 워크플로우 JSON
}
client_id = str(uuid.uuid4())
response = requests.post(
f"http://localhost:8188/prompt",
json={"prompt": workflow, "client_id": client_id}
)
return response.json()["prompt_id"]
5단계: LLaVA로 이미지 품질 검수
생성된 이미지를 멀티모달 LLM으로 자동 검수합니다:
import base64
def review_image(image_path: str, original_prompt: str) -> dict:
"""LLaVA로 이미지 품질 검수"""
with open(image_path, "rb") as f:
image_data = base64.b64encode(f.read()).decode()
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "llava",
"prompt": f"Rate this image 1-10 for: {original_prompt}. Check quality, composition, and relevance. Reply with JSON: {{\"score\": X, \"issues\": [], \"regenerate\": true}}",
"images": [image_data],
"stream": False
}
)
return json.loads(response.json()["response"])
전체 자동화 파이프라인
def auto_generate(theme: str, max_attempts: int = 3) -> str:
for attempt in range(max_attempts):
# 1. 프롬프트 생성
prompt = generate_prompt(theme)
# 2. 이미지 생성
prompt_id = generate_image(prompt)
image_path = wait_for_image(prompt_id)
# 3. 품질 검수
review = review_image(image_path, theme)
if review["score"] >= 7 and not review["regenerate"]:
return image_path
print(f"재생성 중... (시도 {attempt + 1}/{max_attempts})")
return image_path # 최대 시도 후 마지막 이미지 반환
실제 사용 결과
이 파이프라인을 2주간 사용한 결과:
- 프롬프트 작성 시간 90% 절감
- 이미지 품질 합격률 1회 시도에 70% 달성
- 전체 워크플로우 자동화로 배치 처리 가능
마치며
처음 설정이 복잡하지만 한번 구축하면 이미지 생성 작업이 완전히 달라집니다. 특히 대량의 이미지를 일관된 스타일로 생성해야 할 때 진가를 발휘합니다. 코드 전체는 GitHub에 공개할 예정입니다.
이 글을 한 마디로 표현하면?
댓글