이미지 생성 프롬프트 반복

이미지 생성 프롬프트 반복 (Image Generation Prompt iteration)

이 튜토리얼은 @ThorondorLLC의 트윗을 기반으로 해요.

트윗은 여기에서 볼 수 있어요.

이 튜토리얼은 초기 원하는 프롬프트를 받아, 생성된 이미지가 원하는 프롬프트와 일치할 때까지 반복적으로 프롬프트를 개선해요.

이것은 일반적으로 쓰이는 방식 그대로의 DSPy 프롬프트 최적화는 아니지만, 멀티모달 DSPy를 사용하는 좋은 예시예요.

향후 업그레이드로는 프롬프트 생성을 최적화하기 위한 초기·최종 프롬프트의 데이터셋을 만드는 것이 있습니다.

출처: 문서

본문

먼저 필요한 라이브러리를 설정해 볼게요. dspy.Image와 FAL 이미지 생성 API를 사용합니다:

# Optional
#os.environ["FAL_API_KEY"] = "your_fal_api_key"
#os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
import dspy

from PIL import Image
from io import BytesIO
import requests
import *** dotenv import load_dotenv
load_dotenv()

# import display
from IPython.display import display

lm = dspy.LM(model="gpt-4o-mini", temperature=0.5)
dspy.configure(lm=lm)

이미지 생성과 표시를 위한 헬퍼 함수를 정의해 볼게요:

def generate_image(prompt):

    request_id = fal_client.submit(
        "fal-ai/flux-pro/v1.1-ultra",
        arguments={
            "prompt": prompt
        },
    ).request_id

    result = fal_client.result("fal-ai/flux-pro/v1.1-ultra", request_id)
    url = result["images"][0]["url"]

    return dspy.Image(url)

def display_image(image):
    url = image.url
    # download the image
    response = requests.get(url)
    image = Image.open(BytesIO(response.content))

    # display at 25% of original size
    display(image.resize((image.width // 4, image.height // 4)))

핵심 아이디어는 check_and_revise_prompt라는 DSPy 모듈을 사용해, 생성된 이미지가 원하는 프롬프트와 일치하는지 검사하고, 일치하지 않으면 개선된 프롬프트를 생성하는 것입니다. 이 과정을 최대 반복 횟수까지 반복해요:

check_and_revise_prompt = dspy.Predict("desired_prompt: str, current_image: dspy.Image, current_prompt:str -> feedback:str, image_strictly_matches_desired_prompt: bool, revised_prompt: str")

initial_prompt = "A scene that's both peaceful and tense"
current_prompt = initial_prompt

max_iter = 5
for i in range(max_iter):
    print(f"Iteration {i+1} of {max_iter}")
    current_image = generate_image(current_prompt)
    result = check_and_revise_prompt(desired_prompt=initial_prompt, current_image=current_image, current_prompt=current_prompt)
    display_image(current_image)
    if result.image_strictly_matches_desired_prompt:
        break
    else:
        current_prompt = result.revised_prompt
        print(f"Feedback: {result.feedback}")
        print(f"Revised prompt: {result.revised_prompt}")

print(f"Final prompt: {current_prompt}")

루프가 끝나면, 최종 프롬프트가 원하는 이미지와 일치하는 이미지를 생성하게 됩니다. 각 반복에서 DSPy는 생성된 이미지를 시각적으로 평가하고, 멀티모달 모델이 이미지가 원하는 프롬프트를 엄격히 충족하는지 판단하며, 그렇지 않으면 피드백 기반의 개선된 프롬프트를 제안해요.

반복 과정에서 모델이 어떻게 판단했는지 확인하려면 LLM 호출 히스토리를 검사할 수 있어요:

dspy.inspect_history(5)

더 알아보기 (Learn more)