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 형식으로 변환해 반환
'개발' 카테고리의 다른 글
| @Transactional을 붙이면 어떤 일이 일어나는가? (0) | 2025.12.02 |
|---|---|
| ModulePropertiesUtils로 모듈 별 properties 파일 관리하기 (0) | 2025.11.06 |
| Kubernetes로 스프링 프로젝트 배포하기 (0) | 2025.10.03 |
| SSG를 사용한 나만의 블로그 만들기 (0) | 2025.09.08 |
| iframe 접근 오류 : X-Frame Deny (0) | 2025.06.16 |