Paradox Simulation

728x90
반응형

저번 시간에 chatGPT api 를 이용해서 react - spring boot 방식으로 chat gpt를 구현해봤다.

2023.03.24 - [프로그래밍] - React - Spring boot로 gpt api를 가져와서 간단하게 응답하는 웹페이지 구현하기

 

React - Spring boot로 gpt api를 가져와서 간단하게 응답하는 웹페이지 구현하기

gpt api를 이용해서 웹페이지 구축 - 백엔드편 Spring Initializr 이 사이트를 들어가서 maven 프로젝트와 dependencies에 Spring WEB, Lombok을 추가한다. 프로젝트를 연다. 열고나서 간단하게 package는 3개 만든다

haleta.tistory.com

 

 

하지만 저번 대답이 시원 찮았던 이유가, api를 가져와서 쓰게되면 자동 한국어 번역이 미 지원된다고 한다!

 

그러면 이제 어떻게 해야할까?

 

바로 우리가 직접 번역기에 넣어서 돌려주는 것이다.

 

우선 naver 파파고 api 를 가져오기 위해서 아래와 같은 사이트에 가서 애플리케이션을 받는다.

애플리케이션 - NAVER Developers

 

애플리케이션 - NAVER Developers

 

developers.naver.com

 

 

사용할 Papago 번역을 눌러주고, 애플리케이션 이름을 적어준다. (필자는 번역기 라고 적었다)

 

 

눌러보면 다음으로 호나경추가 설정이 나오는데, WEB 설정으로 하고 위와 같이 주소를 이볅한다.

딱히 구별을 안하는거같다

 

등록하기를 누르게 되면 애플리케이션 발급이 되었다.

 

여기서 중요한건 Client ID 와 Secret인데, 어디에 잘 저장해 두자.

 

그럼 이제 우리가 저번에 만들었던 것에서 어느 부분에 적용하면 될까?

 

우선 OpenAIApi.java 파일을 다시 연다.

 

그중에서 먼저 ID와 Secret값을 넣어주자.

 

    private static final String PAPA_ID = "발급받은 id";

    private static final String PAPA_SE = "발급받은 secret";

위 소스코드를 gpt api key String값 아래에 잘 정리해서 넣어주도록 하자.

 

그러면 첫째로 우리가 입력받는 곳에서 먼저 변환이 필요하다.

 

ask 메서드를 확인해보면 prompt로 매개변수를 전달받아서 사용하고있는데,

저 값을 확인해보면, {"prompt": "입력한값"} 형태로 나오게 된다.

그러면 저 String으로 받은 값을 먼저 json 형태로 변환 후 key값만 가져오면 되지 않을까?

 

그래서 extractValue라는 메서드를 하나 만들어줬다.

 

    public static String extractValue(String jsonString) {
        JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
        String value = jsonObject.get("prompt").getAsString();
        return value;
    }

 

해당 메서드는 위의 값형태의 String값을 받으면 그중에서 value값만 가져오는 형태이다.

 

그럼 이걸 어디에 넣어주느냐면 다시 ask로 돌아가서 다음과같이 수정한다.

 

public String ask(String prompt) {
        String responseBody = "";
        String translatedText ="";
        System.out.println(prompt);
        try{
            String sourceLang = "ko";
            String targetLang = "en";
            translatedText = translate(PAPA_ID, PAPA_SE, sourceLang, targetLang, extractValue(prompt));
            System.out.println(translatedText);
        } catch (Exception e){
            e.printStackTrace();
        }

        JSONObject jsonBody = new JSONObject();
        jsonBody.put("prompt", translatedText);
        jsonBody.put("max_tokens", 2048);
        jsonBody.put("n", 1);
        jsonBody.put("top_p", 0.1);
        jsonBody.put("temperature", 0.1);

        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create("https://api.openai.com/v1/engines/text-davinci-002/completions"))
                    .header("Content-Type", "application/json")
                    .header("Authorization", "Bearer " + API_KEY)
                    .POST(HttpRequest.BodyPublishers.ofString(jsonBody.toString()))
                    .build();
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            responseBody = extractAnswer(response.body());
            System.out.println(responseBody);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String replyText = "";
        try{
            String sourceLang = "en";
            String targetLang = "ko";
            replyText = translate(PAPA_ID, PAPA_SE, sourceLang, targetLang, responseBody);
            System.out.println(replyText);
        } catch (Exception e){
            e.printStackTrace();
        }

        return replyText;
    }

 

간단하게 생각해보면 내가 응답을 전송하기전 ko -> en 으로 변환

응답을 받아서 화면에 출력하기 전 en -> ko 으로 변환

이런식으로 구현하는것이다.

 

이제 하나씩 설명해보면 papago api에서 권고하는 방식으로 sourceLang, targetLang을 정한다.

우린 한국어, 영어만 사용하니까 간단하게 한국어 : ko, 영어 : en 이다.

 

그럼 그다음 transale에 대해서 설명하겠다.

 

public static String translate(String clientId, String clientSecret, String sourceLang, String targetLang, String text) throws Exception {
        String apiURL = "https://openapi.naver.com/v1/papago/n2mt";
        String params = "source=" + sourceLang + "&target=" + targetLang + "&text=" + URLEncoder.encode(text, "UTF-8");
        URL url = new URL(apiURL);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("X-Naver-Client-Id", clientId);
        con.setRequestProperty("X-Naver-Client-Secret", clientSecret);
        con.setDoOutput(true);

        OutputStream outputStream = con.getOutputStream();
        outputStream.write(params.getBytes("UTF-8"));
        outputStream.flush();
        outputStream.close();

        int responseCode = con.getResponseCode();
        BufferedReader bufferedReader;
        if (responseCode == 200) {
            bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        } else {
            bufferedReader = new BufferedReader(new InputStreamReader(con.getErrorStream()));
        }

        StringBuilder response = new StringBuilder();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            response.append(line);
        }

        bufferedReader.close();
        con.disconnect();

        return parseJSON(response.toString());
    }

 

확인해보면 translate는 papago open ai에 직접적으로 접근하는 소스이다.

직접 접근해서 매개변수로 받은 id, secret, 목적지 언어, 타겟 언어, 번역할 말 이렇게 전달하고, 답변을 받으면 그걸 parseJson 메서드를 통해서 다시 파싱하게 된다.

 

parseJson 메서드는 다음과 같다.

 

    public static String parseJSON(String json) {
        JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject();
        String translatedText = jsonObject.getAsJsonObject("message")
                .getAsJsonObject("result")
                .get("translatedText").getAsString();

        return translatedText;
    }

뭐 이젠 내용이 어느정도 비슷하니까..

message 라는 key 값 안에 result라는 key 값 안에  tramsalatedText라는 value를 가져와서 String화 시키는것이다.

 

그렇게 나온 값을 

 

gpt api에 통신하게 된다.

 

그러면 다음과같이 조금이나마(?) 나아진 모습의 gpt api를 볼 수 있다.

 

학습이 덜 된건지.. 여튼 저번보단 나아진 gpt 화면이다.

728x90
반응형
250x250
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band