mystic-agit 개발 블로그

ChatGPT Android 프로젝트 적용하기 본문

Platform/ChatGPT

ChatGPT Android 프로젝트 적용하기

mystic-agit 2023. 3. 16. 21:03

ChatGPT API를 사용하여 Android 프로젝트에서 사용하도록 적용해보았다.

( ChatGPT 페이지에서 회원가입을 진행하는 방법은 링크 페이지에서 확인 )

 

 

# GitHub 프로젝트

- Git 링크 : https://github.com/mystic707/ChatGPTSample 

- 빌드 테스트 시기 : 2023. 04

- Android OS 12 test

- 샘플앱 버전 : 1.1

  - Git 링크 샘플앱 질문 입력 가능하도록 UI 구성 업데이트 (버전 1.2)

 

[ 설정에 필요한 정보 확인하기 ]

(1) API 키 생성
ChatGPT 페이지에서 회원가입을 하였다면

https://platform.openai.com/account/api-keys 페이지에서 Create new secret key 수행 시
API key를 발급받을 수 있고, 다시 확인 불가능하기 때문에 해당 값을 기억해달라는 내용의 팝업 안내가 나온다.

 

해당키는 API 통신 시 사용되므로 프로젝트 내 메모할 수 있는 곳에 기록이 필요하다.

 

 

[ API 스펙 확인하기 ]

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

API 소개 페이지에서 Request의 몇 가지 키의 스펙을 확인해보자.

 

Key Description
model
(required)
- 요청한 text에 답을 찾는 프로세스 모델
- 업데이트 시 모델이 추가되는 것으로 보이고 API 페이지에서 모델 목록과 개요를 확인할 수 있음
prompt
(optional)
- 요청할 text
- 영문 혹은 한글로 표현할 수 있음
max_token
(optional)
- 답 문장에 대한 최대 토큰 수
- 토큰은 문장의 구성에 따라 모델이 정의하는 로직에 따라 정해짐
(예 : The airplane is machine > The / air/plane / is / machine (5 tokens)

- 대부분의 모델의 최대 토큰 수는 2048 (4096을 제공하는 일부 모델도 있음)
- default value : 16
temperature
(optional)
- 답 문장에 대한 집중도 범위(?)
- 0에 가까울 수록 보다 결정적인 답을 반환(빈도가 더 높은 정보를 주는 것으로 추정)
- 2에 가까울 수록 보다 무작위적인 답을 반환
- default value : 1, range : 0~2
top_p
(optional)
- 답변된 token에 대해서 어느 빈도의 상위 token을 고려할지 판단 기준 값(?)
- 0.1 이라면 상위 10% 빈도 상위를 고려, 1이라면 모두를 고려
- default value : 1
logprobs
(optional)
- 가장 가능성이 높은 token을 반환 (응답에서 주요 키워드를 추출하는데 도움이 될듯(?))
- default value : 1, max value : 5

다른 키의 설명도 있지만 주요 사용될 것으로 보이는 키를 몇가지 확인해보았다.

 

API Response의 스펙도 확인해보자.

Key Key(inner path)  Description
choices text - 질문의 응답 text


[ Android Studio 프로젝트에 API 적용하기 ]

(1) Android Studio 프로젝트 생성

 

(2) build.gradle 내 okhttps 라이브러리 참조 추가

(https://square.github.io/okhttp/ 페이지 참고)

implementation("com.squareup.okhttp3:okhttp:4.10.0")

 

(3) AndroidManifest에 INTERNET permission 추가

<uses-permission android:name="android.permission.INTERNET" />

 

(4)  requestChatGPT() 메서드 작성

(ChatGPT : https://platform.openai.com/docs/api-reference/completions/create 참고)

(OkHttp : https://square.github.io/okhttp/ 참고)

내용이 간단하여 메인 액티비티 코드 자체를 모두 첨부해보았다.

package com.example.mysticagitchatgpt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import java.io.IOException

class MainActivity : AppCompatActivity() {

   val HttpContentType_JSON: MediaType = "application/json; charset=utf-8".toMediaType()
   var okHttpClient = OkHttpClient()

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)

       // 메서드 호출
       requestChatGPT("what is apple?")
   }

   fun requestChatGPT(question: String) {

       Log.d("mysticagit", "question : $question")

       // request body에 들어갈 Json
       var jsonBody: JSONObject = JSONObject()

       // API 레퍼런스 참고 ( https://platform.openai.com/docs/api-reference/completions/create )
       jsonBody.put("model", "text-davinci-003")
       jsonBody.put("prompt", question)
       jsonBody.put("max_tokens", 30)
       jsonBody.put("temperature", 0)

       // request에 필요한 요청 url(url), API Key(header) 설정
       // (API Key 확인하기 : https://platform.openai.com/account/api-keys )
       var requestBody: RequestBody = (jsonBody.toString()).toRequestBody(HttpContentType_JSON)
       var request: Request = Request.Builder()
           .url("https://api.openai.com/v1/completions")
           .header("Authorization", "Bearer sk-AbcDeAbcdeABCDE1234567890J1234567890")  // API Key 발급받은 것을 사용하세요!
           .post(requestBody)
           .build()

       // 요청
       okHttpClient.newCall(request).enqueue( object : Callback {
           // 응답 성공 시
           override fun onResponse(call: Call, response: Response) {
               Log.d("mysticagit", "onResponse")
               if(response.isSuccessful) {
                   var jsonResponse = JSONObject(response.body?.string())

                   // response body에서 choices 내 답변된 text 데이터 확인
                   var jsonResponseArray = jsonResponse.getJSONArray("choices")
                   var result: String? = jsonResponseArray.getJSONObject(0).getString("text")

                   // 결과 출력
                   result?.let {
                       Log.d("mysticagit", "answer : $it")
                   } ?: {
                       Log.d("mysticagit", "answer is empty")
                   }
               }
           }

           // 응답 실패 시
           override fun onFailure(call: Call, e: IOException) {
               Log.d("mysticagit", "onFailure")
           }
       })
   }
}

 

(5) 호출 결과

간단하게 로그로 결과를 확인해보았다. UI를 구성해서 질문을 텍스트로 받고, 응답을 노출시킨다면 대화형으로 구성 가능할 것으로 보인다.

 

(4) 응답 확인 후에

https://platform.openai.com/account/usage 사용량을 확인할 수 있다.

Token 처리량에 따라 사용량이 발생하고 현재 무료로 사용 가능한 최대량은 5 달러로 보인다.

만약 추가 요금을 지불하고 사용하려는 경우 Billing 페이지에서 지불이 가능해 보인다

 

[ 레퍼런스 ]

 

'Platform > ChatGPT' 카테고리의 다른 글

ChatGPT 웹 페이지 서비스 사용방법  (0) 2023.03.16
Comments