AWS 기술 블로그

Amazon Bedrock기반 Agentic Text-to-Image로 사용자 의도를 정확히 반영하기 (프롬프트 분해에서 검증까지)

텍스트 기반 이미지 생성의 현실적 도전과제

텍스트 기반 이미지 생성 기술(Text-to-Image)은 Nova CanvasDALL-EStable DiffusionMidjourney와 같은 인공지능 모델의 발전으로 혁신적인 변화를 가져왔습니다. 이제 사용자들은 간단한 텍스트 프롬프트만으로도 고품질의 이미지를 생성할 수 있게 되었으며, 이는 디자이너, 아티스트, 마케터 및 일반 사용자에 이르기까지 광범위한 활용 가능성을 제시하고 있습니다.
예를 들어, “일몰 시간에 해변에서 서핑하는 사람”이라는 간단한 프롬프트로 사실적인 이미지를 생성하거나, “사이버펑크 스타일의 미래 도시”와 같은 창의적 개념을 시각화하는 것이 가능해졌습니다. 그러나 이러한 기술적 진보에도 불구하고, 실제 사용 경험에서는 여러 한계점이 드러나고 있습니다.

프롬프트이미지 간 불일치 문제

텍스트 기반 이미지 생성 시스템의 주요 한계점은 사용자의 프롬프트와 실제 생성된 이미지 간의 불일치입니다. 이러한 문제는 다양한 형태로 나타납니다:

  • “세 척의 배가 항해하는 바다 풍경”을 요청했으나 두 척 또는 한 척만 생성되는 경우
  • “웅장한 화산 폭발 장면”을 요청했지만 작은 규모의 화산만 표현되는 경우
  • “빨간 모자를 쓴 여자와 파란 재킷을 입은 남자”와 같은 복합적 요소가 있을 때 속성이 뒤바뀌거나 일부만 구현되는 경우

이러한 불일치는 사용자로 하여금 원하는 결과물을 얻기 위해 프롬프트를 지속적으로 수정하고 재 시도하게 만듭니다. 더욱 문제가 되는 점은 한 가지 문제를 해결하기 위한 프롬프트 수정이 다른 부분에서 새로운 문제를 유발할 수 있다는 것입니다. 이러한 반복적인 시행착오 과정은 사용자 경험을 저하시키고 작업 효율성을 현저히 감소시킵니다.

이 글에서는 텍스트 기반 이미지 생성 기술의 현재 한계점을 살펴보고, 이러한 도전과제를 극복하기 위한 실용적 접근 방식에 대해 논의합니다. 중요한 점은 우리가 제안하는 Agentic 접근법이 생성 모델 자체를 수정하거나 재훈련하는 것이 아니라, 기존 모델들을 보다 효과적으로 활용하는 방법에 초점을 맞추고 있다는 것입니다. 이 접근법은 복잡한 프롬프트를 분해하고(Planning), 단계적으로 이미지를 생성하며(Tool use), 각 단계마다 검증과 프롬프트 수정 과정을(Reflection) 통해 프롬프트-결과물 불일치 문제를 해결합니다. 즉, 사용자의 의도를 더 정확히 반영하기 위해 모델 자체가 아닌 모델을 활용하는 방식을 개선하는 것입니다. 이 글은 디자이너와 크리에이터들이 AI 이미지 생성 도구를 활용할 때 겪는 프롬프트-결과물 불일치 문제를 해결하고, 상황에 맞는 기술을 적용하여 효율적인 워크플로우를 구축하는 데 도움이 될 것입니다.

 

[VoD] Agentic Text-to-Image: https://www.youtube.com/watch?v=mLu5U6C80uw

문제 정의

현재 이미지 생성 모델들이 텍스트 프롬프트를 정확히 반영하지 못하는 데에는 여러 기술적 이유가 있습니다.

1) 속성 바인딩 문제 [3][4][5]

생성 프롬프트 내 여러 객체와 속성이 있을 때, 모델이 어떤 속성이 어떤 객체에 적용되어야 하는지 혼동할 수 있습니다. “빨간 모자를 쓴 여자와 파란 재킷을 입은 남자”라는 프롬프트에서 ‘빨간’과 ‘파란’이 어떤 객체에 연결되어야 하는지 혼동될 수 있습니다. 속성 바인딩 문제의 기술적 원인은 아래와 같습니다.

  • 분산된 주의력 문제[6]여러 객체와 속성이 포함된 복잡한 프롬프트에서 모델의 주의력이 분산되어 각 속성이 올바른 객체에 바인딩되지 않을 수 있습니다. 어텐션의 총합은 1로 제한되므로, 하나의 객체를 설명하는 단어가 많을수록 각 단어에 할당되는 어텐션 가중치가 감소합니다. 이로 인해 특정 속성이 이미지 생성 과정에서 약화되거나 누락될 수 있습니다. 이러한 한계는 확률적 생성 과정의 문제로 이어지며, 객체 수가 증가할수록 올바른 속성-객체 매핑의 성공률이 현저히 낮아지게 됩니다.

2) 공간적 관계 표현의 어려움 [7][8][9]

객체 간의 공간적 관계(왼쪽, 오른쪽, 위, 아래 등)를 정확히 표현하는 것은 대부분의 생성 모델에게 어려운 과제입니다.

  • 연속적 이미지 공간과 이산적 언어 공간의 불일치[10]: 공간 관계는 언어로는 이산적이고 범주적으로 표현되지만(“왼쪽에”, “오른쪽에”), 이미지 공간은 연속적입니다. 이 위치 관계는 본질적으로 상대적이므로 모델이 기준 객체 위치를 먼저 결정한 후 그에 상대적인 객체 위치를 결정해야 하지만, 디퓨전 모델은 전체 이미지를 한 번에 노이즈에서 탈노이즈화(denoise)하며 모든 영역을 동시에 업데이트하는 병렬 처리 방식을 사용합니다. 결과적으로 모델은 간단한 공간 관계도 정확히 시각화하는 데 어려움을 겪으며, 이는 객체 위치가 의도한 대로 표현되지 않는 결과로 이어집니다.

3) 미세한 디테일 조정의 한계

사용자가 원하는 정확한 구도, 스타일, 색조를 한 번에 표현하기 어렵습니다.

  • 잠재 공간의 비선형성[11]: 생생성 모델은 잠재 공간(latent space)에서 작동하며, 이 공간은 본질적으로 비선형적입니다. 따라서 비슷한 의미의 텍스트가 잠재 공간에서 비슷한 위치에 투영(projection)되더라도, 이 공간의 비선형적 특성으로 인해 작은 차이만으로도 생성된 이미지에 예상치 못한 큰 변화가 나타날 수 있습니다.
  • 피드백 루프의 부재: 대부분의 텍스트-이미지 모델이 일방향 생성 프로세스를 사용하기 때문에, 생성 도중에 결과를 평가하고 조정하는 피드백 루프가 없습니다.

이러한 문제들은 사용자로 하여금 원하는 이미지를 얻기 위해 프롬프트를 계속 수정하고 재시도하게 만듭니다. 그리고 재시도할 때마다 모든 문제가 한 번에 해결되지 않고, 오히려 다른 부분에서 새로운 문제가 발생하기도 합니다. 이런 맥락에서 “Agentic” 접근법을 통해 이러한 한계를 극복하고 사용자의 의도를 더 정확히 반영할 수 있는 이미지 생성 시스템을 만들 필요성이 대두되고 있습니다.

해결 전략: Agentic Text-to-Image 시스템

복잡한 이미지 생성 요구사항을 충족시키기 위해서는 단순한 프롬프트 입력만으로는 부족한 경우가 많습니다. 현행 텍스트-이미지 생성 모델들은 복잡한 장면 구성, 공간적 관계, 세부 사항 등을 정확히 반영하는 데 한계를 보이고 있습니다. 이러한 문제를 해결하기 위한 방안으로 Agentic Text2Image 시스템을 제안합니다.
Agentic Text-to-Image 시스템은 최근 대규모 언어 모델(LLM)에서 활용되는 ‘리즈닝(reasoning)’ 기술을 텍스트-이미지 생성에 적용한 접근법입니다. 이 시스템은 복잡한 이미지 생성 과정을 체계적으로 분해하고 단계적으로 수행함으로써 기존 모델의 한계를 극복합니다.

중요한 점은 우리가 제안하는 Agentic 접근법이 위에서 설명한 모델 자체의 근본적인 한계를 직접 해결하는 것이 아니라는 것입니다. 우리는 생성 모델의 아키텍처를 재설계하거나 새로운 학습 방법을 제안하는 대신, 기존 모델들을 그대로 활용하면서 스마트한 trial-and-error 과정을 통해 이러한 문제들을 우회하는 방법을 제시합니다. 즉, 생성 모델 자체의 개선이 아닌 모델을 효과적으로 활용하는 워크플로우의 개선을 통해 문제를 해결하는 것입니다. 이러한 문제들로 인해 사용자는 원하는 이미지를 얻기 위해 프롬프트를 계속 수정하고 재시도해야 하며, 한 문제를 해결하려는 시도가 다른 부분에서 새로운 문제를 발생시키는 악순환이 생기곤 합니다. 이런 맥락에서 ‘Agentic’ 접근법은 생성 모델의 내부 메커니즘을 변경하지 않고도 체계적인 프로세스를 통해 이러한 한계를 극복하고 사용자의 의도를 더 정확히 반영할 수 있는 실용적인 이미지 생성 시스템을 구축하는 방법을 제시합니다.

핵심 구성

  • 복잡한 프롬프트 분해 (Decomposition): 복잡한 이미지 생성 요청을 더 단순한 하위 태스크로 분해합니다. GenArtist 연구[1]에서는 “MLLM(멀티모달 대형 언어 모델)을 에이전트로 활용하여 복잡한 문제를 더 간단한 하위 문제로 분해하고, 트리 구조를 구성하여 생성, 편집 및 자체 수정 프로세스를 체계적으로 계획한다”고 보고하고 있습니다.
  • 단계적 이미지 생성 (Incremental Generation): 분해된 각 하위 태스크에 따라 이미지를 점진적으로 생성합니다. 기본 배경이나 주요 객체부터 시작하여 점차 세부 요소들을 추가하는 방식으로 진행됩니다.
  • 검증 및 반영 (Verification & Reflection) 각 단계에서 생성된 이미지가 해당 단계의 요구사항을 충족하는지 검증합니다. Google DeepMind의 연구에서는 “belief graph라는 개념을 통해 에이전트가 자신의 불확실성과 이해도를 표현하고, 사용자가 이를 편집할 수 있도록 했습니다. 이를 통해 에이전트는 사용자 의도를 더 명확히 이해하고 더 정확한 이미지를 생성할 수 있었습니다. [2]
  • 반복적 개선 (Recursive Improvement): 검증 결과에 따라 필요시 프롬프트를 수정하고 이미지를 재생성하는 과정을 만족스러운 결과가 도출될 때까지 반복합니다.
  • 도구 활용 (Tool Use): 대규모 언어 모델(LLM)이 전체 이미지 생성 워크플로우를 관리하고 조율하는 중앙 에이전트 역할을 수행하며, 실제 이미지 렌더링은 전문화된 이미지 생성 모델을 도구로 활용합니다. 이러한 역할 분담을 통해 각 구성 요소의 강점을 최대한 활용할 수 있습니다.
  • 세부 커스터마이징 (Customization): 초기 생성 과정이 완료된 후에도 사용자가 원하는 특정 요소의 변경이 필요한 경우(예: 음식의 토핑 변경, 배경색 수정 등), 이미지의 일부분만 선택적으로 수정할 수 있는 기능을 제공합니다. 이를 위해 인페인팅(inpainting)과 아웃페인팅(outpainting) 기술을 활용하여 전체 이미지를 다시 생성하지 않고도 특정 영역만 정교하게 수정할 수 있는 옵션을 제공합니다. 이는 사용자가 최종 이미지를 자신의 정확한 의도에 맞게 미세 조정할 수 있는 유연성을 더해줍니다.

 

Agentic Text-to-Image 시스템의 작동 프로세스

Agentic Text-to-Image 시스템은 복잡한 프롬프트를 단계적으로 처리합니다. 예를 들어, “웅장한 화산 근처에서 세 척의 배가 항해하는 호수, 그 위로는 붉은 용이 하늘을 지배하고 있는 얼음 풍경”이라는 프롬프트에 대해 다음과 같은 단계로 처리합니다:

  • 프롬프트 분해 (Decomposition): 주요 요소(얼음 풍경, 호수, 배, 화산, 용)와 공간적 관계(배는 호수에, 화산은 호수 근처에, 용은 하늘에)를 식별합니다.
  • 단계적 생성 (Generation):
    • 1단계: 기본 얼음 풍경과 호수 생성
    • 2단계: 세 척의 배 추가
    • 3단계: 웅장한 화산 추가
    • 4단계: 붉은 용 추가
  • 검증 (Reflection): 각 단계마다 생성된 이미지가 요구사항을 충족하는지 확인합니다.
  • 수정 (Correction): 문제가 발견되면 프롬프트를 수정하여 재생성합니다. 예를 들어, 배가 두 척만 생성되었다면 “세 척의 배가 필요합니다”라는 수정 지시를 생성합니다.
  • 세부 커스터마이징 (Customization): 기본 생성 과정이 완료된 후에도 특정 요소의 변경이 필요한 경우, 인페인팅/아웃페인팅 기술을 활용해 전체 이미지를 재 생성하지 않고 선택적 영역만 수정합니다. 예를 들어, 생성된 이미지에서 하늘 색상을 변경하거나, 용의 색상을 붉은색에서 푸른색으로 바꾸거나, 배의 위치를 미세 조정하는 등의 작업을 수행할 수 있습니다. 이는 사용자가 원하는 정확한 결과물에 더 가깝게 이미지를 조정할 수 있는 유연성을 제공합니다.

이러한 접근 방식을 통해 복잡한 이미지 생성 요구사항도 단계적으로 해결하며 사용자의 의도를 더 정확히 반영하는 이미지를 생성할 수 있게 됩니다. 특히 공간적 관계, 객체 간 상호작용, 세부 디테일과 같은 기존 모델의 취약점을 효과적으로 보완할 수 있습니다.

방법론

아래 그림은 Agentic Text-to-Image 시스템 구성을 위한 솔루션 다이어그램입니다. 앞서 문제정의의 “속성 바인딩 문제”에서 언급한 대로, 생성 프롬프트가 길어질 경우 Cross attention 과정에서 오브젝트와 속성 간 매핑이 제대로 이루어지지 않을 수 있습니다. 제안된 Agentic Text-to-Image 시스템에서는 1) [Planning] 프롬프트를 작은 단위로 분해한 후, 2) [Tool use] 각각을 생성하고, 3) [Reflection] 결과를 검증하며, 4) 이 과정을 반복 수행함으로써 문제를 해결하고자 합니다. 아래는 각 단계별 프롬프트 및 코드이며, 전체 코드는 여기에서 확인할 수 있습니다.

그림 1: Agentic Text-to-Image 시스템 다이어그램

1) 프롬프트 분해 (Planning)

사용자로 부터 입력 받은 프롬프트는 위의 시스템 프롬프트 기반으로 분해됩니다. 주요 사항은 아래와 같습니다.

  • 단계별 이미지 생성을 위해 사용자 요청을 관리 가능한 단계로 분해하는 역할을 수행합니다. 기본적으로 단일 단계를 우선 시 하되, 복잡한 경우에만 2-3단계로 나누어 진행합니다.
  • 첫 단계에서는 전체 구성과 주요 주제를 설정하고, 이후 단계에서는 이전 요소를 유지하며 세부 사항을 추가합니다. 각 단계별로 명확한 프롬프트와 제어 강도(1에 가까울수록 원본에서 크게 변화)를 지정해야 하며, 이 과정은 LLM에 의해 판단 됩니다.
  • 응답은 반드시 지정된 JSON 형식으로 제공해야 하며, 각 단계는 이전 단계를 기반으로 하면서 일관된 스타일(예술적 스타일, 품질, 조명, 카메라 관점 등)을 유지해야 합니다.
from textwrap import dedent

system_prompts = dedent(
    '''
    You are an agent that plans steps for stepwise image generation based on user requests.
    Core Responsibilities:
    
    1. Break down user requests into manageable steps that:
        - Prioritize single step generation when feasible
        - Only split into multiple steps (2-3) when complexity demands it
            (e.g. layered scenes, multiple focal points, complex interactions)
        - Follow control mode restrictions (NONE for step 1, SEGMENTATION after)
        - Progress from core elements to details
        - Use appropriate control strength for smooth transitions
        - Track and maintain key subject and image style properties:
            * Exact counts (e.g., "3 boats with passengers" not just "3 boats")
            * Spatial orientations (e.g., "facing left")
            * Specific attributes (e.g., "red cars" not just "cars")
            * Relationships between subjects (e.g., "person sitting in each boat")
            * Image style (e.g., "oil painting")
    2. For each step, provide:
        - Start with new elements in prompt generation
        - Step description
        - Image generation prompt that have to maintain key subjects(people, car, etc) and elements from previous steps while clearly specifying new additions
        - Add detailed improvements (style, lighting etc)
        - Control mode (NONE/SEGMENTATION)
        - Control strength (0.0-1.0, N/A for step 1)
    Step Planning Guidelines:
    First Step (Composition & Subject):
    - Uses NONE control mode
    - No control strength applicable
    - Must establish:
        * Overall scene composition
        * Main subjects and objects
        * Spatial relationships and viewpoint
        * Foreground/background structure
        * Space allocation for future elements
    Subsequent Steps:
    - Uses SEGMENTATION control mode
    - Each prompt should explicitly reference maintaining previous subjects and elements
    - Control strength: 0.8-0.95 recommended
    - Consider new elements' impact when selecting control strength
    
    Scene Composition Rules:
    1. Foreground/Background
        - Specify clear spatial relationships
        - Maintain distinct layering
        - Use explicit positioning terms
    2. Spatial Relationships
        - Use clear position indicators (left, right, near, far)
        - Consider depth and perspective
        - Be explicit about distances and relationships
        
    Prompt Writing Guidelines:
    - Use image captioning style
    - Start with new elements or sbjects
    - Maintain consistent style across steps
    - Use clear, simple language
    - Keep under 5,000 characters
    - Include:
        * Spatial relationships
        * Depth indicators
        * Viewing angles when relevant
        * Style keywords at end
        
    Output Format:
    DO NOT include any text or json symbol (```json```)outside the JSON format in the response
    You must provide your response in the following JSON format:
    {
        "total_steps": <number_of_steps>,
        "steps": [
            {
                "step_number": <number>,
                "description": <string>,
                "control_mode": <"NONE"/"SEGMENTATION">,
                "control_strength": <float>,
                "prompt": {
                    "positive": <string>,
                    "negative": <string>
                }
            }
        ]
    }
    
    Key Requirements:
    - Each step builds on previous
    - Maintain style consistency across steps through:
        * Matching artistic style keywords
        * Consistent quality enhancers
        * Uniform lighting/atmosphere descriptions
        * Consistent camera/perspective terms
    
    '''
)

2) 단계적 생성 (Tool use)

분해된 단계별 생성 프롬프트를 기반으로 이미지를 생성합니다. 첫 단계는 조건 이미지 없이 진행되며, 이후 단계에서는 직전에 생성된 이미지를 조건 이미지로 활용합니다. 이 방식은 생성되는 이미지의 톤과 분위기를 일관되게 유지하는 데 도움을 줍니다. 이미지 생성 시 조건 이미지 반영 여부에 따라 서로 다른 모델을 적용했습니다. 조건 이미지가 필요 없는 1단계에서는 더 뛰어난 생성 능력을 가진 Stable Image Ultra v1.1을 활용하고, 이후 조건 이미지가 필요한 단계에서는 Stable Diffusion 3.5 Large를 사용했습니다.

def _body_generator(self, pos_prompt, neg_prompt="", condition_image=None, control_strength=None, seed=1):
        
    print ("_body_generator, control_strength", control_strength)

    if condition_image == None:
        self.image_generation_model.model_id = "stability.stable-image-ultra-v1:1"
        print (f'Image generator: SD-Ultra')
        body_dict = {
            "prompt": pos_prompt,
            "negative_prompt": neg_prompt,
            "mode": "text-to-image",
            "aspect_ratio": "3:2",  # Default 1:1. Enum: 16:9, 1:1, 21:9, 2:3, 3:2, 4:5, 5:4, 9:16, 9:21.
            "output_format": "png",
            "seed": seed
        }
    else:
        self.image_generation_model.model_id = "stability.sd3-5-large-v1:0"
        print (f'Image generator: SD-3-5-Large')
        body_dict = {
            "prompt": pos_prompt,
            "negative_prompt": neg_prompt,
            "mode": "image-to-image",
            "strength": control_strength, # nova랑 반대
            "image": condition_image,
            "output_format": "png",
            "seed": seed
        }

    return json.dumps(body_dict)
        
body = self._body_generator(
    pos_prompt=pos_prompt,
    neg_prompt=neg_prompt,
    condition_image=condition_image,
    control_strength=control_strength, # nova랑 반대
    seed=seed
)

3) 검증 및 개선 (Reflection)

생성된 이미지는 검증 단계를 거칩니다. 이 과정에서는 생성된 이미지가 생성 프롬프트에 맞게 제작되었는지 확인합니다. 검증은 멀티모달 입력을 지원하는 LLM이 수행하며, 이를 위한 검증 프롬프트의 주요 내용은 아래와 같습니다.

  • 이미지 품질 평가자로서 생성된 이미지가 사용자 요구사항과 일치하는지 정확도와 정렬 측면에서 평가합니다. 요청된 모든 요소가 존재하고 요구사항과 일치하는지 확인합니다.
  • 평가는 지정된 JSON 형식으로만 출력해야 하며, 주체/객체의 수량, 위치, 방향 등에서 불일치가 있으면 반드시 “retouch”를 “true”로 표시해야 합니다.
  • 평가 결과에는 주요 대상의 일치/불일치 여부, 실제 수량, 주요 특징과 함께 전체적인 구성 및 스타일에 대한 평가가 포함되어야 합니다. 불일치 항목에 대해서는 명확하고 간결한 피드백을 제공합니다.
system_prompts = dedent(
   '''
    You are an image quality evaluator.
    Compare the generated image with the user's requirements and provide an assessment focusing on accuracy and alignment.
    Evaluate whether all requested elements are present and match the requirements.
    
    Output your evaluation in the following JSON format:
    DO NOT include any text or json symbol (```json```)outside the JSON format in the response
    You must ONLY output the JSON object, nothing else.
    NO descriptions of what you are doing before or after JSON.
    {
        "retouch": "true/false",  // true if elements don't match (MUST mark true for ANY mismatch in counts, positions, or orientations of subjects/objects)
        "suggestions": [
            "list mismatches first"
        ],
        "evaluation": {
            "key_subjects": {
                "subject_name": {
                    "results": "match/mismatch",
                    "count": "actual count",
                    "attributes": "key details"
                }
            },
            "composition": {
                "alignment": "evaluation of layout and positioning"
            },
            "style": {
                "overall": "evaluation of style and mood"
            }
        }
    }
    Provide clear, concise feedback for any mismatches.
    
    '''
   )

검증 과정에서 받은 피드백을 바탕으로 이미지 개선을 위한 생성 프롬프트를 수정합니다. 주요 내용은 아래와 같습니다.

  • 이미지 생성 프롬프트와 개선 제안을 바탕으로 프롬프트를 향상시키는 에이전트 역할을 수행합니다. 새로운 요소를 추가하고 핵심 구조를 유지하면서 5,000자 이내로 간결하게 작성합니다.
  • 제어 강도(control strength)는 0.8-0.95 사이로 설정하여 적절한 변환 균형을 유지합니다. 값이 0이면 입력 이미지와 동일하게 유지되고, 1이면 입력 이미지가 전혀 반영되지 않습니다.
  • 응답은 반드시 지정된 JSON 형식으로만 출력해야 하며, positive 프롬프트, negative 프롬프트, control_strength 값을 포함해야 합니다. 원본 프롬프트의 주요 구조를 유지하면서 제안사항을 자연스럽게 통합해야 합니다.
system_prompts = dedent(
    '''
    You are an agent that enhances image generation prompts based on provided suggestions. Your role is to:
    1. Process Input:
        - Original image generation prompt
        - Provided suggestions for improvement
    2. Enhance Prompt:
        - Start with new elements or sbjects
        - Maintain the core elements and structure of original prompt
        - Keep the total prompt length under 5,000 characters
        - Write prompts as concisely as possible
        - 제거되어야 하는 사항이 있다면 "negative" prompt에 넣어 주세요. 
        
    3. Determine Control Strength:
        - 0.8-0.95: Optimal range for balanced transformation
        - A value of 0 would yield an image that is identical to the input. A value of 1 would be as if you passed in no image at all. Range: [0, 1]
        - Consider the impact on existing elements
    Required Output Format:
    DO NOT include any text or json symbol (```json```)outside the JSON format in the response
    You must ONLY output the JSON object, nothing else.
    NO descriptions of what you're doing before or after JSON.
    Note: "control_strength" must be included inside the "prompt_repo" object.
    {
        "prompt_repo": {
            "positive": <improved prompt incorporating suggestions>,
            "negative": <negative prompt>,
            "control_strength": <float between 0.0 and 1.0>
        }
    }
    
    General Guidelines:
    - Keep the original prompt's main structure
    - Integrate suggestions naturally
    - Use image captioning style
    - Maintain clear spatial relationships
    - Ensure coherent flow in descriptions
    - Preserve essential elements from original prompt
    - Use concise, clear descriptions
    - Prioritize critical elements when length is constrained
    - Remove redundant or unnecessary descriptors
    - Stay within 5,000 character limit
    - Ensure style consistency with previous steps
    
    '''
)

4) 반복적 개선 (오케스트레이션)

Agentic Text-to-Image 시스템의 오케스트레이션은 LangGraph를 이용하였습니다. LangGraph는 AI 시스템의 상태 관리를 효율적으로 처리하여 Agentic Text-to-Image 시스템과 같은 다단계 프로세스를 명확하게 구조화할 수 있습니다. 여러 모델과 컴포넌트 간의 데이터 흐름을 그래프 형태로 정의함으로써 시스템의 각 단계를 모듈화하고 필요에 따라 쉽게 수정할 수 있습니다. 또한 LangGraph는 반복적인 작업이나 피드백 루프를 자연스럽게 구현할 수 있어 이미지 생성 과정에서 필요한 반복적인 개선 과정을 효과적으로 지원합니다.
LangGpaph를 통해 프롬프트 분해, 이미지 생성, 검증 및 개선을 노드로 표현하고, 각 노드 사이의 실행 관계를 엣지로 표현하여 전체 워크로드를 오케스트레이션 하였습니다.

from langgraph.graph import END, StateGraph
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.runnables import RunnableConfig

workflow = StateGraph(self.state)

# Todo 를 작성합니다.
workflow.add_node("StepwiseTaskDecomposer", StepwiseTaskDecomposer)  # 이미지 생성을 위해 필요한 요소들이 준비되었는지 확인합니다.
workflow.add_node("ImageGeneration", ImageGeneration)  # 요청을 이미지 생성용 프롬프트로 수정하는 노드를 추가합니다.
workflow.add_node("Reflection", Reflection)  # 사용자의 요청에 맞게 이미지가 생성 되었는지 확인힙니다.
workflow.add_node("PromptReformulation", PromptReformulation)  # 사용자의 요청에 맞게 이미지가 생성 되었는지 확인힙니다.

workflow.add_conditional_edges(
    "StepwiseTaskDecomposer",
    ShouldStepwiseImageGeneration,
    {
        "next_step": "ImageGeneration",
        "completed": END,
    },
)
workflow.add_edge("ImageGeneration", "Reflection")
workflow.add_conditional_edges(
    "Reflection",
    ShouldImageRegeneration,
    {
        "pass": "StepwiseTaskDecomposer",
        "retouch": "PromptReformulation"
    },
)
workflow.add_edge("PromptReformulation", "ImageGeneration")

workflow.set_entry_point("StepwiseTaskDecomposer")
memory = MemorySaver()

self.app = workflow.compile(checkpointer=memory)        
self.config = RunnableConfig(recursion_limit=100, configurable={"thread_id": "Text2Image"})

5) 세부 커스터마이징

본 데모의 활용도를 높이기 위해 세부 커스터마이징(Customization) 기능을 통해 생성된 이미지를 더 정밀하게 조정하는 과정도 데모에 포함했습니다. Amazon Nova Canvas의 텍스트 기반 인페인팅 기술을 바탕으로 아래의 프롬프트롤 통해 텍스트 기반 이미지를 생성하는 프롬프트를 최종 생성하는 기능을 포함했습니다. 앞선 prompt reformulation 과정과 결합하여 Amazon Nova Canvas의 이미지 에디팅 기능을 잘 활용할 수 있도록 이미지 생성을 위한 main_prompt, 특정 부분을 삭제하기 위한 negative_prompt, 마스킹 영역을 지정하기 위한 mask_prompt를 자동으로 추출할 수 있도록 아래와 같은 system prompt를 사용헀습니다.

텍스트 기반 인페인팅 프롬프트:

'''
<task>
당신은 GenAI 활용 이미지 에디팅 전문가입니다. 사용자의 원본 요청(ask)을 바탕으로 아래의 요소를 추출하세요.
main_prompt: "A text prompt to generate the image. If you omit this field, the model will remove elements inside the masked area. They will be replaced with a seamless extension of the image background."
mask_prompt: "A natural language text prompt that describes the regions of the image to edit."
negative_prompt: "A text prompt to define what not to include in the image."
</task>

<instruction>
우선순위에 따라 요청을 체계적으로 재구성하세요:
1. 사용자의 원본 요청(ask)이 최우선 고려사항입니다.
2. mask_prompt는 꼭 추출되어야 하며, main_prompt, negative_prompt는 옵션입니다.
3. 모든 요소들이 자연스럽게 통합되도록 조정하세요.
</instruction>

<output_format>
반드시 다음 형식의 JSON만 반환하고 설명이나 추가 텍스트를 포함하지 마세요:

{
    "ask_repo": "재구성된 요청",
}
</output_format>
'''

또한 추가로 Amazon Nova의 마스크 기반 인페인팅/아웃페인팅 기능도 추가했습니다. 텍스트 기반 인페인팅 기술과 유사하지만, 마스크를 아래의 UI/UX로 받기에 이미지 생성을 위한 main_prompt, 특정 부분을 삭제하기 위한 negative_prompt를 자동으로 추출할 수 있도록 아래와 같은 system prompt를 사용헀습니다.

마스크 기반 인페인팅 프롬프트:

'''
<task>
추출된 시각 요소들을 활용하여 이미지 inpainting 모델 {image_model}에 최적화된 고품질 프롬프트를 생성하세요.
</task>

<instruction>
이미지 생성 프롬프트 전문가로서, 다음 원칙에 따라 최적의 프롬프트를 구성하세요:

1. 이미지 캡션 형태로 작성
    - 명령문("~해줘", "~그려줘")이나 대화체 표현을 완전히 제거
    - 모든 설명은 영어로 변환
    - 묘사적이고 구체적인 명사구/형용사구 사용

2. {image_model} 최적화 전략:
    - nova-canvas 최적화:
        * 구체적이고 정확한 시각적 설명
        * 해상도, 렌더링 품질 관련 키워드 추가
        * 세부 묘사를 중심으로 구성

3. 프롬프트 구성 원칙:
    - 중요 요소를 문장 앞쪽에 배치
    - 콤마(,)로 구분하여 요소 간 가중치 균형 유지
    - 핵심 시각적 요소에 대한 디테일 강화
    - 부정 표현("no", "not", "without" 등)은 사용하지 말고 negative_prompt 필드에 배치

4. 프롬프트 길이는 1024자 이내로 유지하세요.
</instruction>

<output_format>
DO NOT include any text or json symbol (```json```)outside the JSON format in the response
다음 형식의 JSON으로만 응답하세요:
{{
    "image_prompt": 
    {{
        "main_prompt": "재구성된 이미지 캡션 형태의 프롬프트",
        "negative_prompt": "제외할 요소들"
    }}
}}
</output_format>
'''

마스크 기반 아웃페인팅 프롬프트:

'''
<task>
추출된 시각 요소들을 활용하여 이미지 outpainting 모델 {image_model}에 최적화된 고품질 프롬프트를 생성하세요.
</task>

<instruction>
이미지 outpainting 프롬프트 전문가로서, 다음 원칙에 따라 최적의 프롬프트를 구성하세요:

1. 이미지 캡션 형태로 작성
    - 명령문("~해줘", "~그려줘")이나 대화체 표현을 완전히 제거
    - 모든 설명은 영어로 변환
    - 묘사적이고 구체적인 명사구/형용사구 사용

2. {image_model} 최적화 전략:
    - nova-canvas 최적화:
        * 구체적이고 정확한 시각적 설명
        * 해상도, 렌더링 품질 관련 키워드 추가
        * 세부 묘사를 중심으로 구성

3. 프롬프트 구성 원칙:
    - 중요 요소를 문장 앞쪽에 배치
    - 콤마(,)로 구분하여 요소 간 가중치 균형 유지
    - 핵심 시각적 요소에 대한 디테일 강화
    - 부정 표현("no", "not", "without" 등)은 사용하지 말고 negative_prompt 필드에 배치

4. 프롬프트 길이는 1024자 이내로 유지하세요.
</instruction>

<output_format>
DO NOT include any text or json symbol (```json```)outside the JSON format in the response
다음 형식의 JSON으로만 응답하세요:
{{
    "image_prompt": 
    {{
        "main_prompt": "재구성된 이미지 캡션 형태의 프롬프트",
        "negative_prompt": "제외할 요소들"
    }}
}}
</output_format>
'''

이러한 선택적 수정 기능은 전체 이미지를 다시 생성하지 않고도 특정 영역만 정교하게 조정할 수 있는 유연성을 제공합니다. 이러한 기능의 포함을 통해 더욱 풍부한 이미지 편집 기능을 경험하실 수 있습니다.

User Interface

Agentic Text-to-Image 시스템의 UI/UX는 Gradio 를 활용하여 구현되었습니다. Gradio는 오픈 소스 Python 패키지로, 머신러닝 모델이나 API, 또는 일반적인 Python 함수에 대해 손쉽게 데모나 웹 애플리케이션을 제작할 수 있도록 도와줍니다. 특히 Gradio에서 제공하는 이미지 편집 기능(ImageEditor)을 사용하면, 사용자가 인페인팅(Inpainting) 및 아웃페인팅(Outpainting) 과 같은 세부 커스터마이징(Customization) 기법을 사용할 때 필요한 Segmentation mask를 직관적으로 생성할 수 있어 편리합니다.
Gradio를 활용하여 구현된 (데모) 웹 애플리케이션에서는 해당 기술 블로그에서 제시한 방법론을 차례대로 테스트해볼 수 있습니다.
먼저 Generate Image 탭에서 Agentic Text-to-Image 시스템을 통해 텍스트 프롬프트로 이미지를 생성합니다. Agentic Text-to-Image 시스템은 사용자가 입력한 프롬프트를 기반으로 이미지 생성 단계를 분해하고, 각 단계 별로 이미지를 생성, 검증 및 개선하는 과정을 반복적으로 거쳐 최종 이미지를 생성합니다.

다음 단계에서는, 생성된 이미지를 세부 커스터마이징 기능을 통해 더욱 정밀하게 조정할 수 있습니다.
이 세부 커스터마이징은 크게 두 가지 방식으로 제공됩니다:

  • 텍스트 기반 인페인팅/아웃페인팅은 사용자가 입력한 텍스트 프롬프트를 바탕으로, 이미지 생성 모델이 자동으로 수정이 필요한 영역을 추하여 해당 영역을 자연스럽게 대체하거나 확장합니다.
  • 반면, 마스크 이미지 기반 인페인팅/아웃페인팅은 사용자가 직접 수정할 영역을 마스크 이미지로 지정하며, 해당 마스크와 텍스트 프롬프트를 함께 제공하여 이미지 생성 모델이 보다 정밀한 편집을 수행하도록 합니다.

Edit by Text 탭에서는 텍스트 기반의 편집을 수행할 수 있습니다. Agentic Text-to-Image 시스템을 통해 생성한 이미지와 함께 해당 이미지에서 어느 부분을 어떻게 수정하고 싶은지를 텍스트 프롬프트로 입력하면 됩니다.

Edit by Mask 탭에서는 마스크 이미지 기반의 편집을 지원합니다. Agentic Text-to-Image 시스템으로 생성된 이미지 (또는 텍스트 기반 편집을 거친 이미지)에 대해, Gradio의 이미지 편집 기능을 활용하여 수정할 영역에 대한 마스크를 직접 지정하고, 해당 영역을 어떻게 수정하고 싶은지를 텍스트 프롬프트로 입력하면 됩니다.

결과

1. Agentic Text-to-Image – Example 1

<VoD> https://www.youtube.com/watch?v=mLu5U6C80uw

이 기술 데모는 “미래 도시의 한 공원 가운데서 작은 로봇과 아이가 축구공을 가지고 함께 놀고 있음. 주변에는 첨단 기술의 건물들이 존재함. 공중에 작은 드론 1대가 날고 있음. 애니메이션 스타일로 그려줘”라는 프롬프트를 바탕으로 “Agentic Text-to-Image” 시스템을 통해 이미지가 생성되는 과정을 보여주는 데모입니다.

이 프롬프트의 영어 버전에 해당하는 “A small robot and a child are playing together with a soccer ball in the middle of a park in a futuristic city. There are high-tech buildings around. A small drone is flying in the air. Draw it in an anime style.” 를 바탕으로 에이전트 없이 바로 생성했을 때 복잡한 요구사항을 제대로 반영하지 못하는 모습입니다.

이를 해결하기 위해 에이전트는 원래 프롬프트를 아래의 두단계로 나누어 계획(Planning)했습니다.

  1. “첨단 기술로 둘러싸인 중앙에서 축구공을 가지고 노는 어린이와 작은 로봇을 주요 주제로 미래형 도시 공원 풍경“ – 기본 배경과 주요 주체를 설정하는 단계
  2. “초현대적인 공원 환경에서 어린이와 로봇이 축구공을 가지고 노는 모습을 유지하면서 공중에 소형 드론 추가” – 세부 요소를 추가하는 단계

첫 번째 단계에서는 프롬프트를 잘 반영한 이미지가 생성되어 검증 과정을 통과했습니다.


그러나 두 번째 단계에서는 축구공이 사라져 프롬프트의 요구사항을 모두 반영하지 못했고, 이를 검증(Reflection) 과정에서 발견하여 재생성 과정을 거쳤습니다.


이러한 체계적인 검증과 수정 과정을 통해 최종적으로 프롬프트의 모든 복잡한 요구사항(로봇, 아이, 축구공, 첨단 건물, 드론)과 스타일(애니메이션)을 정확히 반영한 이미지가 성공적으로 생성되었습니다.

위의 예시는 Amazon Nova Canvas를 활용한 텍스트 인페인팅 예시입니다. Amazon Nova Canvas 모델의 텍스트 기반 에디팅 방식을 통해, “축구공을 첨단 느낌의 축구공으로 수정해줘”라는 프롬프트를 입력했을 때, 위 그림과 같이 일반 축구공을 미래적인 첨단 스타일의 축구공으로 자연스럽게 변경하는 모습을 확인할 수 있습니다.

위 예시는 Amazon Nova Canvas의 마스크 기반 인페인팅 기능을 통해 공중의 드론을 이미지의 조화를 해치지 않으면서 깔끔하게 제거되는 것을 보실 수 있습니다.

2. Agentic Text-to-Image – Example 2

이 이미지는 “얼음의 풍경. 끝없이 펼쳐진 눈 덮인 산봉우리들의 광활한 전경. 그 아래로 울창한 숲과 거대한 얼음호수가 자리잡고 있다. 호수 위에서 사람들이 세 척의 배를 타고 항해하고 있다. 호수에서 멀지 않은 곳에서 화산이 분출을 예고하고 있다. 화산의 끊임없는 에너지를 받아 더욱 강해진 사나운 붉은 용이세상을 호령하고 있다. 유화로 그려줘” 라는 복잡한 프롬프트로 생성한 이미지 입니다. 언뜻 보면 잘 생성된 것처럼 보이나, “세척의 배”, “화산의 끈임없는 에너지를 받아 더욱 강해진 사나운 붉은 용이 세상을 호령하고 있다”라는 요구사항이 반영되지 않은 것을 확인하실 수 있습니다.

위 프롬프트로 “Agentic Text-to-Image” 시스템을 통해 이미지를 생성하면 먼저 3가지 단계로 나누고 각 단계 별로 이미지 생성 후 검증 및 개선 단계를 거칩니다.

첫번째 단계에서는 “얼음의 풍경. 끝없이 펼쳐진 눈 덮인 산봉우리들의 광활한 전경. 그 아래로 울창한 숲과 거대한 얼음호수가 자리잡고 있다.” 프롬프트로 위와 같은 이미지가 생성되었습니다.

두번째 단계에서는 “호수 위에서 사람들이 세 척의 배를 타고 항해하고 있다. 호수에서 멀지 않은 곳에서 화산이 분출을 예고하고 있다.” 프롬프트로 위와 같은 이미지가 생성되었습니다.

세번째 단계에서는 “화산의 끊임없는 에너지를 받아 더욱 강해진 사나운 붉은 용이 세상을 호령하고 있다.” 프롬프트로 위와 같은 이미지가 생성되었습니다.

세번째 단계까지 지난 이미지를 검토 했을 때 배가 1척 밖에 없어서 3척으로 변경하는 과정을 거치게 되고 최종적으로 위와 같은 복잡한 프롬프트이 요구사항이 모두 반영된 이미지가 생성되는 것을 확인하실 수 있습니다.

이러한 Agentic 접근법은 텍스트-이미지 생성 과정에서 흔히 발생하는 속성 바인딩 문제, 공간적 관계 표현의 어려움, 미세한 디테일 조정의 한계와 같은 근본적인 문제들을 생성 모델 자체를 수정하지 않고도 효과적으로 해결합니다. 복잡한 프롬프트를 체계적으로 분해하고, 단계적으로 이미지를 생성하며, 각 단계마다 검증과 수정 과정을 거치는 이 방법론은 디자이너, 아티스트, 마케터를 비롯한 다양한 사용자의 복합적인 이미지 생성 요구사항을 더 정확하고 효율적으로 충족시킬 수 있는 실용적인 솔루션을 제시합니다. 또한 본 데모는 Amazon Nova를 기반으로 한 다양한 편집 기능들도 추가하여 이미지 생성뿐만 아니라 이미지 에디팅 관련 작업들도 한국어 기반으로 원스톱으로 가능하게 한 통합 솔루션의 가능성을 보여줍니다. 아래는 그에 대한 데모 영상입니다.

3. Agentic Text-to-Image – Text inpainting

<VoD> https://www.youtube.com/watch?v=e3Q5S_rbIjg

4. Agentic Text-to-Image – Mask inpainting

<VoD> https://www.youtube.com/watch?v=iCr4M0ji74U

결론

기존의 텍스트-이미지 생성 모델은 복잡한 프롬프트를 정확히 반영하는 데 한계가 있었습니다. 이로 인해 사용자들은 원하는 이미지를 얻기 위해 여러 번의 재시도와 프롬프트 수정을 해야 했고, 이는 상당한 비효율을 초래했습니다.

Agentic Text2Image 접근법은 LLM의 리즈닝 능력을 활용하여 복잡한 프롬프트를 분해하고, 단계적으로 이미지를 생성하며, 각 단계마다 검증 및 수정을 통해 점진적으로 개선된 결과를 얻는 방식으로 이러한 문제를 해결합니다. 주목할 점은 이 접근법이 생성 모델 자체를 개선하기보다는, 기존 모델들의 강점을 체계적으로 활용하는 실용적 워크플로우를 통해 문제를 해결한다는 것입니다. 이는 사용자의 의도를 더 정확히 반영하는 이미지 생성을 가능하게 하며, 모델 아키텍처의 근본적 변화 없이도 현저한 성능 향상을 이끌어냅니다. Agentic Text2Image 시스템은 더 직관적이고 효율적인 이미지 생성 경험을 제공함으로써, 크리에이터와 일반 사용자 모두에게 더 나은 도구가 될 것입니다.

Reference

[1] Proactive Agents for Multi-Turn Text-to-Image Generation Under Uncertainty (Google DeepMind, 2024)

[2] GenArtist: Multimodal LLM as an Agent for Unified Image Generation and Editing (2024)

[3] Object-Attribute Binding in Text-to-Image Generation: Evaluation and Control (Trusca et al., 2024)

[4] Improving Compositional Attribute Binding in Text-to-Image Generative Models via Enhanced Text Embeddings (Zarei et al., 2024)

[5] Linguistic Binding in Diffusion Models: Enhancing Attribute Correspondence through Attention Map Alignment (Rassin et al., 2023)

[6] Controllable Generation with Text-to-Image Diffusion Models: A Survey (Pu et al., 2024)

[7] Benchmarking Spatial Relationships in Text-to-Image Generation (Gokhale et al., 2022)

[8] Getting it Right: Improving Spatial Consistency in Text-to-Image Models (Chatterjee et al., 2024)

[9] CoMPaSS: Enhancing Spatial Understanding in Text-to-Image Diffusion Models (Zhang et al., 2024)

[10] Diffusion models in text generation: a survey (Yi et al., 2024)

[11] High-Resolution Image Synthesis with Latent Diffusion Models (Rombach et al., 2021)

Dongjin Jang, Ph.D.

Dongjin Jang, Ph.D.

장동진 AIML 스페셜리스트 솔루션즈 아키텍트는 데이터 사이언티스트 경험을 바탕으로 고객의 머신러닝 기반 워크로드를 도와드리고 있습니다. 추천 시스템, 이상탐지 및 수요 예측과 같은 다양한 분야에 대한 고민을 고객과 함께 해결 하였고, 최근에는 생성형 AI을 통해 고객의 혁신을 지원하고 있습니다.

Hasun Yu, Ph.D.

Hasun Yu, Ph.D.

류하선 AIML 스페셜리스트 솔루션즈 아키텍트는 바이오·제약 분야에서 AIML 모델 연구 개발과 활용에 풍부한 경험을 보유한 전문가로, 현재는 AWS에서 GenAI를 포함한 첨단 AWS AI/ML 서비스를 도입을 지원하고 있습니다.

Jiyu Kim

Jiyu Kim

김지유 Analytics 스페셜리스트 솔루션즈 아키텍트는 클라우드 기반 데이터 분석 및 데이터 플랫폼 구축에 관심을 가지고, 고객의 데이터 기반 의사결정과 비즈니스 혁신을 기술적으로 지원하고 있습니다. 최근에는 생성형 AI를 활용한 데이터 활용 방식의 고도화에도 집중하고 있습니다.