스프링 AI 시리즈
- [Spring AI] 준비 (기본 개념, OpenAI API Key, 크레딧 충전)
- [Spring AI] 챗봇 만들기 (Kotlin)
- [Spring AI] Vector Store와 RAG를 이용한 할루시네이션 방지
- [Spring AI] OpenAI 비용을 절감하는 방법
스프링 AI란?
Spring AI는 인공지능(AI) 기능을 Spring 애플리케이션에 통합하기 위한 라이브러리이다. 기존에는 거의 파이썬으로만 AI를 활용했지만, 이제 Spring AI를 통해 Java에서도 AI를 활용할 수 있다.
기본 개념 (더보기를 눌러주세요)
모델
AI 모델은 텍스트, 이미지, 오디오 등 다양한 입력을 처리하여 결과를 생성하는 알고리즘이다. Spring AI는 언어, 이미지, 오디오 입력과 출력을 지원하며, 임베딩(Embeddings)도 지원하여 더 고급 사용 사례를 처리할 수 있게 한다. GPT 같은 모델은 사전 훈련된 모델로, 일반적으로 사용자가 특별한 기계 학습 배경 없이도 활용할 수 있는 장점이 있다.
프롬프트(Prompt)
프롬프트는 AI 모델에 원하는 출력을 유도하기 위해 입력하는 텍스트이다. 단순한 문자열 입력처럼 보일 수 있지만, 사실상 시스템의 역할과 사용자 입력 등을 포함하는 복잡한 구조이다. 이를 통해 사용자는 모델의 출력을 원하는 방향으로 유도할 수 있다.
예:
- 'If the answer is not in the context, inform the user that you can't answer the question.'등의 프롬프트를 통해서 AI 할루시네이션(Hallucination)을 방지
- 'answer only in Korean.' 프롬프트를 통해서 한국어로만 답변하도록 설정
프롬프트 템플릿
Spring AI에서는 StringTemplate 라이브러리를 이용해 프롬프트를 동적으로 생성할 수 있다. 예를 들어, 특정 사용자 입력에 따라 맞춤형 프롬프트를 만들 수 있으며, 이 프롬프트는 Spring MVC 아키텍처에서의 "View"와 비슷하게 작동한다.
임베딩(Embeddings)
임베딩은 텍스트, 이미지, 비디오 등의 입력을 벡터로 변환한 숫자 표현이다. 이 벡터는 AI 모델이 의미를 이해하고 서로 다른 입력 간의 유사성을 비교할 수 있게 해준다. 특히 RAG(Retrieval Augmented Generation) 패턴과 같은 실용적인 응용에서 중요한 역할을 한다.
토큰(Tokens)
토큰은 AI 모델에서 입력과 출력을 처리하는 기본 단위이다. 입력된 텍스트는 토큰으로 변환되고, 출력될 때 다시 텍스트로 변환된다. 토큰 수에 따라 비용이 발생하며, API 호출에서 모델이 한 번에 처리할 수 있는 토큰 수에는 제한이 있다. 이를 컨텍스트 윈도우라고 부른다.
구조화된 출력
AI 모델의 출력은 일반적으로 문자열 형태로 제공된다. 하지만 필요할 경우, 특정 형식으로 구조화된 데이터를 얻기 위해 추가적인 프롬프트 구성 및 변환이 필요할 수 있다. Spring AI는 이 과정도 지원한다.
외부 데이터 및 API와의 통합
AI 모델의 데이터셋이 최신 정보까지 포함하지 않는 경우가 많다. 이를 해결하기 위한 방법으로는 파인튜닝, 프롬프트 스터핑, 그리고 함수 호출 같은 기법이 있다. 특히 함수 호출을 통해 AI 모델이 외부 시스템의 실시간 데이터를 활용할 수 있게 한다.
RAG(Retrieval Augmented Generation)
RAG는 AI 모델의 프롬프트에 외부 데이터를 통합하여 더 정확한 응답을 생성하는 기법이다. 이는 벡터 데이터베이스와 결합되어, 유사한 내용을 찾아 프롬프트에 넣고 AI 모델에 전달한다.
함수 호출(Function Calling)
Spring AI는 대형 언어 모델(LLM)이 외부 API와 통신할 수 있도록 함수 호출 기능을 지원한다. 이 기능은 모델이 외부 시스템의 API를 호출하여 필요한 데이터를 실시간으로 처리하게 해준다.
AI 응답 평가
Spring AI는 AI 모델이 생성한 응답을 평가하는 Evaluator API를 제공한다. 이를 통해 생성된 응답의 품질을 확인하고, 사용자 요청과 모델 응답의 일치 여부를 평가할 수 있다.
이 개념들을 바탕으로 Spring AI는 Java 개발자가 AI 기술을 손쉽게 애플리케이션에 통합하고 활용할 수 있는 다양한 도구를 제공하고 있다.
OpenAI API Key 생성
https://platform.openai.com/api-keys에 접속하면 아래와 같은 화면을 확인할 수 있다.
You와 Service account가 있는데 Service account를 선택하는 것이 좋다. 그 이유는
1. 개인 계정(You)을 사용하면 개인의 인증 정보와 애플리케이션의 인증 정보가 혼재되기 때문에, 여러 서비스에서 동일한 API 키를 사용할 때 보안 리스크가 커진다. 반면 Service Account는 애플리케이션에 필요한 최소한의 권한만 부여하여 권한 분리가 명확하게 이루어진다.
2. 애플리케이션의 Service Account를 통해 발급된 Secret Key는 보다 쉽게 관리하고, 필요 시 교체(회전)할 수 있다. 개인 계정의 키를 사용하게 되면 개인이 계정을 변경하거나 보안 이슈가 발생할 때 모든 애플리케이션의 키를 다시 설정해야 하는 번거로움이 있다.
그러므로 Service Account를 사용하자. Account ID는 프로젝트 명으로 하는 것이 좋다.
시크릿키를 만들면 아래와 같이 키가 나오는데, 절대 깃 허브에 올리거나 외부에 노출하지 말아야 한다. 저 키가 노출되는 순간 요금 폭탄이 발생한다고 생각하는게 좋다. 혹시나 노출이 되었다면 즉시 해당 키를 폐기하고 재 발급 받자.
크레딧 충전
모든 OpenAI의 API호출에는 토큰 수 기준으로 과금이 된다.(가격표: https://openai.com/api/pricing/)
물론 OpenAI를 사용하지 않는 방법도 있다.
1. 다른 상업용 AI 모델의 API를 사용 (Google의 Gemini, Meta의 LLaMA 등)
2. 허깅페이스에 있는 모델(https://huggingface.co/models)을 다운받아 직접 로컬로 실행하는 방법 -> 내 컴퓨터가 GPT역할을 해야하므로 성능이 좋아야한다.
3.직접 모델을 만드는 방법.
하지만 이번엔 빠른 Spring AI 사용을 위해 OpenAI API를 사용하자.
다음 링크로 접속하면 Billing 화면이 보인다. https://platform.openai.com/settings/organization/billing/overview
위 화면에서 `Add to credit balance` 버튼을 눌러, 카드 결제를 통해 충전할 수 있다(tax 별도...)
토큰?
앞서 언급했듯이, OpenAI API의 요금은 토큰 수에 따라 부과된다. 참고로, Input 토큰(사용자가 API에 요청할 때 보낸 텍스트의 토큰 수)과 Output 토큰(OpenAI가 해당 요청에 대해 응답으로 생성한 텍스트의 토큰 수) 모두 요금 부과의 대상이다.
토큰에 대한 정확한 기준은 없지만, 영어 텍스트의 경우 대략적으로 4글자가 1토큰으로 계산된다고 알려져있다.
https://platform.openai.com/tokenizer 사이트에 접속하여 테스트를 해보자.
예: Hello, my name is Lee Sujae, and I want to become a good developer.
영어로 입력해보면 토큰화를 비교적 잘 처리한다. 이제 한글을 사용해보자. 한글은 영어에 비해 같은 내용을 표현할 때 글자 수가 적으므로, 토큰 수가 줄어들 것으로 기대할 수 있다.
예: 안녕, 내 이름은 이수재라고 해. 나는 좋은 개발자가 되고싶어.
그러나 예상과 달리 한글은 더 많은 토큰을 차지한다. 거의 한 글자당 1토큰으로 계산되기 때문에, 비용 효율성을 고려하면 가능하면 영어로 입력하는 것이 좋다.
또한, 문장 부호(‘, . ? 등)도 거의 각각 하나의 토큰으로 계산되므로, 가능하다면 사용하는 것을 줄이는 것이 좋다.
Spring AI 사용 준비가 끝났다.
REFERENCES
Spring AI - https://spring.io/projects/spring-ai
OpenAI API -https://openai.com/api