
이 글은 유튜브 개발자 유미 영상을 바탕으로 개인적인 정리를 위해 작성한 글입니다.
https://www.youtube.com/watch?v=-g6goXtCilM&list=PLJkjrxxiBSFCgcsP_pzuntmqC3AlTMWFx
스프링 AI : OpenAI
스프링 AI 의존성들을 활용하기 위한 스프링 부트 프로젝트를 생성한다. 첫번째 의존성 활용은 OpenAI이다.
스프링부트 기반의 웹 서비스를 구축하며, 그 웹 서비스에서 OpenAI의 서비스가 필요한 경우,
기존에 RestTemplate, WebClient와 같은 API 호출 클라이언트를 통해 모든 과정을 작성해야했다.
하지만 OpenAI 의존성만 사용하면 위 과정들을 추상화하여 사용할 수 있다.
OpenAI 클라이언트 등록
OpenAI API를 활용하기 위한 Bean (API 키) 등록을 해야한다.
- 1단계 API 키 발급 받기
OpenAI API Platform에 가서 키를 발급 받아야한다.
- application.properties에 키를 등록 : 스프링 AI OpenAI 클라이언트에서 사용
spring.ai.openai.api-key=${OPENAI_API_KEY}
OpenAI API 제공 서비스
- Chat 모델
- Embedding 모델
- Image 모델 (DALL-E)
- Audio 모델
- TTS
- STT
Service단 : OpenAI API 호출
- 공통 : 클리스 및 의존성
@Service
public class OpenAIService {
private final OpenAiChatModel openAiChatModel;
private final OpenAiEmbeddingModel openAiEmbeddingModel;
private final OpenAiImageModel openAiImageModel;
private final OpenAiAudioSpeechModel openAiAudioSpeechModel;
private final OpenAiAudioTranscriptionModel openAiAudioTranscriptionModel;
// 생성자
}
위의 api 키 등록시 AutoConfig로 OpenAI 관련 @Bean들이 활성화된다.
- Chat 모델 메소드
public String generate(String text) {
// 메시지
SystemMessage systemMessage = new SystemMessage("");
UserMessage userMessage = new UserMessage(text);
AssistantMessage assistantMessage = new AssistantMessage("");
// 옵션
OpenAiChatOptions options = OpenAiChatOptions.builder()
.model("gpt-4.1-mini")
.temperature(0.7)
.build();
// 프롬프트
Prompt prompt = new Prompt(List.of(systemMessage, userMessage, assistantMessage), options);
// 요청 및 응답
ChatResponse response = openAiChatModel.call(prompt);
return response.getResult().getOutput().getText();
}
public Flux<String> generateStream(String text) {
// 메시지
SystemMessage systemMessage = new SystemMessage("");
UserMessage userMessage = new UserMessage(text);
AssistantMessage assistantMessage = new AssistantMessage("");
// 옵션
OpenAiChatOptions options = OpenAiChatOptions.builder()
.model("gpt-4.1-mini")
.temperature(0.7)
.build();
// 프롬프트
Prompt prompt = new Prompt(List.of(systemMessage, userMessage, assistantMessage), options);
// 요청 및 응답
return openAiChatModel.stream(prompt)
.mapNotNull(response -> response.getResult().getOutput().getText());
}
https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html
OpenAI Chat :: Spring AI Reference
Multimodality refers to a model’s ability to simultaneously understand and process information from various sources, including text, images, audio, and other data formats. OpenAI supports text, vision, and audio input modalities. Vision OpenAI models tha
docs.spring.io
- Embedding 모델 메소드
public List<float[]> generateEmbedding(List<String> texts, String model) {
// 옵션
EmbeddingOptions embeddingOptions = OpenAiEmbeddingOptions.builder()
.model(model).build();
// 프롬프트
EmbeddingRequest prompt = new EmbeddingRequest(texts, embeddingOptions);
// 요청 및 응답
EmbeddingResponse response = openAiEmbeddingModel.call(prompt);
return response.getResults().stream()
.map(Embedding::getOutput)
.toList();
}
https://docs.spring.io/spring-ai/reference/api/embeddings/openai-embeddings.html
OpenAI Embeddings :: Spring AI Reference
Spring AI supports the OpenAI’s text embeddings models. OpenAI’s text embeddings measure the relatedness of text strings. An embedding is a vector (list) of floating point numbers. The distance between two vectors measures their relatedness. Small dist
docs.spring.io
- Image 모델 (DALL-E) 메소드
public List<String> generateImages(String text, int count, int height, int width) {
// 옵션
OpenAiImageOptions imageOptions = OpenAiImageOptions.builder()
.quality("hd")
.N(count)
.height(height)
.width(width)
.build();
// 프롬프트
ImagePrompt prompt = new ImagePrompt(text, imageOptions);
// 요청 및 응답
ImageResponse response = openAiImageModel.call(prompt);
return response.getResults().stream()
.map(image -> image.getOutput().getUrl())
.toList();
}
- Audio 모델 메소드
// TTS
public byte[] tts(String text) {
// 옵션
OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder()
.responseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3)
.speed(1.0f)
.model(OpenAiAudioApi.TtsModel.TTS_1.value)
.build();
// 프롬프트
SpeechPrompt prompt = new SpeechPrompt(text, speechOptions);
// 요청 및 응답
SpeechResponse response = openAiAudioSpeechModel.call(prompt);
return response.getResult().getOutput();
}
// STT
public String stt(Resource audioFile) {
// 옵션
OpenAiAudioApi.TranscriptResponseFormat responseFormat = OpenAiAudioApi.TranscriptResponseFormat.VTT;
OpenAiAudioTranscriptionOptions transcriptionOptions = OpenAiAudioTranscriptionOptions.builder()
.language("ko") // 인식할 언어
.prompt("Ask not this, but ask that") // 음성 인식 전 참고할 텍스트 프롬프트
.temperature(0f)
.model(OpenAiAudioApi.TtsModel.TTS_1.value)
.responseFormat(responseFormat) // 결과 타입 지정 VTT 자막형식
.build();
// 프롬프트
AudioTranscriptionPrompt prompt = new AudioTranscriptionPrompt(audioFile, transcriptionOptions);
// 요청 및 응답
AudioTranscriptionResponse response = openAiAudioTranscriptionModel.call(prompt);
return response.getResult().getOutput();
}
https://docs.spring.io/spring-ai/reference/api/audio/transcriptions/openai-transcriptions.html
Untitled :: Spring AI Reference
The OpenAiAudioTranscriptionOptions class provides the options to use when making a transcription. On start-up, the options specified by spring.ai.openai.audio.transcription are used but you can override these at runtime. OpenAiAudioApi.TranscriptResponseF
docs.spring.io
https://docs.spring.io/spring-ai/reference/api/audio/speech/openai-speech.html
OpenAI Text-to-Speech (TTS) :: Spring AI Reference
The OpenAiAudioSpeechOptions class provides the options to use when making a text-to-speech request. On start-up, the options specified by spring.ai.openai.audio.speech are used but you can override these at runtime. OpenAiAudioSpeechOptions speechOptions
docs.spring.io
'Backend > Spring' 카테고리의 다른 글
스프링 AI : 3. 챗봇 Controller, View (3) | 2025.08.02 |
---|---|
스프링 AI : 1. 스프링 AI란? (3) | 2025.07.30 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!