ABOUT ME

-

Total
-
  • Spring boot: ChatGPT API 사용하기
    컴퓨터/JAVA 2023. 10. 2. 19:15
    728x90
    반응형

     

     

    GitHub - flashvayne/chatgpt-spring-boot-starter: a chatgpt starter based on Openai Official Apis.

    a chatgpt starter based on Openai Official Apis. Contribute to flashvayne/chatgpt-spring-boot-starter development by creating an account on GitHub.

    github.com

     

    gradle 기준, 라이브러리를 추가한다.

    implementation 'io.github.flashvayne:chatgpt-spring-boot-starter:1.0.4'

     

    src/resouses.yml 에 아래와 같은 설정을 추가한다. (gpt-3.5-turbo로 하든 gpt-4로 하든 상관없다.)

    chatgpt:
      api-key: sk-키
      model: gpt-4
      multi:
        model: gpt-4
        max-tokens: 512

     

    대충 쓰고 싶은 Service에 ChatgptService를 auto wired 형식으로 추가하면 된다.

    @RequiredArgsConstructor
    @Service
    public class GPTReviewService {
    
        private final ChatgptService chatgptService;
        ...
    }

     

    매주 월요일 아침 7시에 GPT를 돌려서 각 제품 리뷰를 요약하게 했다. (야놀자 스타일)

    Scheduled로 cron job을 할 수 있고 multichat으로 system role을 설정하고 유저의 메시지를 전달할 수 있다.

    아래 예제는 저장된 리뷰의 3~5는 긍정적, 1~3은 부정적 리뷰로 분류해서 각 리뷰를 요약하는 것이다.

    @RequiredArgsConstructor
    @Service
    public class GPTReviewService {
    
        private final ChatgptService chatgptService;
        private final CosmeticRepository cosmeticRepository;
        private final ReviewRepository reviewRepository;
        private final GPTReviewRepository gptReviewRepository;
    
        @Value("${chatgpt.system}") // 시스템 메시지를 추가함
        private String systemRole;
    
        @Value("${chatgpt.multi.model}") // gpt-4 로 설정함
        private String gptVersion;
    
        @Scheduled(cron = "0 0 7 ? * MON") // 매주 월요일 아침 7시
        public void summarizeReviews() {
    //        System.out.println("====== " + systemRole);
            List<Cosmetic> allCosmetics = cosmeticRepository.findAll();
    
            for (Cosmetic cosmetic : allCosmetics) {
                List<Review> positiveReviews = reviewRepository.findRandomReviewsByRatingAndCosmetic(3, 5, cosmetic.getId(), 10);
                List<Review> negativeReviews = reviewRepository.findRandomReviewsByRatingAndCosmetic(1, 3, cosmetic.getId(), 10);
    
                // 아래에서 GPT API CALL
                String positiveSummary = saveSummarizedReviews(positiveReviews, cosmetic);
                String negativeSummary = saveSummarizedReviews(negativeReviews, cosmetic);
    
                // Check if GPTReview already exists for this cosmetic
                Optional<GPTReview> existingReviewOpt = gptReviewRepository.findByCosmetic(cosmetic);
    
                if (existingReviewOpt.isPresent()) {
                    // If it exists, update it
                    GPTReview existingReview = existingReviewOpt.get();
                    existingReview.setPositive(positiveSummary);
                    existingReview.setNegative(negativeSummary);
                    gptReviewRepository.save(existingReview);
                } else {
                    // If it doesn't exist, create a new one
                    GPTReview gptReview = GPTReview.builder()
                            .gptVersion(gptVersion)
                            .positive(positiveSummary)
                            .negative(negativeSummary)
                            .cosmetic(cosmetic)
                            .build();
                    gptReviewRepository.save(gptReview);
                }
            }
        }
    
        private String saveSummarizedReviews(List<Review> reviews, Cosmetic cosmetic) {
            StringBuilder allContents = new StringBuilder();
            allContents.append("제품명: ").append(cosmetic.getName()).append("\n");
    
            int index = 1;
            for (Review review : reviews) {
                allContents.append("리뷰").append(index).append(". ").append(review.getContent()).append("\n");
                index++;
            }
    
            List<MultiChatMessage> messages = Arrays.asList(
                    new MultiChatMessage("system", systemRole), // 시스템 설정하기
                    new MultiChatMessage("user", allContents.toString())); // 메시지 전달
    
            return chatgptService.multiChat(messages); // GPT API 콜하기
        }
    }

     

    추가

    chatgpt-spring-boot-starter-1.0.4.jar
    0.04MB

    이 라이브러리가 현재(2023-11-22) 함수마다 모델 같은 걸 바꿀 수 없어서 일단 MultiChat 부분만 코드를 바꾸고 빌드했다.

    (ChatRole.SYSTEM, ChatRole.ASSISTANT, ChatRole.USER를 사용해야 한다.)

        public String generate(String yay) {
            var multiChatRequest = MultiChatRequest.builder()
                    .maxTokens(128)
                    .model("gpt-3.5-turbo-1106")
                    .responseFormat("json_object")
                    .build();
    
            var messages = List.of(
                    new MultiChatMessage(ChatRole.SYSTEM, "Return as json, bark"),
                    new MultiChatMessage(ChatRole.ASSISTANT, "woof?"),
                    new MultiChatMessage(ChatRole.USER, yay));
    
            return chatgptService.multiChat(messages, multiChatRequest);
        }
    728x90

    댓글