ABOUT ME

Today
Yesterday
Total
  • Spring of LLM, Spring AI #1 - 소개
    기술/스프링 2024. 3. 17. 15:04

    배경

    최근 대규모 언어 모델(LLM)이 엄청나게 핫하다. 비정형 데이터를 처리하고, 생성하는 기술의 등장으로 인해 컴퓨터 과학의 영역이 순식간에 넓어지고 있다. 마치 IT 업계가 뉴턴의 고전역학의 세계에서 양자역학의 세계로 퀀텀 점프한 것 같이 느껴진다. 이러한 흐름 속에서, OpenAI의 GPT / Google의 gemini / Mistral의 Mixtral / Meta의 LLama / Anthropic의 claude 등 다양한 파운데이션 모델이 경쟁적으로 등장하고 있다. 이런 생성형 AI의 발전은 시장은 IT 업계, 그리고 개발자 개개인에게 엄청난 기회같다. 하지만 이런 파운데이션 모델을 기반으로 사람들의 문제를 해결하는 서비스, 애플리케이션을 만들어 내고 기존 애플리케이션과 통합해 관리하는 건 시작 단계이다.

     

    스프링 진영에서도 이러한 문제를 해결하기 위해서 Spring AI 프로젝트를 시작했다.

    이 프로젝트는 LangChain과 LlamaIndex와 같은 유명한 Python 프로젝트에서 영감을 얻었지만,
    Spring AI는 이러한 프로젝트를 직접 포팅한 것은 아닙니다.

    이 프로젝트는 차세대 생성 AI 애플리케이션의 물결이
    Python 개발자뿐만 아니라 다양한 프로그래밍 언어에 걸쳐
    보편화될 것이라는 믿음으로 시작되었습니다.

     

     

    스프링 AI의 가장 목적은, AI 애플리케이션 개발의 기반이 되는 추상화를 제공하고, 최소한의 코드 변경으로 여러 구성 요소를 변경할 수 있게 돕는 것이다. 마치 특정 DB에 종속되지 않게 추상화를 제공하는 Spring data jdbc 등의 목적과 비슷하게 들린다.

     

    주요 기능

    스프링 AI 측에서 말하는 주요 기능은 다음과 같다.

    • 모델 제공업체 지원: OpenAI, Microsoft, Amazon, Google, Huggingface 등 주요 모델 제공 업체를 지원합니다.
    • 모델 유형 지원: 챗봇 및 텍스트-이미지 변환 모델을 지원하며, 추가 모델 유형 지원을 계획 중입니다.
    • 이식성 높은 API: AI 제공업체 간에 이식 가능한 API를 제공합니다. 동기 및 스트림 API 옵션을 지원하며, 모델 특정 기능에 접근할 수 있는 옵션도 제공합니다.
    • AI 모델 출력의 POJO 매핑: AI 모델 출력을 Plain Old Java Objects(POJO)로 매핑합니다.
    • 벡터 데이터베이스 제공업체 지원: Azure Vector Search, Chroma, Milvus, Neo4j, PostgreSQL/PGVector, PineCone, Redis, Weaviate 등 주요 벡터 데이터베이스 제공 업체를 지원합니다.
    • 이식 가능한 API: 벡터 저장소 제공 업체 간에 이식 가능한 API, SQL과 유사한 메타데이터 필터 API를 포함합니다.
    • 기능 호출: 다양한 AI 기능을 호출합니다.
    • Spring Boot 자동 설정 및 시작: AI 모델 및 벡터 저장소를 위한 Spring Boot 자동 설정 및 스타터를 제공합니다.
    • ETL 프레임워크: 데이터 엔지니어링을 위한 ETL 프레임워크를 제공합니다.

     

    장/단점

    장점

    • Spring AI의 가장 큰 장점은 기존 Java/Kotlin + 스프링 기반 애플리케이션에 AI 연동 기능을 손쉽게 추가할 수 있다.
    • 이를 통해 DB, 캐시, 메시지 큐, 서킷 브레이커, 클라우드 등 기존 Java/Spring 진영의 다양한 생태계를 활용할 수 있다.
    • 각종 인프라 / 모델을 추상화함으로 LLM / VectorDB / Embedding 클라이언트에 종속되지 않고, 바꿔끼워가며 사용할 수 있다.
    • LLM 외부의 데이터 베이스나, 벡터 데이터베이스 또는 검색 엔진등 다양한 외부 컴포넌트와 쉬운 통합이 가능하다.

    단점

    • 부족한 성숙도 - 기존 LLM 진영의 대세 언어는 파이썬이었던만큼, 파이썬 진영의 대표적인 프레임워크에 비하면 아직 성숙하진 않다.
    • 파이썬 진영의 프레임워크를 포팅한 프레임워크에 비해서도 아직은 깃허브 스타 수 등이 부족하다.
    • 추가 지원 툴들의 부재 - LangChain진영에서 지원하는 LangServe/LangSmith/LangGraph처럼 AI 서비스를 위한 추가 툴들이 아직 부족하다.

     

    Hello, Spring AI

    모든 소스코드는 (https://github.com/Donghh0221/spring-ai)에서 확인 가능하다.

     

    생성형 AI를 활용한 간단한 애플리케이션을 만들어보자.

    1. 프로젝트 세팅

    Spring Initializr에 접속해, 새로운 프로젝트를 세팅해주자. 디펜던시는 따로 추가하지 않고 나중에 gradle 파일에 직접 추가한다.

    2.  필요한 디펜던시 추가

    repositories {
        mavenCentral()
        maven { url = uri("https://repo.spring.io/milestone") }
        maven { url = uri("https://repo.spring.io/snapshot") }
    }
    ...
    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.springframework.boot:spring-boot-starter")
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation("org.springframework.ai:spring-ai-bom:0.8.1-SNAPSHOT")
        implementation("org.springframework.ai:spring-ai-openai-spring-boot-starter:0.8.1-SNAPSHOT")
        testImplementation("org.springframework.boot:spring-boot-starter-test")
    }

     

    Web Server를 구동하기 위한 spring-boot-starter-web와, AI 클라이언트를 활용하기 위한 spring-ai-bom, spring-ai-openai-spring-boot-starter 의존성을 추가해준다. 


    현 시점(24.03.17)에는 Spring AI가 아직 정식 오픈 전이라, maven repository에 snapshot 레포지토리를 추가해주어야한다.


    3. OpenAI Key 발급 및 추가

    1. openai API key를 발급 받아(https://wikidocs.net/196075 해당 글 참조)

    2. application.properties에 세팅해준다.

    spring.application.name=spring-ai
    spring.ai.openai.api-key=your-api-key

     

    4. 컨트롤러 구현 및 테스트

    컨트롤러를 간단하게 구현한 후, intellij http 파일로 호출해보면, 벌써 끝이다!

     

    엄청나게 빠르고 쉽게 AI 서비스를 연동할 수 있다.

    @RestController
    class HelloController(
        private val chatClient: OpenAiChatClient
    ) {
        @GetMapping("/ai/generate")
        fun generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") message: String?): Map<*, *> {
            return java.util.Map.of("generation", chatClient.call(message))
        }
    }
    
    GET http://localhost:8080/ai/generate?message=introude about yourself
    
    HTTP/1.1 200 
    Content-Type: application/json
    Transfer-Encoding: chunked
    Date: Sun, 17 Mar 2024 05:09:34 GMT
    Keep-Alive: timeout=60
    Connection: keep-alive
    
    {
      "generation": "Hello! I am a language model AI assistant designed to help with a variety of tasks and provide information. I am constantly learning and improving my abilities through interactions with users like you. My goal is to assist you in any way I can, so feel free to ask me anything you need help with."
    }

    개인적으로

    사실상 머신러닝, LLM 진영에서 Defacto인 언어는 Python이다. 그럼에도 불구하고 java/spring에 인공지능 서비스를 통합하기 위한 Spring AI가 가지는 의미는 뭘까?

     

    대형 회사에는 MSA 구조로 서비스를 운영하며, 인공지능 모듈은 Python, Langchain 기반으로 LLM 모듈을 관리하고, 이를 타 모듈 / 애플리케이션에 API 형태로 제공해줄 수 있을 것이다.

     

    하지만, 이러한 MSA 구조가 초기 스타트업에게 적절한가에 대해서는 의문부호가 굉장히 크다. 그리고, 앞으로는 AI를 활용한 버티컬 서비스들이 많이 등장할 것이라고 생각한다.

    AI를 활용한 서비스라 할지라도 당연히 LLM만 쓰는게 아니라, DB / Cache 등 다양한 기능을 써야 할 것이다. 그렇기에 Spring 진영의 다양한 기능들을 활용하며, AI도 쉽게 통합할 수 있는 Spring AI는 초기단계 스타트업이 모놀로식으로 된 애플리케이션을 만들 때, 많은 도움이 될 것이다.

     

    스타트업인데 스프링을? 이라고 묻는다면... 음... 네...

    앞으로

    깃허브 소스를 공유했던 Spring AI 프로젝트를 홍보팀을 위한 신문 기사 요약 및 트래킹 서비스로 발전 시켜 나갈 예정이다.

     

    하지만 다음 글에서는 일단 Spring AI의 주요 인터페이스와 클래스를 살펴보며, AI 서비스를 구성하는 핵심적인 요소는 무엇이 있는지 확인해보자.

    더 읽어보면 좋은 글

    스프링 AI 공식 문서
    조대협님의 LangChain 시리즈

    '기술 > 스프링' 카테고리의 다른 글

    Spring RestClient  (0) 2024.03.24
Designed by Tistory.