AI

OpenAI의 API를 사용해 안드로이드앱 개발하기 #콩콩데이터 #뉴스생성

톰이야요 2024. 7. 4. 08:00

OpenAI의 API를 활용해 API Key신청. 환경설정은 완료했습니다.

이제 안드로이드스튜디오에서 OpenAI API를 사용해야 하는데, 기존의 콩콩데이터는 이미 공공데이터 API와 파이어스토어의 데이터접속 등을 하기위해 인터넷 접속은 하고 있습니다. 그래서 인터넷 접속과 관련한 권한, 관련 라이브러리 설정이 되어 있으므로 그냥 진행하면 됩니다.

 

API는 POST방식, 수발신 데이터영역은 JSON으로 구성하여 주고 받으면 됩니다.

private void CallAPI(String strInputText)
    {
        //----------시간 측정
        Log.d("TIME", SystemClock.currentThreadTimeMillis() + " / CallAPI start!!!");

        try {
            URL url = new URL(m_strAPIURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Authorization", "Bearer " + m_strAPIKEY); // API 키를 여기에 입력하세요.
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setDoOutput(true);

            String requestBodyText2 = "{\"prompt\": \"" + strInputText + "\", \"max_tokens\": " + m_strMAX_TOKEN + "}";

            String requestBodyText = "{\n" +
                    "    \"model\": \"gpt-3.5-turbo-0125\",\n" +
//                    "    \"max_tokens\": " + m_strMAX_TOKEN + ",\n" +
                    "    \"messages\": [\n" +
                    "      {\n" +
                    "        \"role\": \"user\",\n" +
                    "        \"content\": \"" + strInputText + "\"\n" +
                    "      }\n" +
                    "    ]\n" +
                    "}";

            OutputStream os = conn.getOutputStream();
            byte[] input = requestBodyText.getBytes("utf-8");
            os.write(input, 0, input.length);

            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"))) {
                    StringBuilder response = new StringBuilder();
                    String responseLine;
                    while ((responseLine = br.readLine()) != null) {
                        response.append(responseLine.trim());
                    }
                    m_strResult = parseContentFromResponse(response.toString());
                }
            } else {
                m_strResult = "Error: HTTP response code " + responseCode;
            }

            conn.disconnect();

            System.out.println("[DEBUG] result: " + m_strResult.toString());
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        //----------시간 측정
        Log.d("TIME", SystemClock.currentThreadTimeMillis() + " / CallAPI end@@@@@");
    }

 

키는 노출되면 안되니 안전하게 보관해야 하겠지요.

 

요청시 프롬프트는 기존의 데이터와 추가적인 정보와 함께, 뉴스로 만들어달라는 문구를 합쳐서 보냅니다. 그렇게 하면 적절한 결과물이 나오는 걸 확인할 수 있습니다.

(좌)주어진 데이터 , (우)생성한 뉴스기사

 

튜닝도 필요하고 추가적인 개발도 필요하지만, AI활용하는게 어렵지 않다는걸 알게 되었습니다. 

 

 

다음은 전력거래소의 뉴스생성 결과입니다.

 

 

 

개발 중, 아래와 같은 에러는 CHATGPT와 구글링, API DOC을 통해 해결했습니다. 제일 정확한건 DOC이지요.

https://platform.openai.com/docs/api-reference/chat

 

HTTP 429 ERROR - API신청은 했지만, 결제정보 입력을 안해서 그걸로 해결함

HTTP 400 ERROR - 요청 BODY에 개행문자(\n)가 있을 때 에러 발생해서, 공백으로 대체함

strBaseData.replace("\n", " ");

HTTP 404 ERROR - 요청 BODY에 max_token을 설정하니 발생, 우선은 주석처리하여 해결함. 아마도 나의 실수!