GLM-5를 활용한 AI 이미지 및 비디오 프롬프트 오케스트레이션
WaveSpeed에서 GLM-5를 추론 레이어로 활용하여 이미지 및 비디오 모델의 프롬프트를 생성, 정제, 연결하는 방법을 알아보세요.
안녕하세요, 저는 Dora입니다. 저는 막연한 아이디어, “린넨 테이블 위의 차분한 세라믹 머그잔, 아침 햇살”을 짧은 제품 영상으로 만들려고 했습니다. 머릿속으로는 비주얼이 명확했지만, 프롬프트는 그렇지 않았습니다. 이미지, 영상, 업스케일링 도구 사이를 오가며 모든 것을 바꿔버리는 사소한 문구들을 계속 수정했습니다. 마치 조각들을 이어 붙이며 작업하는 느낌이었습니다.
저는 GLM-5를 그 혼란의 한가운데에 끼워 넣어 보기로 했습니다. 주인공이 아니라, 화이트보드 앞에 선 조력자로서요. 목표는 간단했습니다: GLM-5를 이미지와 영상 모델을 위한 프롬프트 오케스트레이터로 활용하는 것이었습니다. 제가 메모에 계속 적어둔 문구는 “GLM-5 이미지 영상 프롬프트”였는데, 그게 바로 역할이기 때문입니다: 일반적인 설명을 받아, 하위 모델들이 잘 이해하는 프롬프트로 안정적으로 변환하는 것입니다.
이미지/영상 파이프라인에서 강력한 LLM이 중요한 이유
하나의 모델이 모든 것을 처리할 필요는 없습니다. 하나의 모델이 매번 동일한 방식으로 명확하게 말해주는 것이 필요합니다. 그것이 비주얼 파이프라인의 성패를 가릅니다.
이미지와 영상에서는 작은 단어 하나가 결과물에 큰 영향을 미칩니다. 카메라 거리, 초점 거리, 재질 형용사, 심지어 등장 순서까지도요. “확산된 역광”을 끝에 추가했다가 전체 분위기가 바뀌는 것을 경험해 보셨다면, 그 느낌을 아실 겁니다.
저는 예전에 각 도구마다 프롬프트를 직접 작성했습니다: FLUX용 하나, WAN용 하나, 업스케일러용 하나. 효과는 있었지만 확장이 안 됐고, 집중력을 소모했습니다. 중간에 강력한 LLM을 두면 세 가지를 해결해줍니다:
- 언어 표준화: 비공식적인 브리프를 각 모델이 이해하는 스키마로 변환합니다.
- 가이드라인 설정: 스타일과 기술적 사양을 제한하여 변형이 흔들리지 않게 합니다.
- 기억 유지: 모든 도구에 걸쳐 선택 사항(카메라, 팔레트, 제품 메모)을 다시 입력하지 않아도 유지합니다.
이것은 타이핑 시간을 절약하는 문제가 아닙니다. 작업 세션을 갉아먹는 소소한 판단들을 절약하는 문제입니다. GLM-5가 구조를 안정적으로 유지해줄 때, 무엇이 바뀌었고 왜 바뀌었는지를 명확하게 파악할 수 있습니다.
프롬프트 오케스트레이터로서의 GLM-5
저는 기능을 찾아다닌 것이 아닙니다. 그냥 물었습니다: GLM-5가 제 평범한 설명을 받아 적절한 모델에 맞게 형태를 잡고, 모든 단계에 걸쳐 모든 것을 추적할 수 있을까? 실제로 이렇게 진행됐습니다.
자연어 설명에서 FLUX 프롬프트 생성
첫 번째 시도: GLM-5에 짧은 평문 영어 브리프를 입력하고 명확한 필드가 포함된 FLUX 준비 프롬프트를 요청했습니다. 피사체, 카메라, 조명, 재질, 배경, 색상 제약, 네거티브 등. FLUX 모델 노트와 몇 가지 공개 프롬프트 가이드에서 구조를 가져와 의도적으로 단조롭게 만들었습니다. 단조로움이 곧 재현 가능성입니다.
작은 놀라움: GLM-5는 누락된 세부 사항을 조용히 추론하는 데 능숙했습니다(예: 제가 초점 거리를 선택하는 것을 잊었을 때 50mm 동급 렌즈를 추가하는 것). 제가 가정한 내용에 레이블을 달아서 수락하거나 거부할 수 있도록 요청했습니다. 그 덕분에 몇 번의 왕복이 줄었습니다.
순조롭지 않았던 점: GLM-5는 때때로 제가 원하지 않는 화려한 형용사로 기본 설정되었습니다(“신비로운,” “멋진”). “구체적이고, 사진 우선 언어만”이라는 규칙을 추가했더니 불필요한 수식어가 줄었습니다.
체인: GLM-5 프롬프트 → WAN 2.5 영상 → 업스케일
이미지 프롬프트가 안정되자, GLM-5에게 WAN 2.5용 영상 프롬프트로 번역하도록 했습니다. 매핑이 1:1은 아니었습니다. 영상에는 이미지 프롬프트가 무시하는 움직임, 타이밍, 제약이 필요합니다. WAN 문서에서 간단한 템플릿을 가져와 GLM-5에게 채우도록 요청했습니다: 동작 비트, 카메라 움직임(또는 없음), 지속 시간, 피사체 동작, 첫 프레임이 이미지 렌더와 일치할 수 있도록 하는 연속성 메모.
두 가지 현장 메모:
- GLM-5가 기본적으로 카메라 움직임을 추가하도록 하면, WAN 2.5가 씬을 과도하게 애니메이션화하는 경우가 있었습니다. 움직임을 한 축으로 고정하거나 정적으로 유지하면 더 깔끔한 루프가 나왔습니다.
- 이미지와 영상 사이의 색온도 일치가 예상보다 훨씬 중요했습니다. GLM-5에게 단계별로 숫자 화이트 밸런스 목표값(예: 5200K)을 유지하도록 했습니다.
업스케일링의 경우, 단조롭고 결정론적으로 유지했습니다: 텍스처 의도(무광 vs 유광), 노이즈 허용 범위, 선명도 편향에 대한 프롬프트만. 단순한 가이드라인이 아티팩트를 줄였습니다.
A/B 테스트를 위한 배치 프롬프트 확장
여기서 GLM-5가 가장 동료처럼 느껴졌습니다. 정확히 하나의 변수만 바꾸는 다섯 가지 미세 변형을 생성해달라고 요청했습니다: 초점 거리, 테이블 텍스처, 시간대, 또는 채도 범위. 시적인 재구성은 없이요. 각 변형당 하나의 깔끔한 델타만. 각각에 이유와 예상 위험을 레이블로 달아줬습니다(예: “거울 반사가 생길 수 있음”).
처음에는 시간이 절약되지 않았습니다. 여전히 좋은 것과 나쁜 것을 구분해야 했습니다. 하지만 세 번째 배치쯤 되니 정신적 노력이 줄었습니다. 구조 덕분에 비교가 정직해졌습니다. 어떤 선택이 좋았는지, 단순히 어떤 프롬프트가 더 좋게 들렸는지가 아니라 실제로 볼 수 있었습니다.
에이전트 워크플로우: GLM-5가 다단계 생성을 계획
“에이전트 모드”를 켜고 그냥 자리를 비운 것이 아닙니다. GLM-5에게 단계를 계획하고, 가정을 확인하고, 저를 기다리도록 했습니다. 단순한 루프: 계획 → 프롬프트 제안 → 제 편집 받기 → 실행 → 요약.
GLM-5에게 미리 작은 체크리스트를 제공하면 도움이 됐습니다:
- 목표를 한 문장으로 명확히 하기.
- 알 수 없는 것들 질문하기(카메라, 팔레트, 움직임).
- 이미지용 첫 번째 프롬프트 생성 후 영상으로 번역하기.
- 공유 제약 블록 유지하기: 제품 SKU 메모, 브랜드 색상, 화면 비율, 최대 움직임.
- 각 렌더 후 무엇이 바뀌었고 무엇을 유지할지 기록하기.
예시: 제품 촬영 → 5가지 각도 → 영상
세라믹 머그잔, 린넨 테이블, 부드러운 아침 햇살이라는 최소한의 제품 촬영으로 시도해봤습니다. 작업: 서로 다른 각도의 정지 사진 다섯 장, 그 다음 6~8초 루프.
제가 관찰한 내용(2026년 2월, 세 번의 세션):
- 1단계, 각도 세트: GLM-5가 명확한 거리와 높이가 포함된 다섯 가지 카메라 각도를 제안했습니다(예: 높이 1.2m, 후방 0.6m, 35° 아래). 그 구체성이 중요했습니다. 변형 전반에 걸쳐 구도가 일관되게 유지됐습니다.
- 2단계, 텍스처 제어: 린넨의 경우, GLM-5가 업스케일 시 무아레 현상을 방지하기 위해 강한 측면 광을 피하도록 제안했습니다. 항상 옳지는 않았지만, 그 주의 덕분에 노이즈가 많은 테이크 하나를 피할 수 있었습니다.
- 3단계, 영상 전달: WAN 2.5로 넘어갈 때, 히어로 정지 사진을 “프레임 제로”로 처리했습니다. 렌즈, 화이트 밸런스, 노출 보정을 유지했습니다. 예상치 못한 결과가 줄었습니다.
- 4단계, 정기 점검: 두 번의 렌더마다 GLM-5가 드리프트를 요약했습니다: “따뜻함 +6%, 그림자 더 깊어짐, 반사 생김.” 이 작은 메모들 덕분에 언제 멈출지 더 쉽게 결정할 수 있었습니다.
한계: GLM-5가 동작 메모 이상의 음악이나 페이싱 비트를 선택하도록 하지 않았습니다. “창의적”이 되려고 할 때 제품에 맞지 않는 제스처를 추가했습니다. 자제가 여기서는 더 효과적이었습니다.
프롬프트 품질 비교: GLM-5 vs GLM-4.7 출력
동일한 자연어 설명을 GLM-4.7과 GLM-5에 각각 입력하고, 출력을 그대로 사용했습니다. 실험실 테스트가 아니라, 마감 전에 할 법한 시도였습니다.
사용한 브리프: “린넨 테이블 위의 차분한 세라믹 머그잔, 부드러운 아침 햇살, 중성 팔레트, 브랜딩 없음. 깔끔하고, 조용하고, 사실적.”
제가 관찰한 내용:
- 구조 규율: GLM-5가 스키마를 더 자주 준수했습니다. GLM-4.7은 FLUX를 라이프스타일 느낌으로 유도하는 스타일 문구(“몽환적인,” “우아한”)로 흘러갔습니다. GLM-5는 카메라, 조명, 재질에 충실했습니다.
- 숫자 앵커: GLM-5는 적당한 숫자 기본값(35mm, f/4, 5200K)을 제공하고 가정으로 레이블을 달았습니다. GLM-4.7은 요청하지 않으면 숫자를 건너뛰는 경향이 있었습니다.
- 네거티브 프롬프트: GLM-5는 테스트 이미지의 아티팩트를 줄여주는 실용적인 네거티브를 포함했습니다(“보케 볼, 광택 하이라이트, 망원 압축”). GLM-4.7의 네거티브는 일반적이었습니다.
- 영상으로 번역: GLM-5는 간단한 동작 스크립트와 타이밍을 추가했습니다. GLM-4.7은 대체로 이미지 프롬프트에 “짧은 영상”만 붙여 다시 말했습니다. WAN 2.5는 GLM-5의 타이밍을 더 잘 따랐습니다.
작은 반론: GLM-4.7이 제 눈에는 무드보드에 잘 맞는 더 좋게 들리는 프롬프트를 만들 때도 있었습니다. 개념화 단계라면 그 톤이 유용할 수 있습니다. 하지만 제작 전달용으로는 GLM-5의 절제가 더 좋았습니다.
이것들이 GLM-5가 안정적으로 반복할 수 있는 언어 패턴을 제공해줬습니다.
코드 예시 — WaveSpeed SDK를 사용한 전체 파이프라인
아래는 제가 사용한 워크플로우의 형태를 보여주는 간략한 예시입니다. 키와 엔드포인트를 자신의 것으로 교체하세요. 2026년 2월 9일에 이것의 변형을 실행했습니다. 우아하지는 않습니다. 하지만 신뢰할 수 있습니다.
# pip install wavespeed sdk hypothetical
from wavespeed import GLM5, Flux, WAN25, Upscaler
glm = GLM5(api_key=GLM5_KEY)
flux = Flux(api_key=FLUX_KEY)
wan = WAN25(api_key=WAN_KEY)
up = Upscaler(api_key=UPSCALE_KEY)
brief = {
"subject": "muted ceramic mug on a linen table",
"mood": "soft morning light, neutral palette",
"constraints": {"aspect_ratio": "4:5", "brand_colors": ["#E8E4DA", "#8D8A83"]}
}
# 1) GLM-5에게 FLUX용 브리프 표준화 요청
flux_prompt = glm.generate(
system="Return a FLUX-friendly prompt with fields: subject, camera, lighting, materials, background, color, negatives. "
"Photography-first, numeric where helpful, minimal adjectives. Label assumptions.",
user=brief,
format={
"type": "object",
"properties": {
"subject": {"type": "string"},
"camera": {"type": "object"},
"lighting": {"type": "object"},
"materials": {"type": "object"},
"background": {"type": "string"},
"color": {"type": "object"},
"negatives": {"type": "array", "items": {"type": "string"}},
"assumptions": {"type": "array"}
},
"required": ["subject", "camera", "lighting", "negatives"]
}
)
# 2) 이미지 렌더
img = flux.generate_image(prompt=flux_prompt, seed=4217, steps=30, guidance=3.5)
# 3) WAN 2.5 영상 프롬프트로 번역
wan_prompt = glm.generate(
system="Translate the FLUX prompt into a WAN 2.5 prompt. Include: duration 6-8s, motion beats, camera movement (static or gentle pan), "
"continuity with the image (lens, white balance), and a list of negatives.",
user={"flux_prompt": flux_prompt, "reference_frame": img.preview_url}
)
vid = wan.generate_video(prompt=wan_prompt, seed=4217, fps=24, duration=7)
# 4) 제어된 선명도 + 노이즈로 업스케일
final = up.enhance(
input=vid.keyframe(0),
noise_reduction="low",
sharpening="moderate",
texture_bias="matte"
)
# 5) 드리프트 요약 로그
drift = glm.generate(
system="Summarize differences between target brief and outputs. 3 bullets: warmth, contrast, motion.",
user={"brief": brief, "image": img.metrics, "video": vid.metrics}
)
print(drift)
LLM 프롬프트를 코드 가까이에 두어 미래의 제가 왜 그런 선택을 했는지 알 수 있도록 합니다. YAML 템플릿을 선호한다면 그것도 괜찮습니다. 중요한 것은 GLM-5가 편집 없이 렌더 함수에 바로 전달할 수 있는 구조화된 필드를 반환한다는 것입니다.
도움이 됐던 몇 가지 작은 가이드라인:
- 기본 모양이 마음에 들 때까지 모든 것에 시드를 사용하세요. 그 다음 변형을 원하는 곳에서만 시드를 해제하세요.
- 화이트 밸런스는 느낌이 아닌 숫자로 유지하세요.
- GLM-5에게 가정 목록을 작성하도록 하고 렌더링 전에 수락/거부할 수 있도록 하세요.
스택이 WaveSpeed를 사용하지 않더라도 아이디어는 여전히 유효합니다. LLM은 노트와 모델 엔드포인트 사이에 위치하여 번역하고 기록을 유지합니다.





