-
Spring Boot에서 Google Vertex AI Gemini 연동하기📖 개발 공부 2025. 3. 16. 21:46
최근 프로젝트에서 Gemini 모델을 Spring Boot에 연동하는 작업을 진행했다.
이 과정에서 Google Cloud Vertex AI에서 제공하는 java-vertexai 라이브러리를 활용했다.
연동을 진행하면서 Gemini API 요청 시 다양한 옵션을 활용하여 원하는 방식으로 LLM을 제어할 수 있다는 점을 알게 되었다.
이 글에서는 Gemini 모델을 연동하는 과정과 함께 주요 설정값들을 정리해보려고 한다.
Google Cloud Vertex AI란
Google Cloud Vertex AI는 머신러닝(ML) 모델의 개발, 학습, 배포를 손쉽게 수행할 수 있도록 지원하는 통합 AI 플랫폼이다.
Vertex AI를 사용하면 다음과 같은 작업을 수행할 수 있다.
- AutoML 모델 학습 및 배포
- 사전 학습된 LLM(대형 언어 모델) 활용
- MLOps 파이프라인 구축
- 벡터 검색(Matching Engine) 지원
이번 프로젝트에서는 LLM(Gemini)과의 연동을 다루었다.
Gemini 연동 과정
인증 설정
우선, 스프링부트에서 Google Cloud API를 사용하기 위해 서비스 계정(Service Account) 인증이 필요하다.
환경 변수 설정
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
application.yml 설정
vertex: ai: gemini: project-id: ${GEMINI_PROJECT_ID} location: ${GEMINI_PROJECT_LOCATION}
LLM 모델을 선택하는 로직
Vertex AI에서 제공하는 Gemini 모델은 Gemini Pro, Gemini Flash 등 다양한 버전이 존재한다.
이 모델을 유연하게 선택할 수 있도록 각 모델을 Bean으로 등록한 후, 클라이언트 요청에 따라 적절한 모델을 가져오는 방식으로 구성했다.
private fun getLLMModel( model: LLMBasedTask.LLMModelType, ): GenerativeModel { return when (model) { LLMBasedTask.LLMModelType.GEMINI_1_5_PRO -> geminiModelPro LLMBasedTask.LLMModelType.GEMINI_1_5_FLASH -> geminiModelFlash } }
Gemini API 호출하기
선택된 LLM 모델을 사용해 Gemini API를 호출하는 방식은 다음과 같다.
val response = llmModel.generateContentAsync(prompt)
추가적으로, 모델의 동작 방식과 필터링, 도구 연동 등의 설정을 적용하여 API를 호출할 수 있다.
val response = generativeModel .withGenerationConfig(TODO()) // LLM 생성 설정 .withSafetySettings(TODO()) // 안전 필터링 설정 .withTools(TODO()) // 외부 API 연동 .withSystemInstruction(TODO()) // 시스템 지침 적용 .generateContentAsync(prompt)
각 설정 옵션을 정리해보겠다.
Gemini API 설정 옵션
withGenerationConfig(generationConfig)
이 옵션을 활용하면 모델의 창의성, 응답 길이, 샘플링 방식 등을 조정할 수 있다.
val generationConfig = GenerationConfig.newBuilder() .setTemperature(0.7) // 창의성 조정 (낮을수록 보수적, 높을수록 창의적) .setMaxOutputTokens(500) // 최대 출력 길이 .setTopP(0.8) // 확률 분포 기반 샘플링 .setTopK(40) // 상위 k개 단어에서 선택 .build()
- temperature: 모델의 창의성을 조정 (낮을수록 보수적인 답변, 높을수록 창의적인 답변)
- maxOutputTokens: 응답의 최대 길이 제한
- topP: 확률 분포 기반 샘플링 (0.8 → 80% 확률로 상위 단어 선택)
- topK: 가장 가능성 높은 k개 후보 중 하나 선택
withSafetySettings(safeSettings)
AI가 혐오 발언, 폭력적인 표현, 위험한 정보를 포함한 응답을 생성하지 않도록 차단할 수 있다.
val safetySettings = listOf( SafetySetting.newBuilder() .setCategory(HarmCategory.HARM_CATEGORY_HATE_SPEECH) // 혐오 발언 필터링 .setThreshold(HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE) // 중간 위험도 이상 차단 .build(), SafetySetting.newBuilder() .setCategory(HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT) // 위험한 정보 필터링 .setThreshold(HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE) .build(), SafetySetting.newBuilder() .setCategory(HarmCategory.HARM_CATEGORY_HARASSMENT) // 괴롭힘 필터링 .setThreshold(HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE) .build() )
withTools()
AI가 외부 도구(API, 데이터베이스 등)와 연동하여 결과를 보완할 수 있다.
val tools = listOf( Tool.newBuilder() .setName("weather_api") .setDescription("현재 날씨를 조회하는 API") .build() )
활용 예시
- AI가 실시간 날씨 데이터를 제공하도록 설정
- 특정 데이터베이스를 조회하여 응답을 생성
withSystemInstruction()
- AI의 응답 스타일을 사전 정의하여 특정 형식으로 답변하도록 유도할 수 있다.
val systemInstruction = SystemInstruction.newBuilder() .setText("답변을 공식적이고 상세하게 작성하세요.") .build()
활용 예시
- JSON 형식으로 응답하도록 설정
- 기술 문서 스타일로 응답
이번 프로젝트에서는 Spring Boot 애플리케이션에서 Google Cloud Vertex AI의 Gemini 모델을 연동하는 방법을 정리했다.
요약
- Gemini 모델 연동을 위해 java-vertexai 라이브러리를 사용했다.
- API 요청 시 원하는 모델(Gemini Pro, Flash)을 동적으로 선택할 수 있도록 구현했다.
- 다양한 설정값(생성 방식, 안전 설정, 도구 연동, 응답 스타일)을 활용해 LLM을 제어할 수 있었다.
이렇게 스프링 부트에 Vertex AI Gemini를 활용하여 LLM 기반 서비스를 구축할 수 있다!
반응형'📖 개발 공부' 카테고리의 다른 글
메시지 큐 비교하기 (RabbitMQ, Kafka, SQS, Redis Pub/Sub) (0) 2025.02.02 Spring Batch Partitioning로 대용량 데이터 마이그레이션 최적화 및 롱 트랜잭션 해결 (0) 2024.12.22 Hikari CP 설정 알아보기 (0) 2024.11.24 Spring 트랜잭션 롤백 관리: rollback-only 이슈 분석과 해결 (3) 2024.11.10 The SAGA Pattern (0) 2024.09.29