https://platform.openai.com/docs/api-reference
API Key ๋ฐ๊ธ ๋ฐ๊ธฐ
๋ฐ๊ธ ๋ฐ์ ํค๋ ๋ค์ ๋ณผ ์ ์๋ค.
๋ค๋ฅธ๊ณณ์ ๋ณด๊ดํ์
APIํค๋ฅผ ํฌํจํด์ ํ๋ก์ ํธ๋ฅผ ๊นํ์ ์ ๋ก๋ํ๋ฉด ๋ค์ ์์ฑํด์ผ๋๋ค.
๋ชจ๋ธ ์ ํ
text-davinci-003 ์ ์ ํํ๋ค.
RestTemplate์ผ๋ก API ์์ฒญํ๊ธฐ
@Service
public class ChatGptService {
private String API_KEY = "";
private static final String ENDPOINT = "https://api.openai.com/v1/completions";
public ResponseEntity<String> generateText(String prompt, float temperature, int maxTokens) {
//HttpHeader ์ค๋ธ์ ํธ ์์ฑ
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type", "application/json");
headers.add("Authorization", "Bearer " + API_KEY);
//HttpBody ์ค๋ธ์ ํธ ์์ฑ
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", "text-davinci-003");
requestBody.put("prompt", prompt);
requestBody.put("max_tokens", maxTokens);
requestBody.put("temperature", temperature);
// HttpHeader์ HttpBody๋ฅผ ํ๋์ ์ค๋ธ์ ํธ์ ๋ด๊ธฐ
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
RestTemplate rt = new RestTemplate();
//Http POST ๋ฐฉ์ ์์ฒญ - response ๋ณ์ ์๋ต
ResponseEntity<String> response = rt.exchange(
ENDPOINT, // ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์ฃผ์
HttpMethod.POST,
requestEntity,
String.class
);
return response;
}
}
๋ฐ๊ธ ๋ฐ์ API ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
ํ๋ผ๋ฏธํฐ
- model : ์ด๋ค GPT ๋ชจ๋ธ์ ์ฌ์ฉํ ์ง ์ง์
- prompt : ์ง๋ฌธํ ๋ฌธ์ฅ
- max_tokens : ์๋ต์ ์ปจํ ์คํธ ๊ธธ์ด
- temerature : ์ผ๋ง๋ ์ฐฝ์์ ์ธ ๋ต์ ์์ฑํ๋๋ก ํ ์ง ์ง์ ํ๋ ๊ฐ. ํด์๋ก ์ฐฝ์์ ์ด๊ณ ์์์๋ก ์ ์ ์๋ ๋ต์ ์ ์ถํ๋ค.
@RequestMapping("/chatGpt")
@ResponseBody
public ResponseEntity<String> chatGpt() throws JsonProcessingException {
log.info("ok");
ResponseEntity<String> response = chatGptService.generateText("ChatGPT๋ ๋ฌด์์ธ๊ฐ์?", 1.0f, 1000);
return response;
}
JSON ํ์์ผ๋ก ์๋ต์ด ์จ๋ค.
JSON ํ์ผ์ Java ํด๋์ค๋ก ๋ง๋ค์
https://www.jsonschema2pojo.org/
jsonschema2pojo๋ JSON ์คํค๋ง๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
ObjectMapper objectMapper = new ObjectMapper();
ResponseData responseData = null;
try {
responseData = objectMapper.readValue(response.getBody(), ResponseData.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
JSON ํ์ผ์ jsonschema2pojo ํตํด์ ์์ฑํ Java ํด๋์ค ๊ฐ์ฒด๋ก deserialization ํ๊ธฐ ์ํด์๋
ObjectMapper์ readValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
๋ ์๋ฌ
๋ค๋ฅธ๊ฑฐ ๋ค ๋ฐ๊ฟ๊ฐ๋ฉด์ ํด๋ดค๋๋ฐ
์๋ฐ ํด๋์ค๋ฅผ ์๋ชป๋ง๋ค์๋์ง ์๋๋ฉด deserialization ์์ ์ด ์๋ชป๋ ๊ฒ ๊ฐ๋ค.
๋ค์์ ํด๊ฒฐํ์...
4/14(๊ธ)
๊ต์๋๊ป ๋ฌผ์ด๋ด์ ํด๊ฒฐํ๋ค.
jsonschema2pojo ํตํด์ ์์ฑํ Java ํด๋์ค์ ๋ฌธ์ ๊ฐ ์์๋ค.
์์ธ์ ๋ฐ๋ก Inner Class๊ฐ static(์ ์ )์ผ๋ก ์ ์ธ๋์ง ์๋ ํ ๋จ๋ (Outer ํด๋์ค๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ )์ผ๋ก Inner Class์ ๋ํดํธ ์์ฑ์๋ฅผ ํธ์ถํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ ๊ฒ์ด๋ค. ์ฆ, ์์ ๊ฐ์ ์์ธ๋ฅผ ํผํ๋ ค๋ฉด Inner Class๋ฅผ ๋ณ๋์ ํด๋์ค๋ก ์์ฑํ๋๊ฐ, ์๋๋ฉด static Inner Class๋ก ์ ์ธํด์ฃผ์ด์ผ ํ๋ค.
@Data
public class ResponseData {
public String id;
public String object;
public Integer created;
public String model;
public List<Choice> choices;
public Usage usage;
}
Choice ํด๋์ค๋ฅผ ResponseData ์ Inner Class ๋ก ์์ฑํ์๋ค.
@Data
public class Choice {
public String text;
public Integer index;
public Object logprobs;
public String finish_reason;
}
๋ณ๋์ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
@RequestMapping("/chatGpt")
@ResponseBody
public String chatGpt() throws JsonProcessingException {
log.info("ok");
ResponseData responseData = chatGptService.generateText("chatGPT๋ ๋ฌด์์ธ๊ฐ์?", 1.0f, 1000);
return responseData.getChoices().get(0).getText();
}
์๋ต ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด์
text ๋ง ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธ !
'Develop > API' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์นด์นด์ค ๋ก๊ทธ์ธ API ๊ตฌํ ํ๊ธฐ (REST API ๋ฐฉ์) (0) | 2023.03.26 |
---|