본문 바로가기
개발

Spring AI에 대해

by hxxyeoniii 2025. 10. 10.

Spring AI란?

> Spring 개발자들을 위한 LLM 통합 도구

> Open AI, Anthropic, GoogleAI와 같은 다양한 벤더 모델을 하나의 공통된 방식으로 다룰 수 있도록 도와주는 프레임워크

> 단순 LLM 호출을 넘어, 엔터프라이즈 환경에서 AI 기능을 자연스럽게 녹여낼 수 있도록 설계됨

 

 

 

왜 Spring AI를 써야 하나?

1. 익숙한 방식으로 AI 활용

: Spring AI는 ChatClient, EmbeddingClient와 같은 컴포넌트를 통해 모델 호출을 마치 HTTP 요청을 보내듯 간단히 처리 가능

: 설정도 application.properties에 추가하면 끝!

 

2. 여러 모델을 같은 코드로 한 번에

: gpt -> claude로 바꾸고 싶어도 상관 X

: 다양한 모델을 일관되게 요청 가능

 

3. 벡터 저장소 걱정 X

: 텍스트를 청크로 나누고, 벡터화해 저장하고 .. 이걸 Spring AI가 알아서 도와줌

: RAG 흐름 구성에 필요한 기능을 기본으로 제공

 

4. 핫한 기능 지원!

: MCP, Function Calling, Prompt Template 등을 프레임워크 차원에서 기본으로 지원

 

 

 

Spring AI의 추상화 방식과 구조

1. 프롬프트를 관리해주는 Prompt & ChatOptions

 

1) Prompt 클래스 : Spring AI에서 모델에 보낼 메시지와 모델 파라미터 옵션 ChatOptions을 감싸는 역할

public class Prompt implements ModelRequest<List<Message>> {
    private final List<Message> messages;
    private ChatOptions modelOptions;

    @Override
    public ChatOptions getOptions() {...}

    @Override
    public List<Message> getInstructions() {...}
}

 

2) ChatOptions : LLM 호출 시 사용할 다양한 파라미터를 정의한 인터페이스

public interface ChatOptions extends ModelOptions {
 String getModel();
 
 Float getFrequencyPenalty(); // frequencyPenalty
 Integer getMaxTokens(); // maxTokens
 Float getPresencePenalty(); // presencePenalty
 List<String> getStopSequences(); // stopSequences
 Float getTemperature(); // temperature
 Integer getTopK(); // topK
 Float getTopP(); // topP
 
 ChatOptions copy();
}

 

-> 제공하는 속성(maxTokens, temperature 등)은 벤더 간 자동 변환

 

예시) OpenAI의 stop vs Anthropic의 stop_sequences 같은 차이를 Spring AI가 알아서 처리

import org.springframework.ai.chat.prompt.ChatOptions

val openAIChatOptions = ChatOptions.builder()
            .model("gpt-3.5-turbo")
            .temperature(0.7)
            .stopSequences(listOf("\n")) // OpenAI의 'stop' 매개변수로 자동 변환
            .build() 

val anthropicChatOptions = ChatOptions.builder()
            .model("claude-3-7-sonnet-20250219")
            .temperature(0.7)
            .stopSequences(listOf("\n")) // Anthropic의 'stop_sequences' 매개변수로 자동 변환
            .build()

 

 

 

2. Spring AI의 주요 추상화 계층인 ChatModel

ChatModel : LLM과의 기본적인 상호작용을 담당하는 인터페이스

public interface ChatModel extends Model<Prompt, ChatResponse> {

 default String call(String message) {...}

 @Override
 ChatResponse call(Prompt prompt);
}

 

-> ChatModel 인터페이스를 구현한 클래스의 결과는 ChatResponse라는 공통된 응답 객체로 리턴

-> 이 안에는 모델의 출력 메시지, 사용된 프롬프트, 모델 파라미터, 응답 시간 등의 메타 정보 포함

 

* 내부 동작 순서

1) 입력으로 받은 Prompt를 벤더의 API 형식에 맞게 변환

2) 변환된 메시지를 사용해 벤더 API 호출

3) 벤더로부터 받은 응답을 ChatResponse 형식으로 변환해 반환

 

 

 

 

 

출처 : https://blog.sionic.ai/spring-ai-series-1