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

[+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;
}
}
이제 제 api에 request를 넣어 정상적으로 response 되는지 확인합니다
저는 prompt에 message를 입력하면 content 가 출력되는 형식으로 구조를 짜봤습니다.
request
####chatapi
POST http://localhost:8080/api/v1/chatGpt/prompt
Content-Type: application/json
{
"message" : "오늘의 날씨 알려줘"
}
response
{
"content": "지금 기준으로 알려드리면 어디에 사시나요? 현재 위치 또는 원하시는 지역을 알려주시면 해당 지역의 날씨 정보를 알려드릴게요."
}
정상적으로 response 됩니다.