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 인터페이스를 작성한다
- @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 사용법: https://shutcoding.tistory.com/entry/CURL-%EC%9D%B4%EB%9E%80-CURL%EC%82%AC%EC%9A%A9%EB%B2%95
- chat gpt api 샘플코드: https://github.com/Kernel360/f1-KernelSquare-backend/pull/324/files#diff-05f9b6b9b5b15b5aff455b2b8325f0f0675bd3dd4fddb55326de81b8e9b34fe3