OpenAI 이미지 생성

OpenAI 이미지 생성 (OpenAI Image Generation)

Spring AI는 OpenAI의 이미지 생성 모델인 DALL-E를 지원해요. 이 글에서는 API 키 설정, 자동 설정, 이미지 관련 프로퍼티, 런타임 옵션, 그리고 HTTP 클라이언트 커스터마이징까지 알아볼게요.

출처: 문서

본문

Spring AI는 OpenAI의 이미지 생성 모델인 DALL-E를 지원해요.

__ 2.0.0-M5 버전부터 Spring AI는 모든 OpenAI 모델을 위해 내부적으로 공식 openai-java SDK를 사용해요. 전환은 매끄러울 것으로 예상되며, OpenAI API 프로퍼티와 빌더의 기존 사용자에게는 호환성이 깨지는 변경이 없어요. 문제를 발견하면 Spring AI GitHub Issues로 알려주세요.

Prerequisites

ChatGPT 모델에 접근하려면 OpenAI로 API 키를 만들어야 해요.

OpenAI signup page에서 계정을 만들고 API Keys page에서 토큰을 생성하세요.

Spring AI 프로젝트는 spring.ai.openai.api-key라는 구성 프로퍼티를 정의하는데, 여기에 openai.com에서 얻은 API Key 값을 설정해야 해요.

이 구성 프로퍼티를 application.properties 파일에 설정할 수 있어요:

spring.ai.openai.api-key=<your-openai-api-key>

API 키 같은 민감한 정보를 다룰 때 보안을 강화하려면, Spring Expression Language(SpEL)를 사용해 커스텀 환경 변수를 참조할 수 있어요:

# In application.yml
spring:
  ai:
    openai:
      api-key: ***

# In your environment or .env file
export OPENAI_API_KEY=<your-openai-api-key>

또한 애플리케이션 코드에서 프로그래밍 방식으로 이 구성을 설정할 수도 있어요:

// Retrieve API key from a secure source or environment variable
String apiKey = System.getenv("OPENAI_API_KEY");

Auto-configuration

__ Spring AI 자동 설정과 스타터 모듈 아티팩트 이름에 큰 변경이 있었어요. 자세한 내용은 upgrade notes를 참고해주세요.

Spring AI는 OpenAI Image Generation Client에 대한 Spring Boot 자동 설정을 제공해요. 활성화하려면 프로젝트의 Maven pom.xml 파일에 다음 의존성을 추가하세요:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

또는 Gradle build.gradle 빌드 파일에 추가할 수도 있어요:

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-openai'
}
__ 빌드 파일에 Spring AI BOM을 추가하려면 Dependency Management 섹션을 참고해주세요.

Image Generation Properties

Connection Properties

프리픽스 spring.ai.openai는 OpenAI에 연결할 수 있게 해주는 프로퍼티 프리픽스예요.

Property Description Default
spring.ai.openai.base-url 연결할 URL api.openai.com
spring.ai.openai.api-key API 키 -
spring.ai.openai.organization-id 선택적으로 API 요청에 사용할 조직을 지정할 수 있어요. -
spring.ai.openai.project-id 선택적으로 API 요청에 사용할 프로젝트를 지정할 수 있어요. -
spring.ai.openai.timeout OpenAI 클라이언트의 요청 타임아웃. 60 sec.
spring.ai.openai.max-retries OpenAI 클라이언트의 최대 재시도 횟수. 3
spring.ai.openai.proxy OpenAI 클라이언트의 프록시 설정. -
spring.ai.openai.custom-headers OpenAI 클라이언트 요청에 추가할 커스텀 HTTP 헤더. empty
spring.ai.openai.connection-pool-metrics-enabled 기저 OkHttp 클라이언트의 연결 풀 메트릭을 활성화할지 여부. false
__ 여러 조직에 속한 사용자(또는 레거시 사용자 API 키로 프로젝트에 접근하는 사용자)의 경우, 선택적으로 API 요청에 사용할 조직과 프로젝트를 지정할 수 있어요. 이 API 요청의 사용량은 지정된 조직과 프로젝트의 사용량으로 집계돼요.

Retry Properties

프리픽스 spring.ai.retry는 OpenAI Image 클라이언트의 재시도 메커니즘을 구성할 수 있게 해주는 프로퍼티 프리픽스예요.

Property Description Default
spring.ai.retry.max-attempts 최대 재시도 횟수. 10
spring.ai.retry.backoff.initial-interval 지수 백오프 정책의 초기 대기 시간. 2 sec.
spring.ai.retry.backoff.multiplier 백오프 간격 배수. 5
spring.ai.retry.backoff.max-interval 최대 백오프 시간. 3 min.
spring.ai.retry.on-client-errors false면 4xx 클라이언트 오류 코드에 대해 NonTransientAiException을 던지고 재시도하지 않음 false
spring.ai.retry.exclude-on-http-codes 재시도를 유발하지 않아야 하는 HTTP 상태 코드 목록 (예: NonTransientAiException을 던지기 위해). empty
spring.ai.retry.on-http-codes 재시도를 유발해야 하는 HTTP 상태 코드 목록 (예: TransientAiException을 던지기 위해). empty

Configuration Properties

__ 이미지 자동 설정의 활성화/비활성화는 이제 프리픽스 spring.ai.model.image이 붙은 최상위 프로퍼티로 설정해요. 활성화하려면 spring.ai.model.image=openai (기본값으로 활성화됨). 비활성화하려면 spring.ai.model.image=none (또는 openai와 일치하지 않는 어떤 값). 이 변경은 여러 모델의 설정을 허용하기 위한 것이에요.

프리픽스 spring.ai.openai.image는 OpenAI의 ImageModel 구현을 구성할 수 있게 해주는 프로퍼티 프리픽스예요.

Property Description Default
spring.ai.openai.image.enabled (제거됨, 더 이상 유효하지 않음) OpenAI 이미지 모델 활성화. true
spring.ai.model.image OpenAI 이미지 모델 활성화. openai
spring.ai.openai.image.base-url 선택적으로 spring.ai.openai.base-url을 재정의하여 채팅 전용 URL 제공 -
spring.ai.openai.image.api-key 선택적으로 spring.ai.openai.api-key를 재정의하여 채팅 전용 api-key 제공 -
spring.ai.openai.image.organization-id 선택적으로 API 요청에 사용할 조직을 지정할 수 있어요. -
spring.ai.openai.image.project-id 선택적으로 API 요청에 사용할 프로젝트를 지정할 수 있어요. -
spring.ai.openai.image.n 생성할 이미지 수. 1에서 10 사이여야 해요. dall-e-3의 경우 n=1만 지원돼요. -
spring.ai.openai.image.model 이미지 생성에 사용할 모델. ImageModel.GPT_IMAGE_1_MINI.toString()
spring.ai.openai.image.quality 생성될 이미지의 품질. HD는 이미지 전반에 걸쳐 더 세밀한 디테일과 더 큰 일관성의 이미지를 만들어요. 이 매개변수는 dall-e-3에서만 지원돼요. -
spring.ai.openai.image.response_format 생성된 이미지가 반환되는 형식. URL 또는 b64_json 중 하나여야 해요. -
spring.ai.openai.image.size 생성된 이미지의 크기. dall-e-2의 경우 256x256, 512x512, 1024x1024 중 하나여야 해요. dall-e-3 모델의 경우 1024x1024, 1792x1024, 1024x1792 중 하나여야 해요. -
spring.ai.openai.image.size_width 생성된 이미지의 너비. dall-e-2의 경우 256, 512, 1024 중 하나여야 해요. -
spring.ai.openai.image.size_height 생성된 이미지의 높이. dall-e-2의 경우 256, 512, 1024 중 하나여야 해요. -
spring.ai.openai.image.style 생성된 이미지의 스타일. vivid 또는 natural 중 하나여야 해요. Vivid는 모델이 초현실적이고 극적인 이미지를 생성하도록 기울게 해요. Natural은 모델이 더 자연스럽고 덜 초현실적으로 보이는 이미지를 생성하게 해요. 이 매개변수는 dall-e-3에서만 지원돼요. -
spring.ai.openai.image.user 최종 사용자를 나타내는 고유 식별자로, OpenAI가 남용을 모니터링하고 감지하는 데 도움이 될 수 있어요. -
__ 공통 spring.ai.openai.base-url, spring.ai.openai.api-key, spring.ai.openai.organization-id, spring.ai.openai.project-id 프로퍼티를 재정의할 수 있어요. spring.ai.openai.image.base-url, spring.ai.openai.image.api-key, spring.ai.openai.image.organization-id, spring.ai.openai.image.project-id 프로퍼티가 설정되면 공통 프로퍼티보다 우선해요. 서로 다른 모델과 서로 다른 모델 엔드포인트에 서로 다른 OpenAI 계정을 사용하려 할 때 유용해요.
__ spring.ai.openai.image.options 프리픽스가 붙은 모든 프로퍼티는 런타임에 재정의할 수 있어요.

Runtime Options

OpenAiImageOptions.java는 사용할 모델, 품질, 크기 등 모델 구성을 제공해요.

시작 시 기본 옵션은 OpenAiImageOptions를 OpenAiImageModel 생성자에 전달해 구성할 수 있어요. 또는 앞서 설명한 spring.ai.openai.image.* 프로퍼티를 사용할 수도 있어요.

런타임에는 ImagePrompt 호출에 새 요청별 옵션을 추가해 기본 옵션을 재정의할 수 있어요. 예를 들어 quality와 생성할 이미지 수 같은 OpenAI 특정 옵션을 재정의하려면 다음 코드 예시를 사용하세요:

ImageResponse response = openaiImageModel.call(
        new ImagePrompt("A light cream colored mini golden doodle",
        OpenAiImageOptions.builder()
                .quality("hd")
                .n(4)
                .height(1024)
                .width(1024).build())

);
__ 모델별 OpenAiImageOptions에 더해, ImageOptionsBuilder#builder()로 만든 이식 가능한 ImageOptions 인스턴스를 사용할 수도 있어요.

Customizing the HTTP Client

Spring AI는 내부적으로 공식 openai-java SDK를 사용하며, SpringAiOpenAiHttpClient.Builder가 만든 커스텀 OkHttp 클라이언트로 HTTP 전송을 구성해요. 기저 OkHttpClient가 생성되기 전에 하나 이상의 OpenAiHttpClientBuilderCustomizer 빈을 노출해서 그 빌더를 가로챌 수 있어요. 각 커스터마이저는 모든 OpenAI 모델(chat, embedding, image, audio, moderation)이 사용하는 동일한 빌더를 받으므로, 커스터마이징이 균일하게 적용돼요.

@FunctionalInterface
public interface OpenAiHttpClientBuilderCustomizer {
    void customize(SpringAiOpenAiHttpClient.Builder builder);
}

전형적인 사용 사례:

  • OkHttp Interceptor 인스턴스 등록 (인증, 전파 헤더, 커스텀 로깅);

  • 디스패처 ExecutorService 교체 (예: 비동기 I/O를 가상 스레드로 라우팅);

  • 빌더가 노출하는 프록시, SSL, 호스트 이름 검증, 연결 풀 크기 구성.

커스터마이저가 여러 개 있으면 @Order / Ordered 순서로, Spring AI 기본값 이후에 적용되므로 사용자 코드가 우선해요.

OpenAi*Model.Builder를 통해 모델을 수동으로 연결할 때도 동일한 훅을 사용할 수 있어요:

var chatModel = OpenAiChatModel.builder()
    .options(OpenAiChatOptions.builder().model("gpt-4o").build())
    .httpClientBuilderCustomizer(myCustomizer)
    .build();

더 알아보기 (Learn more)