SpringAI는 ChatClient, Advisors, Prompt, Model, Structured Output을 통해 AI 대화 흐름을 스프링 방식으로 구성하게 해주는 프레임워크이다. 대화, RAG, 객체 변환까지 백엔드 로직 안에서 일관되게 처리할 수 있다.
@RestController
class MyController {
private final ChatClient chatClient;
public MyController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/ai")
String generation(String userInput) {
return this.chatClient
.prompt() // prompt() 메서드를 시작으로 전체 대화 과정을 제어
.user(userInput)
.call()
.content();
}
}
ChatMemory chatMemory = ...
VectorStore vectorStore = ...
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(
MessageChatMemoryAdvisor.builder(chatMemory).build(), // chat memory
QuestionAnswerAdvisor.builder(vectorStore).build() // RAG
)
.build();
var converationId = "123";
String response = this.chatClient.prompt()
.advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, converstionId))
.user("지난번에 물어본 장소의 날씨 다시 알려줘")
.call()
.content();
List<Message> : 대화의 맥락을 구성하는 여러 종류의 메시지 묶음ChatOptions : 온도, 사용할 모델명과 같은 AI 실행 옵션Prompt 안에 담기는 Message는 역할에 따라 4가지 타입이 존재한다.
유저의 질문 구조는 고정되어 있지 않다. 유저의 입력값에 따라 질문 내용이 매번 바뀌어야 하므로 PromptTemplate을 사용한다. 자바 웹 개발시 사용하는 타임리프처럼 프롬프트 중간에 구멍({변수명})을 뚫어놓고 실행 시점에 값을 채워 넣는 기능이다.
// 1. 구멍이 뚫려 있는 템플릿 문자열 준비
String templateText = "초보자를 위해 {topic}의 핵심 개념을 3줄로 요약해줘";
PromptTemplate promptTemplate = new PromptTemplate(templateText);
// 2. 런타임 변수 값을 MAP으로 매핑하여 완전한 Prompt 객체 생성
Map<String, Object> variables = Map.of("topic", "SpringAI의 PromptTemplate");
Prompt prompt = promptTemplate.create(variables);
// 3. AI 모델에 전달
ChatResponse response = chatModel.call(prompt);
application.yml과 같은 설정 파일에서 API 키와 의존성 라이브러리만 교체하여 사용 가능AI가 처리할 수 있는 데이터의 형태에 따라 인터페이스가 나누어져 있다.
위 4가지 타입 외에도 더 있으니 참고!
JSON 스키마 규격에 맞춰 응답이라는 지시문을 합성하여 보내는 방식response_format: {type : "json_object"}라는 JSON 전용 하드웨어 스위치를 켜서 사용하는 방식