Spring AI 개발 일지 (2) - OpenAI 사용해 후기 요약 구현해보기

2025. 11. 19. 21:34·Spring

✅ 개요

우선 벡터 DB, RAG와 같은 임베딩 기술 없이 LLM만 사용하여 Spring AI 기술을 사용해보기 위해 간단한 게시글에 대한 후기 요약 기능을 구현해보겠습니다.

✅ 사전 준비

1️⃣ 의존성 추가

implementation("org.springframework.ai:spring-ai-starter-model-openai")

2️⃣ 설정 파일 추가

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4.1-mini
          temperature: 0.0
          max-tokens: 1024
  • OpenAI Platform에서 API Key를 발급 받았습니다. (최소 5$ 결제 필요)
  • 위에서 설정한 ChatOptions 설정은 스프링부트 자동 설정에 의해 ChatModel 구현체에게 전달됩니다.

3️⃣ 빈 등록

@Configuration
public class AIConfig {

    @Bean
    public ChatClient openAiChatClient(OpenAiChatModel openAiChatModel) {
        return ChatClient.create(openAiChatModel);
    }
}
💡 `ChatClient`
- `ChatModel`을 한번 감싸 고수준에서 기능을 제공하는 객체로, 프롬프트 조립, 호출 등 메서드 체이닝을 지원합니다.
- 필요한 경우 `ChatModel`을 직접 주입받아 더 세밀한 제어를 할 수 있습니다.
-  `ChatClient`는 인터페이스이며, 기본 구현체로 `DefaultChatClient`를 제공합니다.
  • 여기서 주입받은 `ChatModel` 구현체는 추가한 의존성에 따라 달라집니다. 
  • 각각 다른 `ChatModel`을 주입받고 여러 `ChatClient`를 빈으로 등록하면 필요에 따라 다른 `ChatModel`을 사용할 수 있을 것 같습니다.

✅ 비즈니스 로직

@Service
@RequiredArgsConstructor
public class ReviewSummaryService {

    private final ChatClient chatClient;
    private final ReviewQueryRepository reviewQueryRepository;

    @Value("${custom.ai.review-summary-prompt}")
    private String reviewSummaryPrompt;

    public String summarizeReviews(Long postId) {
        List<Review> reviews = reviewQueryRepository.findTop30ByPostId(postId);

        if (reviews.isEmpty()) {
            return "후기가 없습니다.";
        }

        String reviewsText = reviews.stream()
                                    .map(Review::getComment)
                                    .collect(Collectors.joining("\n"));

        return chatClient.prompt()
                         .system(reviewSummaryPrompt)
                         .user("후기:\n" + reviewsText)
                         .call()
                         .content();
    }
}
  1. 게시글 ID를 전달받아 JPA로 최근 등록된 30개의 후기를 조회합니다.
  2. 후기 엔티티에서 내용만 추출해 AI가 후기를 하나씩 인식할 수 있도록 문자열을 만듭니다.
  3. `ChatClient`를 사용해 AI에게 요청을 보내 응답값을 반환합니다.

여기서 `SystemMessage`에 사용할 프롬프트 메시지 내용은 다음과 같이 환경변수로 관리하였습니다.

custom:
  ai:
    review-summary-prompt: |
      너는 후기 요약 전문가야.
      주어진 후기를 읽고 핵심 내용만 3~4문단으로 요약해줘.
      각 문단에는 장점, 단점, 반복적으로 언급된 특징, 긍정/부정 비율을 포함하고,
      사용자가 장비 선택에 참고할 수 있도록 구체적이고 자연스러운 문장으로 작성해줘.

'Spring' 카테고리의 다른 글

Spring AI 개발 일지 (4) - RAG 개념 정리  (0) 2025.12.14
Spring AI 개발 일지 (3) - 챗봇 구현  (0) 2025.12.05
Spring AI 개발 일지 (1) - Spring AI 소개와 핵심 모델  (0) 2025.11.19
PageableExecutionUtils.getPage로 페이징 성능 개선하기  (0) 2025.10.24
Spring 비동기로 이메일 전송하기  (0) 2025.10.21
'Spring' 카테고리의 다른 글
  • Spring AI 개발 일지 (4) - RAG 개념 정리
  • Spring AI 개발 일지 (3) - 챗봇 구현
  • Spring AI 개발 일지 (1) - Spring AI 소개와 핵심 모델
  • PageableExecutionUtils.getPage로 페이징 성능 개선하기
이런개발
이런개발
geun-00의 흔적 보관소
  • 이런개발
    내일이 기대되는 오늘
    이런개발
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 백엔드 면접
      • SQL N
        • SUM, MAX, MIN
        • SELECT
        • GROUP BY
        • JOIN
      • Spring
      • JPA
      • 트러블슈팅
      • Infra
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데브코스
    백엔드 면접
    raid
    티스토리챌린지
    자바
    토스 페이먼츠
    스프링
    오블완
    JPA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
이런개발
Spring AI 개발 일지 (2) - OpenAI 사용해 후기 요약 구현해보기
상단으로

티스토리툴바