利用retrofit從Android連結到OpenAI
何孟翰 Mark Ho
- 恆逸教育訓練中心-資深講師
- 技術分類:Mobile行動應用開發
最近打開科技新聞大概都是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依照本文所述方式連結到自己的後台以便進行認證、授權與後續權限配額的控制喔。