Spring Boot에 ChatGPT 연동하기(chat)

Suyeon·2024년 6월 27일

spirng boot에 chatgpt의 핵심 기능! chat 기능 간단하게 연동해보기

API KEY 발급

  1. 먼저 OpenAI 에 접속하여 API KEY를 발급하여야 합니다
    openaidoc > setting > your profile > User API keys
    https://platform.openai.com/settings/profile?tab=api-keys

[+Create new secret key] 버튼을 클릭하여 key 를 생성해주세요.
이름은 자유... 권한은 모두 허용했슴닷 전 다 쓰고 싶으니까용

생성된 키 정보는 꼭 따로 저장해주세요. 다시 만날 수 없습니다...^^


chat 기능은 유료 모델에서만 사용 가능합니다. 그렇기 때문에 계정에 결제수단 등록이 필요합니다. your profile > billing 에 가서 결제수단을 등록한 후 잔액까지 충전해주세요! 잔액이 없을 경우 HTTP/2 429 Too Many Requests 에러가 출력되어 API request가 불가능합니다.

코드 작성

이제 코드만 작성하면 됩니다. 외부 api 의 가장 큰 장점아닐까유...
상세 호출 정보는 opanai api명세를 참고해주세용
https://platform.openai.com/docs/api-reference/chat

application.yml

openai :
	model : gpt-3.5-turbo
	secretkey : {secretkey}

chatGPTController

@Log4j2
@RestController
@RequestMapping(value = "/api/v1/chatGpt")
public class ChatGPTController {

    @Autowired
    private final ChatGPTService chatGPTService;

    public ChatGPTController(ChatGPTService chatGPTService) {
        this.chatGPTService = chatGPTService;
    }

    @PostMapping("/prompt")
    public ResponseEntity<Map<String, Object>> selectPrompt(@RequestBody RequestPrompt requestPrompt) {
        Map<String, Object> result = chatGPTService.prompt(requestPrompt);
        return new ResponseEntity<>(result, HttpStatus.OK);
    }
}

RequestPrompt

@Data
public class RequestPrompt {

    private String message;
}

ChatGPTService/ChatGPTServiceImpl

public interface ChatGPTService {

    Map<String, Object> prompt(RequestPrompt requestPrompt);

}
@Service
@Log4j2
public class ChatGPTServiceImpl implements ChatGPTService{

    @Value("${openai.secretkey}")
    private String secretkey;

    @Value("${openai.model}")
    private String model;

    @Override
    public Map<String, Object> prompt(RequestPrompt requestPrompt) {
          HttpHeaders headers = new HttpHeaders();
        headers.add("Content-type", "application/json");
        headers.add("Authorization", "Bearer " + secretkey);

        //body를 map으로
        Map<String, Object> messages = new HashMap<>();
        messages.put("role", "system");
        messages.put("content", requestPrompt.getMessage());

        Map<String, Object> promptBody = new HashMap<>();
        promptBody.put("model", model);
        promptBody.put("messages", Collections.singletonList(messages));
        System.out.println(promptBody);
        //map -> json 문자열
        ObjectMapper objectMapper = new ObjectMapper();

        String body;
        try {
            body = objectMapper.writeValueAsString(promptBody);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("JSON 변환 중 오류", e);
        }
        System.out.println(body);

        //http 요청
        HttpEntity<String> request = new HttpEntity<>(body, headers);
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange("https://api.openai.com/v1/chat/completions", HttpMethod.POST, request, String.class);
        String responseBody = response.getBody();

        //content만 추출
        Map<String, Object> responseMap = new HashMap<>();
        try {
            JsonNode root = objectMapper.readTree(responseBody);
            String responseContent = root.path("choices").get(0).path("message").path("content").asText();
            responseMap.put("content", responseContent);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("응답 처리 중 오류", e);
        }

        return responseMap;
        
        }
}

request/response 확인

이제 제 api에 request를 넣어 정상적으로 response 되는지 확인합니다
저는 prompt에 message를 입력하면 content 가 출력되는 형식으로 구조를 짜봤습니다.
request

####chatapi
POST http://localhost:8080/api/v1/chatGpt/prompt
Content-Type: application/json

{
  "message" : "오늘의 날씨 알려줘"
}

response

{
  "content": "지금 기준으로 알려드리면 어디에 사시나요? 현재 위치 또는 원하시는 지역을 알려주시면 해당 지역의 날씨 정보를 알려드릴게요."
}

정상적으로 response 됩니다.

profile
안녕하시렵니까😘

0개의 댓글