Post

Spring AI 개요 및 개념

Spring AI의 개요와 AI 개념을 정리

Spring AI 개요 및 개념

spring-ai1

1. 개요


Spring AI 는 불필요한 복잡성 없이 인공지능 기능을 통합한 애플리케이션 개발을 간소화하는 것을 목표로 한다. 즉, 애플리케이션의 데이터나 API를 AI 모델에 연결하는 기능을 제공한다.

spring-ai2

Spring AI는 AI 애플리케이션을 개발하기 위한 기반이 되는 추상화를 제공한다. 이로써, 최소한의 코드 변경으로 쉽게 구성 요소를 교체할 수 있다.


Spring AI는 다음과 같은 기능들을 제공한다.

  • 채팅, 텍스트-이미지 변환, 임베딩 모델을 위한 모든 주요 AI 모델 제공업체에 이식 가능한 동기식 및 스트링 API 를 지원한다.
  • Structured Outputs - AI 모델 출력을 POJO에 매핑한다.
  • 모든 주요 백터 데이터베이스 (ex. MongoDB, …)를 지원한다.
  • SQL 유사 메타데이터 필터 API를 포함하여 Vector Store 공급자 전반의 이식 가능한 API이다.
  • Tools/Function Calling - 모델이 클라이언트 측 도구 및 기능의 실행을 요청하여 필요에 따라 필요한 실시간 정보에 액세스 할 수 있다.
  • Observability - AI 관련 작업에 대한 인사이트를 제공한다.
  • 데이터 엔지니어링을 위한 문서 수집 ETL framework 를 지원한다.
  • AI Model Evalutation - 생성된 콘텐츠를 평가하고 환각 반응으로부터 보호하는 데 도움이 되는 유틸리티이다.
  • AI 모델과 벡터 저장소를 위한 Spring Boot 자동 구성 및 스타터 제공
  • ChatClient API - WebClient와 RestClient와 유사한 API 제공
  • Advisor API - 반복되는 생성 AI 패턴을 캡슐화하고, LLM과 주고받는 데이터를 변환하며, 다양한 모델과 사용 사례에 걸쳐 이식성을 제공한다.
  • Chat Conversation MemoryRetrieval Augmented Generation(RAG) 지원


2. AI Concepts


2.1. Models


Spring AI는 현재 언어, 이미지, 오디오 형태의 입력과 출력을 처리하는 모델을 지원한다.


2.2. Prompts


ChatGPT의 API에서는 프롬프트 내 텍스트 입력에 역할이 지정된다. 예를 들어, 시스템 역할은 모델이 어떤 방식으로 동작할지를 지시하며, 사용자 역할은 실제 사용자의 입력을 나타낸다.


Prompt Templates

효과적인 프롬프트를 만들기 위해서는 요청의 컨텍스트를 설정하고, 사용자 입력에 따라 일부 값을 대체하는 구조가 필요하다.

이 과정에서는 전통적인 텍스트 기반 템플릿 엔진을 사용하여 프롬프트를 생성 및 관리한다. Spring AI는 SpringTemplate 오픈소스 라이브러리를 사용한다.


예를 들어, 다음과 같은 프롬프트 템플릿이 있다고 가정해 보자.

1
Tell me a {adjective} joke about {content}


Spring AI에서 프롬프트 템플릿은 Spring MVC 아키텍처의 “View”와 유사하다. 프롬프트는 초기에는 단순 문자열이지만, 이제는 여러 메시지를 포함하며, 각 메시지는 모델에 지정된 역할을 나타낸다.


2.3. Embeddings


임베딩은 텍스트, 이미지, 비디오 등의 의미를 수치적으로 표현한 것이다. 임베딩은 이러한 입력들을 부동 소수점 숫자의 배열(벡터)로 변환하여 관계성을 캡쳐한다.

임베딩은 RAG(Retrieval Augmented Generation) 패턴처럼 실제 애플리케이션에서 매우 중요한 역할을 한다. 비슷한 주제를 가진 문장은 이 의미 공간에서 서로 가깝게 위치하며, 이는 텍스트 분류, 의미 검색, 상품 추천 등의 작업에 유용하게 사용된다.


2.4. Tokens


토큰은 AI 모델이 작동하는 기본 단위이다. 입력 시에는 단어를 토큰으로 변환하고, 출력 시에는 토큰을 다시 단어로 변환한다.

중요한 점은 “토큰 = 비용” 이라는 점이다. 호스팅된 AI 모델의 사용 요금은 토큰 수에 따라 결정되며, 입력과 출력 모두 토큰을 차지한다.

또한 모델에는 토큰 제한이 있으며, 이를 “컨텍스트 윈도우” 라고 한다. 이 한계를 넘는 텍스트는 모델이 처리하지 않는다.

따라서 데이터를 분할하여 컨텍스트 윈도우에 맞게 제공하는 소프트웨어 전략이 필요하다. Spring AI는 이러한 작업을 도와주는 기능을 제공한다.


2.5. Structured Output


AI 모델의 출력은 String으로 전달된다. 이 때문에, 원하는 구조로 출력을 얻기 위한 프롬프트 작성과, 이를 애플리케이션에서 사용 가능한 구조로 파싱하는 작업이 필요하다.

구조화된 출력 변환은 정교한 프롬프트를 활용하며, 경우에 따라 여러 번 모델과 상호작용해야 한다.


2.6. 내 데이터와 API를 AI 모델에 연결하기

모델이 학습하지 않은 정보를 제공하는 세 가지 주요 방법이 있다.


파인튜닝(Fine Tuning)
전통적인 ML 방식으로 모델 자체를 재학습시키는 방식이다. 이는 리소스가 많이 필요하며, 일부 모델은 파인튜닝을 지원하지 않는다.


프롬프트 스터핑(Prompt Stuffing)
보다 현실적인 대안으로, 모델에게 보낼 프롬프트 안에 데이터를 직접 삽입한다. 모델의 토큰 한계를 고려하여 관련 데이터를 효과적으로 포함시키는 기술이 필요하다. 이 방식은 RAG(Retrieval Augmented Generation)라고도 한다. Spring AI는 이를 구현할 수 있는 기능을 제공한다.

spring-ai3


도구 호출(Tool Calling)
모델이 외부 시스템의 API에 접근할 수 있도록 도와주는 방법이다. Spring AI는 도구 호출을 위한 코드를 간단하게 작성할 수 있게 해 준다.


2.6.1. RAG (Retrieval Augmented Generation)


RAG은 AI 모델이 정확한 응답을 생성할 수 있도록 관련 데이터를 프롬프트에 삽입하는 기술이다.

RAG은 데이터를 불러오고, 가공하고, 벡터 DB에 저장하는 배치 처리 방식의 ETL(추출, 변환, 로드) 파이프라인을 사용한다. 벡터 DB는 “관련성 있는 데이터”를 찾기 위한 용도로 사용된다.

중요한 단계는 문서를 의미적 경계를 유지하며 잘게 나누는 것이다. 또한 모델의 토큰 한도에 비해 작은 조각으로 나누는 것도 중요하다.

질문을 처리할 때, 사용자의 질문과 유사한 문서 조각들을 찾아서 프롬프트에 함께 넣는다. 벡터 DB는 유사한 조각을 찾는 데 매우 효과적이다.


spring-ai4

  • ETL 파이프라인은 데이터를 추출, 변환, 벡터 스토어에 저장하는 흐름을 말한다.
  • Spring AI의 ChatClient - RAGQuestionAnswerAdvisor 를 사용하여 애플리케이션에 RAG 기능을 구현하는 방법을 보여준다.


2.6.2. Tool Calling


LLM은 외부 데이터를 직접 전근하거나 수정할 수 없으나, Tool Calling은 이러한 한계를 해결한다. 사용자가 정의한 서비스를 Tool로 등록하여, 외부 시스템의 API에 연결할 수 있게 해준다. 이를 통해 실시간 데이터 접근이나 처리 작업을 수행할 수 있다.


Spring AI는 Tool Calling을 위한 코드를 간단하게 구현할 수 있게 해준다. @Tool 어노테이션을 사용하여 메서드를 등록하고, 이를 프롬프트 옵션에 포함시켜 모델에서 사용할 수 있도록 한다. 하나의 프롬프트에 여러 개의 Tool을 포함시킬 수도 있다.

spring-ai5

  1. Tool을 모델에 사용 가능하게 하려면, Tool 정의(이름, 설명, 입력 파라미터 스키마)를 요청에 포함시킨다.
  2. 모델이 Tool Calling을 결정하면, Tool 이름과 입력 파라미터를 포함한 응답을 보낸다.
  3. 애플리케이션은 해당 Tool을 실행하고 결과를 얻는다.
  4. Tool Calling 결과를 다시 모델에 전달한다.
  5. 모델은 이 결과를 활용하여 최종 응답을 생성한다.


2.7. AI 응답 평가


AI 시스템의 응답을 효과적으로 평가하는 것은 최종 애플리케이션의 정확성과 유용성을 보장하는 데 매우 중요하다.

평가 과정에서는 응답이 사용자의 의도와 질문의 맥락에 맞는지를 분석하여, 관련성, 일관성, 사실성 같은 지표들이 사용된다.

한 가지 접근법은 사용자 요청과 모델 응답을 함께 모델에 제시하고, 이 응답이 적절한지 물어보는 것이다. 또한 벡터 DB에 저장된 정보를 보조 데이터로 사용하면 평가 품질을 향상시킬 수 있다.

Spring AI는 응답 평가를 위한 Evaluator API를 제공하며, 기본적인 전략들을 사용할 수 있다.


Reference


Spring AI: Reference Doc.

This post is licensed under CC BY 4.0 by the author.