오늘은 사내프로젝트에서 사용했던 Spring AI에 대해 소개하고 간단한 실습을 해보려고 한다!
사실 공식문서가 엄청나게 잘되어 있어서 개념 설명보다는 실습 위주로 풀어나가겠다~~
Spring AI ?
AI Engineering, AI Serving과 관련된 작업을 할 때, 대표적으로 python을 많이 사용하고 있다.
그런데, 이제 스프링에서도 Serving 정도는 간단하게 작업할 수 있다!!
즉, AI Engineering을 위한 애플리케이션 프레임워크라고 생각하면 된다. 공식문서에 의하면 해당 프레임워크의 핵심은 기업 데이터와 API를 AI 모델과 연결하는 AI 통합이다.
Spring AI의 특징은 공식문서에 상세하게 나타나있어 여기에는 담지 않겠다 ㅎ
(https://spring.io/projects/spring-ai#overview)
실습을 위한 기본지식
공식문서를 다 읽어보았는데, 개발에 필요한 지식 2가지만 소개하고 넘어가겠다.
1. Function Calling
사실 해당 글을 참조하는 독자도 AI Model을 만드는 것보다는 Serving에 관심이 더 많을 것이다.
Function Calling은 LLM(Large Language Model)을 API에 연결하여 데이터 처리 작업을 모델 대신 수행할 수 있는 것이다.
AI Model을 어떻게 호출하고 어떻게 응답받는지에 대한 그림이다. Chat GPT를 사용하는 과정과 똑같다고 보면 된다.
함수 정보를 포함한 Prompt를 AI Model에게 요청하고 모델은 이에 대한 결과값을 만들어 낸다.
여기서 Spring AI의 역할은 AI Model의 요청 정보를 바탕으로 Function Registry에서 찾아 Function으로 전달하고 결과를 가공하여 최종 응답을 생성한다.
2. Chat Client API
실질적으로 해당 API를 통해 AI Model과 통신한다고 생각하면 된다.
@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()
.user(userInput)
.call()
.content();
}
}
이제 함수 하나하나씩 파악해보자!
prompt()
AI 모델에 전달할 입력 구조인 Prompt 객체를 생성한다.
method overloading | |
prompt() | 매개변수 없이 호출 가능, user, system를 단계적으로 활용 가능 |
prompt(Prompt prompt) | Prompt를 입력 받음 not-fluent API |
prompt(String content) | 사용자의 텍스트 콘텐츠를 입력받음 |
user()
Prompt에 사용자의 입력 메시지를 추가한다. 흔히, 사용자가 직접 입력하는 부분이라고 생각하면 된다.
system()
Primpt에 시스템 메시지를 추가하는 것으로, AI의 동작을 안내하거나 역할을 정의하는 데 사용된다.
call()
Prompt를 AI 모델로 call하여 전송하고 결과를 ChatResponse로 반환한다. 필요 시, AI 응답을 POJO 형식으로 매핑하여 반환 가능하다.
주로 많이 사용하는 함수들만 다뤘다. 자세한 내용은 아래 링크 참고하면 될 것같다!!
(https://docs.spring.io/spring-ai/reference/api/chatclient.html)
Ollama Install
이번 실습은 Ollama를 선택했다. Ollama는 Open Source Large Language Model Meta AI로 Large Language Model 직접 실행할 수 있도록 특별히 도와주는 오픈소스 플랫폼이다.
그렇기 때문에 다양한 모델을 경험해볼 수 있고 무료로 로컬에서 테스트 가능하다는 장점이 있다.
우선 Ollama를 설치해보자! 주의 사항은 Ollama와 LLM을 설치하면 5GB ~ 10GB 정도 사용하기 때문에 넉넉하게 컴퓨터 용량을 준비해야한다.
1. Ollama Setup 설치
위 사이트에서 Download 버튼을 클릭 -> OS 선택 -> 다운로드 순서대로 진행하면 된다.
2. 다운받은 OllamaSetup을 실행하여 Install을 클릭해준다.
3. 설치 확인
cmd(terminal)에 접속하여 ollama 명령어를 쳤을 때, 위 이미지처럼 나온다면 설치를 성공한 것이다. (또는 ollama --version)
이제 설치를 완료했으니, LLM 쇼핑을 하러가보겠다.
5. LLM 선정 및 설치
https://ollama.com/library/llama3.2:3b
llama3.2의 small 버전을 설치해보려고 한다. 테스트 용이라 가벼운걸로 설치해보았다. 원하는 모델 아무거나 설치해도 상관 없다!!
설치는 정말 심플한데 아래 명령어를 cmd(terminal) 입력하면 된다.
ollama run llama3.2:3b
설치가 완료되면 바로 message를 보낼 수 있다. 킹명주를 아는지 물어봤더니 칸예 웨스트에 대한 답변을 해준다.. (킹명주 == 칸예 웨스트)
확인 완료했으니 Ctrl + D 키로 잠시 꺼주면 된다!
Spring AI Setting
1. Spring Project 생성
위 사이트 접속 후, 맞는 버전을 선택하고 3가지 Dependency를 설정해주면 된다.
(* 참고로 Ollama를 사용하기 위해서 Spring Boot >= 3.2.0 and < 3.4.0-M1 을 사용해야 한다.)
2. application.yml setting
properties를 세팅할 예정이다!
https://docs.spring.io/spring-ai/reference/1.0/api/chat/ollama-chat.html
해당 문서의 가이드라인을 따라서 설정할 계획인데, 다른 옵션도 많지만 일단 가장 기본적인 ollama url과 chat model을 설정해주겠다.
application.yml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: llama3.2
ollama serve를 하게되면, localhost의 11434 port를 사용하는 것을 확인할 수 있다. 그래서 이를 base-url로 지정해주었다.
나만의 Chat GPT 개발
이제 Setting이 모두 끝났으니 Postman과 Spring Boot를 이용하여 간단한 Chat GPT를 개발해보고자 한다.
우선 Controller를 하나 생성하자!
@RestController
@RequiredArgsConstructor
public class ChatController {
private final ChatService chatService;
@GetMapping("/chat")
public ResponseEntity<String> getAiResult(String question) {
return ResponseEntity.ok(chatService.getAiResult(question));
}
}
그 다음으로 실질적으로 응답 결과를 반환하는 Service를 생성하자!
package com.example.demo.service;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class ChatService {
private final OllamaChatModel chatModel;
public String getAiResult(String question){
return chatModel.call(question);
}
}
확실히 Ollama를 사용하니, ChatClient보다 더 심플하게 사용 가능하다.
간단한 AI Serving 경험에 Ollama는 좋은 선택인 것 같다!
자자 이제 Spring을 빌드하고 Ollama serve 명령을 입력한 cmd(terminal)와 Postman을 띄어놓고 테스트를 진행해보자!
첫번째 질문은 1=1과 같은 당연한 질문을 해보았다.
야레야레.. AI는 이래서 안된다.
정말 기분이 나빴던 건, 여러 질문 중 응답이 가장 빨랐다.
두번째 질문은 난감한 질문을 해보았다.
난감한 질문은 사족을 붙여 회피해버린다. AI 녀석 쉽지 않다..^^
(참고로 API 통신에 성공하면 cmd(terminal)창에 저렇게 표시가 된다!)
오늘의 결론
오늘은 Spring AI를 소개해보았고 실습을 통해 적용까지 해보았다.
뭔가 Chat Bot을 만드는 일이나, 메일을 요약해주는 AI기능은 다른 세계에 있는 줄 알았는데, 모델을 구축하는 것이 어렵지 모델을 활용하는건 정말 쉽다.
앞으로는 Spring AI를 통해 많은 프로젝트를 해보려고 한다.
근데 이게 생각보다 메모리를 많이 잡아먹어서 컴퓨터 교체 후, 적용할 예정이다 ㅎ..
그럼 20000~~
'SPRING' 카테고리의 다른 글
LIKE Wildcard 검색을 막아보자(MySQL, MyBatis) (2) | 2024.12.25 |
---|---|
[MyBatis] Loop vs Subquery vs Inner Join (3) | 2024.07.20 |
MyBatis에서 Helper 클래스 적용하기 (StringUtils, CollectionUtils...) (2) | 2024.06.23 |
정적 팩토리 메서드(Static Factory Method) 맛보기 (2) | 2024.02.25 |
Naver Open API 연결 어렵나? (2) | 2023.11.07 |