* 이 포스트는 학습 과정에서 그 내용을 기록한 글이기에 부정확한 정보가 포함될 수 있습니다.
따라서 해당 글은 참고용으로만 봐주시고 틀린 부분이 있다면 알려주시면 감사하겠습니다.
우선 제가 맨 처음에 chatGPT에 대해서 들었을땐 아무래도 영어에 최적화 되어 있어서 한글로 질문하면 시간이 2배 정도 더 걸린다고 하더라구요. 그렇기 때문에 처음 생각만 할 때는 한글로 된 개발자의 질문을 파파고 api를 통해 영어로 번역하고 그것을 GPT에 질문하고 나온 대답을 다시 파파고로 번역해서 보여주는 것을 생각했습니다. 그런데 실제로 GPT를 사용해서 한글로된 질문 몇 개를 해보니 속도 차이가 그리 나지도 않고 답변도 한글로 잘만 해주더라구요.
그래서 문득 궁금해져서 GPT에 직접 질문을 해봤습니다.
Q : 선호나 취향의 문제라기보단 네가 영어로 대답할때 한글로 대답하는 속도보다 빠른 것 같아서 그랬어. 아니야?
A : (대충 그렇다는 대답)
Q : 그 말은 영어가 네게 최적화되어 있을 뿐 다른 언어 역시도 모두 번역없이 이해할 수 있다는 뜻이니?
A : Yes, that's correct. As a language model trained by OpenAI, I have been trained on a large corpus of text in multiple languages, including Korean and English, and can understand and generate text in multiple languages without the need for translation. However, my responses may be faster in the language I was optimized for, which is English.
뭐 하여튼 이 답변을 받고나서 몇 번 더 질문해보고 관련 자료를 찾으며 알아봤는데, 알고리즘이 해당 언어로 된 자료를 학습하여 답변해주는 것이라 한글은 많은 검색 데이터가 격리된 네이버를 통해 존재하며 그걸 차치하더라도 영어 자료가 그 양에선 비교할 수 없기때문에 결과적으로 질문과 답변 둘다 영어로 API를 사용하는 것이 낫다고 결론 지었습니다.
간단한 api 테스트
🤚 이 포스트를 보시는 분이 입문자시라면 다음과 같은 선행 지식을 갖추셔야 이해하기 편하실겁니다. 필요하시다면 먼저 학습하시길 추천합니다. 괄호는 모르셔도 큰 문제는 없습니다.
- 스프링 부트 : Controller 및 Service 활용
이번 테스트에선 처음 봐도 이해가 될 수 있도록 쉽게 service 컴포넌트를 작성했는데 실제 프로젝트에선 이번 포스팅처럼 서비스에 변수랑 함수 떡칠하면 안됩니다. 예제로써만 봐주세요.
일단 사용하기로 한 파파고와 gpt의 api를 한 번 테스트 해보려합니다. 정말 별거 없고 응답이 오는지만 확인할 예정입니다. testCode는 https://github.com/kth1017/practice_ChatGPT_1 에 올려뒀습니다. 사용 환경은 JAVA 11, Spring 2.8, intelliJ입니다.
api 키 발급 받는 건 구글에 쳐보면 바로 나오니 스킵하고 코드만 간략하게 언급하겠습니다. 아래 내용부터는 스프링에 대한 지식을 갖추셨다는 가정하에 작성하겠습니다.
오랜만에 코딩하는거라 api 요청 코드는 직접 작성하기보단 그냥 네이버 파파고 api 예제 조금만 수정해서 작성했습니다. 혹시라도 스프링으로 이 내용을 처음하시는 분이 보실 수 있으니 간단히 설명하면
1 PapagoService에서 Http 요청을 보내고 응답을 받아 reponseBody에 담는 함수를 만든다
2 Controller를 통해 요청에 보낼 body를 인수로 넣어주고 PapagoService의 함수들을 실행, model에 reponseBody를 담는다.
3 View(thymleaf)에서 model에 담긴 reponseBody를 출력한다.
이 과정을 진행하고 테스트인만큼 다른 과정 다 생략했습니다. 위 과정 중에서 PapagoService가 그나마 좀 코드가 길어 부가 설명하자면(아 그리고 포스팅할 때 너무 당연한 try catch문은 너무 길어서 죄다 뺐으니까 보고 싶으시면 github가서 보시면 됩니다.)
// PapagoService - 1
public String incoding(String s) {
String clientId = "";//애플리케이션 클라이언트 아이디값";
String clientSecret = "";//애플리케이션 클라이언트 시크릿값";
String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
String text;
text = URLEncoder.encode(s, "UTF-8");
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientId);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = post(apiURL, requestHeaders, text); // * post 함수는 내가 작성해야함
return responseBody;
}
일단 PapagoService에서 내가 번역할게 "안녕하세요"라면 이 단어를 Http 요청 바디에 담고 api 요청을 할 때 요구되는 정보를 헤더에 담는 incoding함수를 하나 만들어줍니다. return은 보낸 요청에 대한 응답인 responseBody입니다. 여기서 조금 살펴볼 것은 post함수인데 이 post함수는 어디에서 import하는 것보단 내가 만들어주는게 편합니다.
// PapagoService - 2
private String post(String apiUrl, Map<String, String> requestHeaders, String text) {
HttpURLConnection con = connect(apiUrl);
String postParams = "source=ko&target=en&text=" + text; //원본언어: 한국어 (ko) -> 목적언어: 영어 (en)
try {
con.setRequestMethod("POST");
for (Map.Entry<String, String> header : requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
con.setDoOutput(true);
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
wr.write(postParams.getBytes());
wr.flush();
}
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 응답
return readBody(con.getInputStream());
} else { // 에러 응답
return readBody(con.getErrorStream());
}
}
post 함수도 크게 어려울 건 없고 postParam에 양식에 맞게 언어>언어 지정해주는 문장 넣어주면 됩니다. 요청에 담아줄 헤더와 바디가 완성되었으니 post 요청을 올바른 url에 연결해줄 connect 함수도 만들어 줍니다.
// PapagoService - 3
private HttpURLConnection connect(String apiUrl) {
URL url = new URL(apiUrl);
return (HttpURLConnection) url.openConnection();
}
connect 함수는 더 별거 없고 그냥 import해준 함수 쓰면 됩니다.
// PapagoService - 4
private String readBody(InputStream body){
InputStreamReader streamReader = new InputStreamReader(body);
BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
}
마지막으로 응답 받은 responseBody를 우리가 읽을 수 있는 string으로 변환해줄 readBody 함수를 만들어줍니다. 포스팅에 생략된 try catch로 잡히는 예외 메세지도 readBody를 통해 출력됩니다.
이렇게 PapagoService를 작성하고 필요한 부분만 수정해서 GptService도 만들어줍니다.
@Controller
@RequiredArgsConstructor
public class Controller {
private final PapagoService pService;
private final GptService gptService;
@GetMapping
public String home(Model model) {
String pBody = pService.incoding("안녕하세요");
String gBody = gptService.incoding("Capital of Korea?");
model.addAttribute("pBody", pBody);
model.addAttribute("gBody", gBody);
return "home";
}
}
그 다음에 Controller 하나 만들어서 서비스에서 만들어준 함수를 실행해줍니다. 생성자 주입은 안다고 가정하고 그냥 넘어가겠습니다. view는 그냥 thymleaf로 작성해서 서버 켜보면
api 요청은 크게 문제가 없어보이네요.
api쓰는데 큰 문제가 없는 걸 보니 프로젝트를 더 진행해도 될 것 같습니다. 다음 포스트에서 게속...
'Project' 카테고리의 다른 글
P3_GPT API로 프로그래밍 AI 웹서비스 만들어보기(spring Boot+React)_3 리액트+스프링 부트 연동2 (0) | 2023.02.06 |
---|---|
P3_GPT API로 프로그래밍 AI 웹서비스 만들어보기(spring Boot+React)_2 리액트+스프링 부트 연동1 (0) | 2023.02.05 |
P3_GPT API로 프로그래밍 AI 웹서비스 만들어보기(spring Boot+React)_Ready (0) | 2023.02.02 |
P2_페이지 내 하이퍼 링크 달아주는 코드_4_TDD(2) (0) | 2022.07.02 |
P2_페이지 내 하이퍼 링크 달아주는 코드_3_요구사항 분석과 TDD (0) | 2022.06.17 |