Spring AI 시작하기
최근(이라기엔 이미 늦었지만) 웬만한 제품에는 AI 라는 키워드가 빠지질 않습니다.
사실 개인적으로는 AI를 접목시킨 제품에 그렇게 메리트를 느끼지 않았습니다.
제가 혁신적이라고 느꼈던 것들은 [ChatGPT, Cursor]같은 AI 플랫폼에 있지 일반적인 웹 서비스에 추가되는 AI 기능이 편리하다고 느낀 적이 없었기 때문입니다. 있다고 해봐야 번역 기능 정도?
하지만 여러 컨퍼런스와 문서, 시장과 제품을 보면 매일매일이 혁신인 것 같습니다.
당장 1, 2년 전만해도 컨퍼런스를 보면 AI라는 키워드는 보통 하드웨어 기반의 제품이 출품되었는데, 이번 코엑스에서 열린 AI Festa에서는 대부분이 서비스 기반의 제품이었습니다. 앞으로 얼마나 더 빠르게 발전해서 내 생활에 근접할까? 걱정도 되기 시작했습니다.
이제 점점 내가 도태되는 것처럼 느껴져서 갑자기 생각이 많아졌습니다.
그리하여 이번 스프링 AI를 학습하고, 개발해보기로 결정했습니다.
회사에서도 마침 사용자화되는 채팅 기반 에이전트를 원했기 때문에 고민이 어느정도 해결됐어요.
우선 공식 문서를 한번 훑어보며 진행했으니 여러분도 먼저 훑어보고 시작하길 바랍니다.
사실 나온지 얼마 안된 프로젝트이다 보니 버전업이 되며 너무나도 많이 바뀔 것 같으니 공식 문서를 기반으로 학습해보세요!
https://spring.io/projects/spring-ai
Spring AI
Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain. At
spring.io
Spring AI 프로젝트 구성하기
먼저, 타 서비스의 API를 사용하지 않고 Ollama 기반으로 구축하고자 합니다.
Spring Web, Ollama, Lombok을 선택하여 프로젝트를 구성했습니다.
Spring AI 설정하기
먼저, ollama 모델을 사용하도록 설정하고, 그에 따른 설정 정보를 입력했습니다.
Ollama의 Model은 gpt-oss 20b 모델을 사용합니다. 그 외 설정은 공식문서 등을 참고하여 임의로 사용했습니다. (대부분 기본 설정임)
spring:
application:
name: dglee-ai
ai:
model:
chat: ollama
ollama:
base-url: http://localhost:11434
init:
pull-model-strategy: never
timeout: 5m
max-retries: 2
chat:
options:
model: gpt-oss:20b
keep_alive: 5m
Spring AI 컨트롤러, 서비스 구성하기
예시이므로, 간단하게 구성해봅니다.
@RestController
@RequiredArgsConstructor
public class ChatController {
private final ChatService chatService;
@GetMapping("/chat")
public ResponseEntity<String> chat(String question) {
return ResponseEntity.ok(chatService.chat(question));
}
}
@Service
@RequiredArgsConstructor
public class ChatService {
private final OllamaChatModel chatModel;
public String chat(String message) {
SystemMessage systemMessage = new SystemMessage("You must answer in Korean.");
UserMessage userMessage = new UserMessage(message);
Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
return chatModel.call(prompt).getResult().getOutput().getText();
}
}
SystemMessage와 UserMessage를 구분하여 실제 사용자가 질의한 메시지와 시스템에서 추가하는 메시지를 분리합니다.
저는 항상 한국어로 응답하라고 시스템 메시지를 추가하였습니다.
결과 확인하기
마무리
제가 봐도 정말 간단한 예제입니다. 지금은 공부 1일차라 이정도 선일테고, 점점 심화되지 않을까싶네요.
랭체인을 쓸까, Spring AI를 쓸까 고민도 했으나 사실 일반적인 AI 서비스 구성 시에는 랭체인까지 갈 필요는 없어보입니다.
회사와 나의 기술 스택을 통일할 수 있고, 빠르게 시작할 수 있어 Spring AI를 선택했습니다. 스프링 진영이 AI를 놓지만 않는다면 괜찮은 선택일 수도 있겠네요.
앞으로 학습하며 알게되는 내용을 잘 정리하여 잘 작성해보겠습니다. 감사합니다.