article · 2026-08-10

생성 이미지의 문법은 프롬프트에 있지 않다

DINO, CLIP, 구도 모델로 생성 결과를 관찰하고 반복 가능한 Visual Grammar를 만드는 법

콘텐츠 글 한 편을 완성했다고 하자. 이제 대표 이미지가 필요하다.

지금은 대체로 이런 순서로 이미지를 만든다.

Article Draft
  → 핵심 메시지 요약
  → image prompt 작성
  → OpenAI Image Generation × 4
  → 마음에 드는 한 장 선택
  → crop / publish

한두 편을 만들 때는 충분하다. 네 장을 눈으로 보고 가장 나은 결과를 고르면 된다. 문제는 이 과정을 여러 콘텐츠에서 반복할 때 생긴다.

지난번에 어떤 구도를 골랐는지, 이번 결과가 최근 이미지와 얼마나 비슷한지, 무엇 때문에 한 장을 선택하고 나머지를 버렸는지가 남지 않는다. 매번 좋은 한 장은 고를 수 있지만, 좋은 선택을 반복하는 방법은 만들어지지 않는다.

여기에 minimal editorial composition이라는 문구를 공통 prompt로 넣으면 같은 문법의 이미지가 나올까.

비슷한 색과 재질은 나올 수 있다. 하지만 같은 prompt template 안에서도 구도는 쉽게 흩어진다. 어떤 결과에는 중앙의 hero object가 놓이고, 다른 결과에는 작은 node가 사방으로 퍼진다. 가짜 interface가 화면을 가득 채우기도 한다. prompt는 같지만 실제 이미지는 여러 갈래로 나뉜다.

최근 콘텐츠 이미지를 연달아 만들면서 한 장을 고르는 일보다 더 어려운 문제가 생겼다.

왜 이 이미지가 우리 콘텐츠처럼 보이는가.

“minimal”, “editorial”, “negative space”를 prompt에 더 많이 적는다고 답을 얻을 수는 없었다. 그 말이 실제 이미지에서 어떤 배치와 관계로 나타났는지는 생성 후에 다시 관찰해야 한다. 생성 전의 의도와 생성 후의 결과는 같은 데이터가 아니다.

앞선 글 「이 이미지에 VLM까지 쓸 필요가 있었나」에서는 detector, tracker, DINO, VLM이 관찰 후보를 단계적으로 줄이는 구조를 살펴봤다. 이번에는 방향을 뒤집어 보려 한다. 이미지를 이해하는 데 쓰던 representation으로, 계속 생성되는 콘텐츠 이미지의 반복 패턴을 발견할 수 있을까.

처음에는 DINO, CLIP, aesthetic score를 조합하면 될 것 같았다. 조사해 보니 이 구분도 충분하지 않았다. 의미와 구도, 스타일, 품질은 서로 다른 질문이었다.


representation은 무엇을 같다고 볼지 정하는 좌표다

여기서 말하는 representation은 이미지에 붙이는 설명이나 정답 label이 아니다. 이미지를 모델이 비교하고 계산할 수 있도록 바꾼 숫자 벡터다.

Image
  → Vision Model
  → [0.12, -0.38, 0.74, ...]

픽셀을 그대로 비교하면 조명이나 각도, 배경이 조금만 달라져도 같은 객체를 전혀 다른 이미지로 보기 쉽다. 좋은 representation은 이런 표면적인 차이를 줄이고, 현재 작업에 필요한 공통점을 남긴다. 비슷한 이미지는 가까운 벡터에, 다른 이미지는 먼 벡터에 놓인다.

중요한 점은 모델마다 보존하는 공통점이 다르다는 것이다.

같은 이미지
  ├─ CLIP   → 무엇이 그려졌는가
  ├─ DINO   → 객체와 영역이 시각적으로 어떻게 생겼는가
  ├─ CSD    → 어떤 스타일로 표현됐는가
  └─ Layout → 객체와 여백이 어떻게 배치됐는가

중앙에 빨간 자동차, 중앙에 파란 자동차, 중앙에 빨간 사과가 있다고 하자. CLIP에서는 자동차 두 장이 의미상 가까울 수 있다. Layout representation에서는 세 장 모두 중앙에 큰 객체 하나라는 이유로 가까워질 수 있다. CSD에서는 객체가 달라도 같은 렌더링 스타일을 사용한 이미지가 가까워질 수 있다.

representation을 선택한다는 것은 이미지를 어떤 기준으로 같다고 볼지 선택하는 일이다. 이 글에서 여러 모델을 나누어 쓰는 이유도 여기에 있다. 의미가 같은 이미지와 구도가 같은 이미지, 스타일이 같은 이미지를 하나의 거리로 판단할 수 없기 때문이다.


프롬프트는 설계도가 아니라 가설이다

콘텐츠 제작자는 single hero object, dual contrast, wide negative space 같은 문구를 template에 넣고 결과도 같은 계열이라고 간주한다. 하지만 prompt는 입력 기록이지 결과의 증거가 아니다.

같은 template에서도 중앙 구도, 좌우 분할, network형 배치가 섞인다. 서로 다른 prompt가 비슷한 구도로 수렴하기도 한다. 모델 버전, aspect ratio, seed, reference image도 결과를 바꾼다.

생성 파이프라인에는 두 종류의 taxonomy가 필요하다.

Intent Taxonomy
→ 무엇을 만들려고 했는가

Result Taxonomy
→ 실제로 무엇이 만들어졌는가

둘이 언제 일치하고 언제 어긋나는지 봐야 prompt의 통제력을 알 수 있다.

예를 들어 Pattern 03: Dual Contrast라는 template으로 100장을 만들었다고 하자. 결과를 사람이 확인했더니 43장은 좌우의 두 객체가 대비됐고, 31장은 중앙 객체 하나로 합쳐졌다. 18장은 여러 node가 흩어진 network형이었고, 8장은 어느 유형에도 안정적으로 들어가지 않았다.

이때 Dual Contrast는 이미지 100장의 정답 label이 아니다. 원하는 구조로 갈 확률과 다른 구조로 샐 확률을 가진 routing rule이다. pattern conformity는 prompt 문자열이 아니라 결과 분포에서 나온다.

prompt를 개선하려면 문장을 계속 덧붙이는 것보다 이 분포를 기록하는 편이 낫다. 어떤 표현이 어떤 구도를 자주 만들었는지, 모델이 바뀐 뒤 분포가 어떻게 이동했는지를 볼 수 있기 때문이다.


DINO는 문법을 발견하는 모델이 아니다

DINOv3의 역할도 이 좌표의 관점에서 보면 명확해진다. 먼저 알아야 할 것은 이 모델이 하지 않는 일이다.

DINO는 “이 이미지가 아름다운가”를 평가하지 않는다. 객체의 이름이나 bounding box를 직접 출력하는 detector도 아니다. 범용 vision backbone으로서 이미지 전체와 공간 위치별 patch를 비교 가능한 feature로 바꾼다. 공식 저장소가 patch feature PCA와 dense matching 예제를 제공하는 것도 이 때문이다. DINOv3 model card

생성 이미지에서는 다음과 같은 관찰에 쓸 수 있다.

  • 전체적인 visual appearance가 가까운가

  • foreground와 background의 region feature가 어떻게 다른가

  • 비슷한 객체나 영역이 어느 위치에 반복되는가

  • cluster를 대표할 이미지는 무엇인가

구도가 크게 다른 이미지라면 DINO feature에서도 차이가 나타날 가능성이 있다. Hero Object와 Constellation은 foreground의 분포와 patch 관계가 다르기 때문이다.

그렇다고 DINO embedding을 곧바로 composition embedding이라고 부를 수는 없다. DINO feature에는 객체의 형태, 질감, 장면 의미, 공간 배치가 함께 들어 있다. 자동차와 사람은 같은 중앙 구도에 놓여도 멀어질 수 있다. 반대로 같은 객체를 다른 구도로 배치한 두 이미지는 의미와 appearance 때문에 가까워질 수 있다.

DINO는 Visual Grammar를 자동으로 만들어 주지 않는다. 이미지 안의 객체와 영역을 비교 가능한 representation으로 바꾸는 층에 가깝다.

이 구분은 중요하다. 모델이 주는 거리와 우리가 알고 싶은 거리의 이름이 같지 않기 때문이다.


구도는 별도의 좌표가 필요하다

시각 구조를 알고 싶다면 DINO feature만 보는 것보다 구도를 명시적으로 분해해야 한다.

처음에는 Hero Object, Dual Contrast, Pipeline, Constellation, Landscape, Grid System, Convergence 같은 일곱 개 패턴을 생각했다. 이름은 기억하기 쉽지만 경계가 모호하다. Hero Object는 반드시 중앙 정렬이어야 하는가. Dual Contrast는 객체가 정확히 두 개여야 하는가. Constellation과 Convergence는 어디서 갈리는가.

기존 그래픽 디자인 연구를 다시 찾아보니 구도를 더 작은 속성으로 나눌 수 있었다.

device × axis × symmetry × content relation

예를 들어 Hero Object는 하나의 원자적 label이라기보다 다음 속성의 조합이다.

centered or off-centered
+ wide negative space
+ strong scale contrast
+ foreground-background relation

Dual Contrast는 bisection, horizontal 또는 vertical axis, balance, contrast relation으로 풀 수 있다. Pipeline은 sequential panel, leading line, horizontal 또는 Z flow의 조합이 된다.

이렇게 분해하면 상위 패턴의 이름을 바꿔도 관측 데이터는 남는다. 하나의 이미지가 asymmetric이면서 negative space를 사용하고 diagonal flow를 가질 수도 있다. 억지로 단 하나의 label에 넣을 필요가 없다.

모델 feature와 함께 해석 가능한 layout descriptor도 만들 수 있다.

focal point 위치
foreground 점유율
객체 수와 크기 비율
좌우·상하 균형
negative space 비율
dominant axis
symmetry
region 간 인접·겹침 관계

사진 구도를 평가하는 연구도 이미 있다. PICD는 36,857장의 이미지와 24개 구도 범주를 제공하고, CDA benchmark로 모델의 구도 이해를 측정한다. PICD/CDA, CVPR 2025

다만 이 연구의 중심은 사진이다. 우리가 만드는 editorial illustration이나 diagram형 hero image에도 같은 기준이 그대로 적용된다고 볼 수는 없다. 구도 모델은 좋은 출발점이지만, 실제 콘텐츠 이미지에서 사람이 느끼는 구조와 맞는지 다시 검증해야 한다.


의미와 스타일도 같은 축이 아니다

CLIP은 image-text pair에서 이미지와 언어의 대응을 학습했다. SigLIP은 같은 문제에 pair별 sigmoid loss를 사용한다. 두 모델 모두 생성 결과가 AI agent, knowledge graph, human-AI collaboration 같은 콘텐츠 의도와 가까운지 확인하는 데 유용하다. CLIP · SigLIP

처음에는 여기에 editorial, cinematic, technical diagram 같은 text probe를 넣어 style까지 함께 볼 수 있다고 생각했다. 거친 탐색에는 쓸 수 있지만, CLIP을 순수한 style encoder라고 부르기는 어렵다. 주제와 객체, 색, 텍스트로 표현할 수 있는 분위기가 하나의 embedding에 섞여 있기 때문이다.

같은 스타일의 자동차와 사람보다, 서로 다른 스타일로 그린 자동차 두 장이 CLIP 공간에서 더 가까울 수도 있다. 우리가 비교하고 싶은 것은 스타일인데 모델은 같은 객체에 더 크게 반응한 셈이다.

이 문제를 직접 다룬 모델이 CSD다. CSD는 diffusion image의 style similarity를 측정하기 위해 semantic content의 영향을 줄인 style descriptor를 학습한다. 연구에서도 CLIP과 DINO 같은 범용 embedding이 style보다 content에 끌리는 문제를 별도로 다룬다. Measuring Style Similarity in Diffusion Models

역할을 다음처럼 나누는 편이 명확하다.

CLIP / SigLIP
→ 이 이미지가 글의 의미와 맞는가

CSD
→ 다른 주제에서도 같은 스타일 문법을 유지하는가

여기에 DreamSim 같은 모델을 더할 수 있다. DreamSim은 사람이 두 이미지를 볼 때 느끼는 종합적인 유사성을 학습한다. layout, pose, color, semantic content가 함께 작용하는 human similarity에 가깝다. DreamSim

이제 하나의 “유사도” 대신 서로 다른 질문을 갖게 된다.

질문관찰 수단
글의 주제와 맞는가CLIP / SigLIP
객체와 영역의 appearance가 비슷한가DINOv3
구도 문법이 같은가layout descriptor / composition model
렌더링 스타일이 같은가CSD
사람이 전체적으로 비슷하다고 느끼는가DreamSim

내용은 일관되지만 구도는 다른 이미지를 찾으려면 semantic similarity는 높고 composition similarity는 낮은 후보를 고르면 된다. 다른 주제에서도 브랜드의 시각 문법을 반복하고 싶다면 semantic similarity는 낮더라도 style과 composition이 가까운 결과를 찾을 수 있다.


품질 점수는 취향의 정답이 아니다

시각 구조와 의미가 맞아도 주요 객체가 잘리거나 불필요한 문자가 생길 수 있다. 이때 quality 또는 preference model이 필요하다.

여기에도 서로 다른 질문이 섞여 있다.

  • 이미지에 기술적 결함이 적은가

  • 일반 사용자가 더 선호하는가

  • prompt 의도를 잘 따르는가

  • 우리 콘텐츠에 쓰고 싶은가

Q-Align은 품질 수준을 언어로 정의된 등급과 연결한다. PickScore, HPS v2, ImageReward는 생성 이미지 사이의 인간 선호를 학습한다. Q-Align · PickScore · HPS v2 · ImageReward

이 점수가 곧 우리 브랜드의 품질은 아니다. 공개 데이터에서 사람들이 평균적으로 선호한 이미지와, 특정 콘텐츠 시리즈에 어울리는 이미지는 다를 수 있다. 모델은 브랜드 색, 모바일 crop 안전성, 문맥상 피해야 할 상징까지 자동으로 보장하지 않는다.

공개 preference model은 후보 정렬의 기준선으로는 유용하다. 최종 취향은 실제 선택 기록으로 보정해야 한다. 어떤 후보를 골랐는지뿐 아니라 왜 나머지를 버렸는지도 남겨야 한다.

semantic mismatch
composition drift
style mismatch
quality defect
too similar to recent assets

탈락 이유가 쌓이면 나중의 ranker도 무엇을 학습해야 하는지 알 수 있다.


모든 점수를 하나로 합치지 않는다

모델을 여러 개 붙이면 하나의 최종 점수를 만들고 싶어진다.

Final Score
= semantic 0.3
+ composition 0.3
+ style 0.2
+ aesthetic 0.2

초기에는 이 방식이 오히려 문제를 숨긴다. 점수가 낮은 이유가 주제 불일치인지, 구도 이탈인지, 품질 문제인지 알기 어렵다. 점수마다 학습 데이터와 범위도 달라 숫자를 그대로 더할 수 없다.

pattern conformity와 visual novelty는 같은 similarity 공간에서 반대 방향으로 움직이기도 한다. 기존 패턴에 가까울수록 브랜드다울 수 있지만, 최근 이미지와 너무 가까우면 반복적으로 보인다.

처음에는 weighted sum보다 scorecard와 조건문이 낫다.

1. 글의 semantic intent를 충족하는가
2. 선택한 pattern의 layout 조건을 지키는가
3. 브랜드가 허용한 style family 안에 있는가
4. 최근 발행 이미지와 지나치게 비슷하지 않은가
5. 남은 후보 중 품질과 사람 선호가 높은가

이 구조라면 “브랜드답지만 지루한 이미지”와 “새롭지만 브랜드에서 벗어난 이미지”를 구분할 수 있다. 선택 이유도 설명할 수 있다.


Visual Pattern은 생성 전에는 router이고 생성 후에는 검사 기준이다

충분히 안정된 패턴은 다음 생성의 route가 된다.

비교를 다루는 글에는 Dual Contrast, 과정을 설명하는 글에는 Pipeline, 여러 개념의 관계를 보여주는 글에는 Constellation을 우선할 수 있다. 최근 콘텐츠에서 같은 패턴을 너무 자주 썼다면 다른 route를 선택한다.

Article
  → semantic intent
  → visual pattern router
  → prompt template + references
  → image generation × 4
  → semantic / composition / style / quality scorecard
  → 후보 선택 또는 regenerate

생성이 끝나면 pattern은 검사 기준으로 돌아온다. 네 장 중 글의 의미를 유지하면서 의도한 구도에 들어온 결과를 찾는다. 최근 이미지와 지나치게 비슷한 후보를 제외하고, 남은 결과를 품질과 사람 선호로 정렬한다.

Visual Pattern은 디자인 가이드의 이름표이면서 실행 pipeline의 decision object가 된다. 어떤 글에서 어떤 pattern을 선택했는지, 어떤 prompt가 실제로 그 구조를 만들었는지, 어디에서 자주 실패했는지가 연결된다.


Pattern Library보다 먼저 필요한 것은 관측 기록이다

처음부터 거대한 Visual Ontology를 만들 필요는 없다. 이미지가 쌓이기 전에 이름부터 고정하면 taxonomy가 데이터보다 앞서간다.

파일럿은 300장 안팎으로 시작할 수 있다. 7개 pattern hypothesis와 10개 article intent에서 후보를 4장씩 만들면 280장이다. 이 수치가 통계적 충분성을 보장하지는 않는다. 사람이 exemplar와 경계 사례를 보면서 라벨 규칙을 고치기에는 적당한 출발점이다.

각 이미지에는 최소한 다음 기록이 필요하다.

asset_id / article_id / semantic_intent
prompt_template / full_prompt / model / size / generation parameters
DINO global and region features
layout descriptors / composition labels
CLIP or SigLIP embedding
CSD style descriptor
quality and preference scores
human selection / rejection reason

embedding만 모으면 cluster가 왜 생겼는지 알기 어렵다. prompt만 저장하면 실제 결과가 어디로 흩어졌는지 볼 수 없다.

Prompt
→ Generated Result
→ Feature
→ Cluster
→ Human Label
→ Selection
→ Published Content

HDBSCAN은 안정적인 밀도 영역을 찾고 어디에도 속하지 않는 이미지를 noise로 남길 수 있다. HDBSCAN documentation 모든 이미지를 기존 일곱 pattern에 억지로 넣지 않아도 된다는 점이 탐색 단계에 맞는다.

다만 고차원 embedding을 그대로 넣고 예쁜 UMAP 지도를 얻었다고 해서 문법을 발견한 것은 아니다. feature를 정규화하고 PCA 조건을 비교해야 한다. seed와 표본이 바뀌어도 cluster가 유지되는지, 사람이 같은 구도라고 판단한 pair와 triplet을 실제로 가깝게 놓는지 확인해야 한다.

cluster의 이름은 사람이 붙인다. medoid와 경계 sample, noise를 함께 보면서 무엇이 반복되는지 설명한다. Hero Object 안에서 centered와 asymmetric negative space가 갈릴 수 있다. 반대로 구분되지 않는 Convergence와 Constellation은 합칠 수도 있다.

이 과정에서 ontology는 미리 정한 분류표가 아니라 관찰을 압축한 운영 언어로 자란다.


Visual Grammar는 모델이 아니라 관계의 기록이다

조사를 시작할 때는 DINO로 생성 이미지 500장을 clustering하면 우리만의 구도 패턴을 발견할 수 있을 것이라고 생각했다. 지금은 조금 다르게 본다.

DINO는 객체와 영역을 표현한다. CLIP은 이미지와 글의 의미를 잇는다. CSD는 스타일을 비교하고, 구도 모델과 layout descriptor는 배치의 문법을 기록한다. preference model은 일반적인 선택 경향을 보여준다. 어느 것도 혼자서 “우리다운 이미지”를 정의하지는 못한다.

우리다운 이미지는 이 관계가 쌓인 뒤에야 보인다.

Pattern
→ Composition Attributes
→ Style Family
→ Prompt Template
→ Generated Asset
→ Scorecard
→ Human Decision
→ Published Content

어떤 구조가 어떤 글에서 선택됐는가. 어떤 template은 의도한 pattern으로 얼마나 자주 들어왔는가. 의미는 유지하면서 최근 이미지와 다른 후보를 고를 수 있었는가. 사람은 어떤 실패를 반복해서 거절했는가.

이 기록이 Visual Grammar다.

시작점은 fine-tuning이 아니다. frozen DINOv3, CLIP 또는 SigLIP, 명시적인 layout descriptor, 필요하면 CSD와 DreamSim, HDBSCAN, 그리고 사람의 pattern label이면 충분하다. 먼저 우리가 말하는 “같은 구도”, “같은 스타일”, “좋은 이미지”를 각 모델이 실제로 구분하는지 측정해야 한다.

생성 전에는 가능한 구도를 줄인다. 생성 후에는 실제 결과가 그 구조에 들어왔는지 본다. 모델은 이미지를 만든다. representation은 결과를 비교하게 한다. 사람은 반복할 가치가 있는 패턴과 피해야 할 실패에 이름을 붙인다.

생성 이미지의 문법은 prompt에 적힌 문장이 아니다. 생성과 관찰과 선택이 반복되며 남긴 관계에 더 가깝다.


참고