Spring AI 사용해보기

이 번 글에서는 Spring AI에 대해서 알아보는 시간을 가져보겠습니다. 이 글이 최초 작성된 날짜는 2024년 6월 입니다, 따라서 현재 기준으로 Spring AI 최신 버전은 1.0.0-SNAPSHOT으로 다른 버전과 호화되는 않을 수 있습니다.

Spring AI 란?

Spring AI 프로젝트는 AI 기능을 포함하는 애플리케이션 개발을 불필요한 복잡성 없이 간소화하는 것을 목표로 합니다.

스프링 공식 문서에 따르면, 다양한 구현을 유연하게 개발할 수 있도록 설계되었으며, 최소한의 코드 변경으로 쉽게 변경할 수 있는 추상화를 제공하는 하나의 독립적인 프로젝트로 출시된 것으로 보입니다.

이렇게 독립적인 프로젝트로 출시되면서 개발자들이 얻는 이점은 더 이상 외부 LLM API와 HTTP 연결 하는 로직을 직접 구현하지 않아도 된다는 점이 가장 큰 장점이라고 생각합니다.

Spring AI 적용해보기

저는 Youtube 동영상을 참고해서 프로젝트를 만들어보도록 하겠습니다.

1. Gradle 프로젝트 생성

프로젝트 생성 정보

  • Gradle 8.x
  • SpringBoot: 3.3.1
  • Language: Java
  • JDK: 21, GraalVM
  • Dependencies: Spring Web, OpenAI, Spring Data JDBC, PGvector Vector Database, GraalVM Native Support

저는 Visual Studio를 이용해서 프로젝트를 생성해보도록 하겠습니다. VS코드 Spring Initializr Extension을 통해서 위와 같이 생성을 진행했습니다.

2. ChatGPT API 설정 및 Key 발급 받기

Spring AI 프로젝트에 연결할 ChatGPT의 API를 설정하여 진행하도록 하겠습니다.

spring ai 00 1

위 링크로 이동하여 위 그림과 같이 오른쪽 API를 선택해줍니다.

spring ai 00 3

오른쪽 상단의 톱니바퀴 모양 > Project > Create project 순서로 선택하여 프로젝트를 생성해줍니다.

spring ai 00 5

왼쪽 상단의 Your profile을 선택 후, 위와 같이 API Key를 생성하기 위해 인증을 진행해줍니다.

spring ai 00 3

성공적으로 인증을 하면 위와 같이 API Key를 발급 받을 수 있습니다.

3. 프로젝트에 API Key 등록

spring:
  application.name: private-ai
  # database
  datasource:
    url: jdbc:postgresql://localhost/mydatabase
    username: myuser
    password: secret
  sql.init.mode: always
  # ai settings
  ai.openai:
    api-key: <Your-API-KEY>
    chat:
      options:
        model: gpt-4o
  # virual thread
  threads.virtual.enabled: true

application.yml파일에 위와 같은 내용을 작성했습니다.

4. ChatGPT에게 질문하기

package com.sushistack.spring.private_ai;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class PrivateAiApplication {

	public static void main(String[] args) {
		SpringApplication.run(PrivateAiApplication.class, args);
	}

+	@Bean
+   ChatClient chatClient (ChatClient.Builder builder) {
+		return builder.build();
+	}
+
+	@Bean
+	ApplicationRunner applicationRunner (ChatClient ai) {
+		return new ApplicationRunner () {
+			@Override
+			public void run (ApplicationArguments args) throws Exception {
+
+				var query = """
+						안녕?
+						""";
+
+				ChatClient.ChatClientRequest req = ai.prompt().user(query);
+				String content = req.call().content();
+				System.out.println(content);
+			}
+		};
+	}

}

위 처럼 ChantClient와 ChatClient를 이용하여 ChatGPT에게 쿼리를 요청하는 ApplicationRunner를 Bean으로 각각 등록해줍니다.

spring ai 01

그리고 프로젝트를 실행하면 위 처럼 간단한 코드로 ChatGPT와 채팅할 수 있는 앱을 만들었습니다.

Spring AI APIs

Spring AI는 다양한 기능들을 포함하고 있습니다. Spring AI API의 주요 기능들을 하나씩 알아보도록 하겠습니다.

AI Model API

spring ai 02

모델(Model) API는 위 처럼 Chat, TTS(Text to Seepch), TTI(Text to Image), Audio Transcription, embedding 등을 제공하고 있습니다. 뿐만 아니라 비동기와 스트리밍 API 옵션도 지원합니다.

spring ai 03

위와 같이 이미 너무나 유명한 AI 모델들(OpenAI, Bedrock, Gemini 등)은 이미 구현이 되어 있습니다.

Chat Model 구성도

spring ai 04

Prompt
public class Prompt implements ModelRequest<List<Message>> {

	private final List<Message> messages;

	private ChatOptions modelOptions;

  // ... 생략
}

프롬프트는 AI 모델이 특정 출력을 유도하도록 해주는 부분입니다. RunTime에 Chat에 대한 옵션을 설정할 수 있고, 입력 값(Messages)들은 ChatModel의 전달됩니다.

ChatModel (+ StreamingChatModel)

Prompt로 부터 전달 받은 옵션과 데이터를 각 외부 LLM 모델 API를에 요청하는 역할을 합니다.

ChatResponse

채팅 응답에 대한 메타데이터와 LLM 모델의 출력 값을 가지는 응답 객체입니다.

Refs.

Vector Store API

벡터 저장소(Vector Store)는 벡터 검색을 위해서 사용하게 됩니다. 예를 들어 다음과 같은 과정으로 벡터 저장소가 사용될 수 있습니다.

벡터의 사용

  1. 임배딩 생성: 텍스트, 이미지, 오디오 등을 AI 모델(GPT 등)을 통해 벡터를 생성합니다.
  2. 벡터 저장소에 저장: 생성된 벡터를 저장합니다.
  3. 새로운 검색: 새로운 입력 데이터가 들어오면 이를 벡터로 변환하고, 벡터 저장소에서 유사한 벡터를 검색합니다.
  4. AI 모델에 전달: 검색된 벡터와 관련된 데이터를 AI 모델에 전달하여 적절한 응답을 생성하거나 추가 분석을 수행합니다.

Refs.

Function Calling API

spring ai 05

위 처럼 Spring AI는 함수형을 지원하기 때문에, 개발자가 함수를 통해 내부를 건드리지 않고 로직을 실행 시킬 수 있습니다.

ETL Data Engineering

spring ai 06

데이터 엔지니어링을 위한 ETL 프레임워크는 다양한 외부 벡터 데이터를 벡터 데이터베이스에 로드할 수 있도록 해줍니다. 이를 통해서 AI 모델에 더 많고 벡터 데이터 전달할 수 있습니다.

맺음

Spring I/O 2024에 참여해서 직접 참여했던 세션인데요, 좋은 경험이었던 것 같습니다. 아래는 Spring AI 세션 Youtube 링크입니다.

감사합니다.

Buy me a coffee
글이 도움이 되셨다면, 커피 한 잔만 사주세요!
Comments
Copied to clipboard