-
Spring boot: ChatGPT API 사용하기컴퓨터/JAVA 2023. 10. 2. 19:15728x90반응형
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 콜하기 } }
추가
이 라이브러리가 현재(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'컴퓨터 > JAVA' 카테고리의 다른 글
Java: spring boot AWS opensearch 연동하기 (2) 2023.10.09 Java: Z Garbage Collection (ZGC) (0) 2023.01.15 JAVA: Spring Boot REST Api 서버 만들어보기 (0) 2021.01.28