주뇽's 저장소

[Spring] [GPT] Spring Boot에서 OpenAI API를 이용하여 GPT 연동하기 본문

웹개발/SpringBoot

[Spring] [GPT] Spring Boot에서 OpenAI API를 이용하여 GPT 연동하기

뎁쭌 2024. 2. 18. 16:09
728x90
반응형

 

1. OPENAI GPT API 및 요청 및 응답 데이터 확인

준비물 : OpenAI API를 이용하기 위해서는 OpenAI에 신용카드를 등록해야 한다. 이후 자신의 API Key를 확인.

 

API 레펀러스 페이지에서 초록색 API Keys 문구를 클릭하여 자신의 새로운 API Key를 생성하고 확인한다.

 

1-1 GPT 요청 형식 확인하기

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "현재 한국의 온도는 어떤가요?"
    }
  ],
  "temperature": 1,
  "max_tokens": 256,
  "top_p": 1,
  "frequency_penalty": 0,
  "presence_penalty": 0
}'

Authorization : 부분에 자신의 OpenAI API Key를 넣어서 요청을 보내주면 된다.

요청 구조를 보면

  • 엔드포인트 : //api.openai.com/v1/chat/completions.
  • 자신의 api Key
  • model
  • messages 

해당 엔드포인트에 자신의 api key와 모델, 메시지를 함께 전송해주면 된다.

 

1-2 GPT 응답 데이터 확인하기

{
    "id": "chatcmpl-8tUbLbfne4rO96nVrfjguN0yzp0F8",
    "object": "chat.completion",
    "created": 1708236363,
    "model": "gpt-3.5-turbo-0125",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "죄송합니다, 현재 저는 실시간 정보를 제공할 수 없습니다. 하지만 한국의 온도 정보는 기상청 홈페이지나 기상앱을 통해 확인하실 수 있습니다.더 필요한 정보가 있으시면 도와드리겠습니다."
            },
            "logprobs": null,
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 25,
        "completion_tokens": 82,
        "total_tokens": 107
    },
    "system_fingerprint": "fp_69829325d0"
}

위 처럼 현재 한국 온도에 대한 GPT의 답변을 받을 수 있다. 위와 같이 엔드포인트를 이용하여 Spring Boot에서 GPT를 연동하여 이용할 수 있다.

응답 구조를 확인해보면

  • choices -> contnet 안에 답변을 확인할 수 있다.

2. Spring Boot GPT 연동(여기부터 따라해도 상관없음)

2-1 테스트를 위한 스프링 부트 프로젝트 생성

  • Spring Web
  • Lombok
  • Spring boot DevTools

 

application.properties에 openai 정보 설정

openai.model=gpt-3.5-turbo
openai.api.key=자신의 OpenAI API Key
openai.api.url= https://api.openai.com/v1/chat/completions

 

 

2-2 테스트를 위한 RestTemplate 등록

 

RestTemplate를 빈으로 등록

  • RestTemplate은 스프링 프레임워크가 제공하는 클래스로, RESTful 서비스를 소비하기 위한 동기식 HTTP 클라이언트이다. RestTemplate을 사용하면 HTTP 요청을 보내고, 응답을 받아, 자바 객체로 변환하는 과정을 간편하게 처리할 수 있다.
  • RestTemplate은 다양한 HTTP 메소드(GET, POST, DELETE 등)를 지원하며, HttpEntity를 통해 요청 본문과 헤더를 설정할 수 있고, ResponseEntity를 통해 응답 본문과 상태 코드 등을 받을 수 있다.
package com.example.openaitest.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class OpenAiConfig {
    @Value("${openai.api.key}")
    private String openAiKey;
    @Bean
    public RestTemplate template(){
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add((request, body, execution) -> {
            request.getHeaders().add("Authorization", "Bearer " + openAiKey);
            return execution.execute(request, body);
        });
        return restTemplate;
    }
}
"Bearer " + openAiKey
// Bearer 이 부분을 꼭 띄어쓰기 해야함

2-3 테스트를 위한 요청 응답 DTO 작성

 

// Message
package com.example.openaitest.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {
    private String role;
    private String content;

}
// ChatGPTRequest
package com.example.openaitest.dto;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
public class ChatGPTRequest {
    private String model;
    private List<Message> messages;

    public ChatGPTRequest(String model, String prompt) {
        this.model = model;
        this.messages =  new ArrayList<>();
        this.messages.add(new Message("user", prompt));
    }
}
// ChatGPTResponse
package com.example.openaitest.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatGPTResponse {
    private List<Choice> choices;


    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Choice {
        private int index;
        private Message message;

    }
}

 

2-4 테스트를 위한 Controller 작성

 

package com.example.openaitest.controller;

import com.example.openaitest.dto.ChatGPTRequest;
import com.example.openaitest.dto.ChatGPTResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/bot")
public class CustomBotController {
    @Value("${openai.model}")
    private String model;

    @Value("${openai.api.url}")
    private String apiURL;

    @Autowired
    private RestTemplate template;

    @GetMapping("/chat")
    public String chat(@RequestParam(name = "prompt")String prompt){
        ChatGPTRequest request = new ChatGPTRequest(model, prompt);
        ChatGPTResponse chatGPTResponse =  template.postForObject(apiURL, request, ChatGPTResponse.class);
        return chatGPTResponse.getChoices().get(0).getMessage().getContent();
    }

}

 

 

  • ChatGPTResponse chatGPTResponse = template.postForObject(apiURL, request, ChatGPTResponse.class);: RestTemplate의 postForObject 메소드를 사용하여, apiURL 주소로 request 객체를 JSON 형태로 전송하고, ChatGPTResponse 클래스의 인스턴스로 응답을 받는다. apiURL은 OpenAI의 ChatGPT API 엔드포인트 주소를 나타낸다. 이 메소드는 요청을 보내고, 응답을 받아 ChatGPTResponse 타입의 객체로 변환한다.

3. 요청 결과 확인

 http://localhost:8080/bot/chat?prompt=한국은 어떤 나라인가요?

 

위와 같이 /bot/chat 으로 GET 요청을 보낸 결과 Spring Boot에 GPT를 잘 연동한 모습을 확인할 수 있다!!

 

출처 :  https://www.youtube.com/watch?v=HlDkuFy8xRM