TroubleShooting & Study/SpringBoot

[Open AI API, Feign Client] Java로 Open AI API 사용하기

DH_0518 2024. 9. 8. 18:38

OpenAI 홈페이지의 API docs에 들어가면 세 가지 library의 request example을 보여준다

 

 

(주소: https://platform.openai.com/docs/api-reference/chat/create)

 

 

처음에 'curl, python, node.js' 세 가지만 나오길래 java로는 사용할 수 없나? 라는 생각을 했지만.. 그럴 리가 없지

curl은 'Client URL'로, 다양한 통신 프로토콜을 지원해주기에 자신의 서버에서 Http 통신으로 요청을 주고받을 수 있다

즉, 그냥 형태만 올바르게 맞춰서 request를 보내면 response를 받아올 수 있다는 것이다

 

스프링에서는 서버에서 http 통신을 지원해주는 다양한 라이브러리가 존재하는데, 나는 그중에서 Feign Client를 사용해서 통신해 보겠다

 

 

 

 

 

 

1. spring-cloud-openfeign 의존성 추가

: Feign Client를 사용하기 위해서 'build.gradle'에 다음 의존성들을 추가한다

 

 

2. @EnableFeignClients 추가

: 메인 애플리케이션 클래스에 @EnableFeignClients를 추가한다

 

 

3. FeignClient 인터페이스 생성

: 여기서부터 OpenAI API docs에 따라서, 실제 통신이 이루어질 FeignClient 인터페이스를 작성한다

feign client interface

 

  • @FeignClient
    • name: 생성할 FeignClient의 이름을 지정
    • url: 요청 보낼 end point의 base url. 여기서 docs에 따르면 'https://api/openai/com' 정도가 될 수 있다. 나는 어차피 하나만 사용할 거라 그냥 'https://api/openai/com/v1/chat/completions'로 등록했다
  • @RequestMapping
    • POST Method: docs에서 POST를 사용하라 했으므로 POST
    • produces: docs에서 content-type: application/json이므로, produces 속성을 통해 Request의 Content-Type을 설정한다
    • RequestHeader: 헤더에 'Authorization' 필드를 선언하고, 자기 계정의 api 키를 설정한다
    • RequestBody: 바디에는 자기가 요청하고 싶은 필드값들을 담아서 보내면 되는데, 'messages'와 'model'은 필수 값이니 docs를 보고 잘 설정해 주자 (아래에 예시 참고)
  • Response
    • Response에는 많은 field가 존재하는데, 그중에서 자기한테 필요한 값들만 받아오면 된다
    • 나는 'choices' - 'message' - 'role', 'content' 만 받아왔다

 

RequestBodyDto 예시

 

 

 

ResponseDto 예시

  • Choices = List<Choice> (choice를 리스트로 가짐)
  • Choice = 'index', 'message', 'logprobs', 'finish_reason' (4개의 필드를 가짐)
  • message = 'content', 'role' ('content'와 'role'을 필드로 가짐)

 

 

 

4. FeignClient 호출

: 마지막으로, 서비스에서 우리가 생성했던 FeignClient를 호출해서 실제로 request를 보내고 response를 받아보자

 

전혀 복잡하게 할 필요 없이 RequestBodyDto를 생성 후, 혹시 모를 exception을 대비해서 try/catch로 감싸서 fiengClient를 호출하기만 하면 된다. 끝!!

 

 

 

 

 

결과

: docs의 response처럼 choices = List<choice>, choice = {message : {content, role}} 형태인 것을 볼 수 있다

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference

 

CURL 이란? CURL사용법

CURL 이란? cURL = Client URL 클라이언트에서 커맨드 라인이나 소스코드로 손 쉽게 웹 브라우저 처럼 활동할 수 있도록 해주는 기술(커맨드라인 Tool 혹은 라이브러리) 서버와 통신할 수 있는 커맨드

shutcoding.tistory.com

 

[feat] 커널스퀘어 AI 인턴 기능 by fingersdanny · Pull Request #324 · Kernel360/f1-KernelSquare-backend

PR을 보내기 전에 확인해주세요!! 컨벤션에 맞게 작성했습니다. 컨벤션 확인은 여기 변경 사항에 대한 테스트를 했습니다. 관련 이슈 close #298 개요 Q&A 답변에 자동으로 답해주는 답변 봇 기능 상

github.com