2023年3月1日 星期三

如何利用retrofit從Android連結到OpenAI-恆逸講師分享



最近打開科技新聞大概都是ChatGPT又有什麼驚人智慧之舉,或者是智商能夠值年薪多少元的工程師,在在都說明了AI工具的開發一日千里,不管是在客戶端或者是服務器端都可以思考如何善用這些AI的api來促進應用程式更強大的功能,因此在本文中我們將說明如何用Android Studio連結到OpenAI的api。


首先OpenAI API的框架是使用restful,所以我們可以使用retrofit這套函式庫, 它的速度快,並且介面清晰,可以產生出型態安全的HTTP客戶端。為了要能夠使用它,首先可以在build.gradle中加上需要的library,除了retrofit之外,還需要加上gson處理時相關的函式庫,另外為了偵錯方便,可以加上okhttp3的logging函式庫如下

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.google.code.gson:gson:2.8.9'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'      

再來由於需要使用到網路,記得在AndroidManifest.xml中加上網路的權限。

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

完成準備工作之後,可以去https://platform.openai.com/account/api-keys上申請secret key來存取使用。

Retrofit的使用中最重要的部份是生成一個http的客戶端,此處可以使用OkHttpClient,並且增加授權的檔頭,以方便OpenAPI進行認證,可以參考如下kotlin程式碼:

    val client = OkHttpClient.Builder()
    .addInterceptor(interceptor) // 此處是HttpLoggingInterceptor
    .addInterceptor { chain ->
        val original = chain.request()
        val request = original.newBuilder()
            .addHeader("Authorization", "Bearer $TOKEN")
            .method(original.method(), original.body())
            .build()
        chain.proceed(request)
    }
    .build()    

此處由於我們使用的API是Complete,也就是問OpenAPI一個問題它會接話完成,所以可以定義如下的介面,我們只需要提供Request與Response相關的物件,接著Http之後取得並且轉換就可以完全交給gson跟retrofit來處理:

    interface ApiService {
        @POST("/v1/completions")
        fun complete(@Body req:CompleteRequest): Call
    }    

由於呼叫Complete時必須要提供模型名稱,要輸入的字串,溫度(也就是亂度)和使用模型的最大token長度,所以CompleteRequest可以如下所示:

    data class CompleteRequest(
    @SerializedName("model") val model: String?,
    @SerializedName("prompt") val prompt: String?,
    @SerializedName("temperature") val temperature: Int,
    @SerializedName("max_tokens") val maxTokens: Int,
    )

而最後在主程式呼叫時,依照OpenAPI的呼叫可以提供模型名如text-davinci-003,或者其它想用的模型,字串可以由UI輸入,溫度設定為0,也就是模型會使用最大機率的結果,並且使用最多的token數量是50,可以參考如下的程式。

    val call = apiService?.complete(
        CompleteRequest(
            "text-davinci-003", editText.text.toString(),
            0, 50
        )
    )    

之後再呼叫enqueue並且取得結果即可,此處可以發現在retrofit呼叫時,不用自己再額外處理執行緒之間的問題,如果沒有特別指定時回應的執行緒是主執行緒,可以直接做UI的更換。

實作完之後就可以開始詢問了,例如可以使用英文詢問如何做位好的工程師:

此時可以看到OpenAI頗為中肯的回答如下:

另外OpenAI的使用量也可以在 https://platform.openai.com/account/usage 中取得,因此在開發時也可以時時關注是不是超過自己的限額喔。

在本文中我們說明了如何在Android透過retrofit連結到OpenAI API的大致流程,但因為此API截至目前依然還是需要收費的,如果需要對使用量做權限控管,則建議從後台發出API呼叫,再讓Android依照本文所述方式連結到自己的後台以便進行認證、授權與後續權限配額的控制喔。

相關學習資源


0 意見:

張貼留言