review bot 만들기

최준호·2023년 11월 4일
0

Appling

목록 보기
9/12
post-thumbnail

🔴 review bot 만들기

참고
openai document

🟠 java project로 만들기

리뷰 봇을 검색해보니 구글에서는 이미 golang으로 만들었고 깃헙에서 가장 많은 스타를 얻은 프로젝트는 ts로 해서 다른 언어로 해볼까 생각했지만 일단 빠르게 만들어서 접근해보고 싶어 가장 친숙한 java로 프로젝트를 시작했다. 익숙해지고 시간이 나면 golang으로 전환할 예정이다.

🟢 open api key 발급

open ai 홈페이지에 로그인한 후

api를 선택한다.

그리고 계정을 누르고 View API Keys를 선택하면

다음과 같이 쉽게 발급이 가능하다.

이제 api를 사용하며 token을 사용하게 되는데 해당 토큰은 Usage에서 사용량을 체크할 수 있고 초반에는 18달러 정도를 무료로 제공해주는데 해당건으로 충분히 테스트할 수 있을만한 양이다.

🟢 간단한 프로젝트 설계

@RestController
@RequestMapping("/api/v1")
@RequiredArgsConstructor
public class ReviewController {
    private final ReviewService reviewService;

    @PostMapping("/review")
    public ResponseEntity<Mono<OpenAIResponse>> review(@RequestBody ReviewRequest reviewRequest) {
        return ResponseEntity.ok(
                Mono.just(reviewService.review(reviewRequest))
        );
    }
}
public interface ReviewService {
    OpenAIResponse review(ReviewRequest reviewRequest);
}
@Service
public class ReviewServiceImpl implements ReviewService {
    private final Environment env;
    private final WebClient webClient;
    private final ObjectMapper objectMapper;

    public ReviewServiceImpl(Environment env, ObjectMapper objectMapper) {
        this.env = env;

        String secretKey = env.getProperty("openai.api_key");
        this.webClient = WebClient.builder()
                .baseUrl("https://api.openai.com/v1")
                .defaultHeader("Authorization", "Bearer " + secretKey)
                .defaultHeader("Content-Type", "application/json")
                .build();

        this.objectMapper = objectMapper;
    }
    @Override
    public OpenAIResponse review(ReviewRequest reviewRequest){
        String prompt = reviewRequest.getPrompt();

        OpenAIMessage system = OpenAIMessage.builder()
                .role("system")
                .content("you are a helpful code review. Please provide feedback.")
                .build();

        OpenAIMessage user = OpenAIMessage.builder()
                .role("user")
                .content(prompt)
                .build();

        List<OpenAIMessage> messages = List.of(system, user);

        OpenAIBody body = OpenAIBody.builder()
                .model("gpt-3.5-turbo")
                .messages(messages)
                .build();
        String bodyAsString = "";
        try{
            bodyAsString = objectMapper.writeValueAsString(body);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }

        String res = webClient.post()
                .uri("/chat/completions")
                .bodyValue(bodyAsString)
                .retrieve()
                .bodyToMono(String.class)
                .doOnError(throwable -> {
                    throw new RuntimeException("에러 내가 만듦");
                })
                .block();

        OpenAIResponse response = webClient.post()
                .uri("/chat/completions")
                .bodyValue(bodyAsString)
                .retrieve()
                .bodyToMono(OpenAIResponse.class)
                .doOnError(throwable -> {
                    throw new RuntimeException("에러 내가 만듦");
                })
                .block();

        return response;
    }
}

다음과 같이 반환까지 확인해볼 수 있었다!

갑자기 이번 포스트를 급하게 끝내는 이유는 생각해보니 이렇게 처리할 필요가 없었다... 물론 덕분에 나중에 해당 기능을 사용하여 system쪽을 수정해서 좀 더 자세한 ai bot을 만드는 방법을 배웠는데 당장 리뷰를 해주는 오픈소스가 더 편하고 깃허브 pr을 체크하여 소스를 리뷰해야 되기 때문에 해당 부분까지 구현하기에는 오픈소스를 사용하는 것이 더 편하여 오픈 소스를 사용하기로 했다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글