如何在Android中使用OpenAI API构建一个ChatGPT类的应用程序

Posted TD程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android中使用OpenAI API构建一个ChatGPT类的应用程序相关的知识,希望对你有一定的参考价值。

ChatGPT是当今著名的人工智能工具之一,类似于聊天机器人。这个聊天机器人回答所有发送给它的查询。在本文中,我们将通过集成OpenAI API(ChatGPT)来构建一个简单的类似ChatGPT的android应用程序,我们可以在其中提出任何问题并得到适当的答案

我已经创建了一个示例应用程序,并将看看它的输出,然后我们将进一步在android studio中创建一个新项目。

一步一步的实现

步骤1:在Android Studio中创建一个新项目

要在Android Studio中创建一个新项目,请参考How to Create/Start a New Project in Android Studio。注意,选择Kotlin作为编程语言。

步骤2:添加以下依赖项build.gradle 文件

下面是Volley的依赖关系,我们将使用它从API获取数据。要添加此依赖项,app > Gradle Scripts > build.gradle(app),并在依赖项部分添加以下依赖项。我们已经使用了Picasso依赖项来从URL加载图像

// below line is used for volley library

implementation ‘com.android.volley:volley:1.2.0’

添加这个依赖后,同步你的项目,现在转移到AndroidManifest.xml部分。

步骤3:在AndroidManifest.xml文件中添加网络访问权限

app > AndroidManifest.xml,并将以下代码添加到其中

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

步骤4:使用activity_main.xml文件

app > res > layout > activity_main.xml并将以下代码添加到该文件中。下面是activity_main.xml文件的代码。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/back_color"
    tools:context=".MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/idTILQuery"
        android:layout_alignParentTop="true"
        android:layout_margin="5dp"
        android:padding="5dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <!-- text view for displaying question-->
            <TextView
                android:id="@+id/idTVQuestion"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="30dp"
                android:padding="4dp"
                android:text="Question"
                android:textColor="@color/white"
                android:textSize="17sp" />

            <!-- text view for displaying response-->
            <TextView
                android:id="@+id/idTVResponse"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="5dp"
                android:padding="4dp"
                android:text="Response"
                android:textColor="@color/white"
                android:textSize="15sp" />
        </LinearLayout>

    </ScrollView>
    <!-- text field for asking question-->
    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/idTILQuery"
        style="@style/TextInputLayoutStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_margin="5dp"
        android:hint="Enter your query"
        android:padding="5dp"
        android:textColorHint="@color/white"
        app:hintTextColor="@color/white">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/idEdtQuery"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/edt_back_color"
            android:drawableEnd="@drawable/ic_send"
            android:drawableTint="@color/white"
            android:ems="10"
            android:imeOptions="actionSend"
            android:importantForAutofill="no"
            android:inputType="textEmailAddress"
            android:textColor="@color/white"
            android:textColorHint="@color/white"
            android:textSize="14sp" />
    </com.google.android.material.textfield.TextInputLayout>
</RelativeLayout>

步骤5:生成使用API的记名令牌。

导航到下面的 URL ,只需注册您的电子邮件和密码。在此屏幕上单击Create a new secret key以生成新密钥。一旦你的密钥生成,我们必须使用它作为一个令牌,使我们的API密钥。

步骤6:使用MainActivity。kt文件。

导航到app > java > your app’s package name > MainActivity.kt 文件,并添加下面的代码。代码中添加了注释以详细了解它。

import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import android.widget.TextView.OnEditorActionListener
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.RetryPolicy
import com.android.volley.VolleyError
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.google.android.material.textfield.TextInputEditText
import org.json.JSONObject

class MainActivity : AppCompatActivity() 

    // creating variables on below line.
    lateinit var responseTV: TextView
    lateinit var questionTV: TextView
    lateinit var queryEdt: TextInputEditText

    var url = "https://api.openai.com/v1/completions"

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // initializing variables on below line.
        responseTV = findViewById(R.id.idTVResponse)
        questionTV = findViewById(R.id.idTVQuestion)
        queryEdt = findViewById(R.id.idEdtQuery)

        // adding editor action listener for edit text on below line.
        queryEdt.setOnEditorActionListener(OnEditorActionListener  v, actionId, event ->
            if (actionId == EditorInfo.IME_ACTION_SEND) 
                // setting response tv on below line.
                responseTV.text = "Please wait.."
                // validating text
                if (queryEdt.text.toString().length > 0) 
                    // calling get response to get the response.
                    getResponse(queryEdt.text.toString())
                 else 
                    Toast.makeText(this, "Please enter your query..", Toast.LENGTH_SHORT).show()
                
                return@OnEditorActionListener true
            
            false
        )
    

    private fun getResponse(query: String) 
        // setting text on for question on below line.
        questionTV.text = query
        queryEdt.setText("")
        // creating a queue for request queue.
        val queue: RequestQueue = Volley.newRequestQueue(applicationContext)
        // creating a json object on below line.
        val jsonObject: JSONObject? = JSONObject()
        // adding params to json object.
        jsonObject?.put("model", "text-davinci-003")
        jsonObject?.put("prompt", query)
        jsonObject?.put("temperature", 0)
        jsonObject?.put("max_tokens", 100)
        jsonObject?.put("top_p", 1)
        jsonObject?.put("frequency_penalty", 0.0)
        jsonObject?.put("presence_penalty", 0.0)

        // on below line making json object request.
        val postRequest: JsonObjectRequest =
            // on below line making json object request.
            object : JsonObjectRequest(Method.POST, url, jsonObject,
                Response.Listener  response ->
                    // on below line getting response message and setting it to text view.
                    val responseMsg: String =
                        response.getJSONArray("choices").getJSONObject(0).getString("text")
                    responseTV.text = responseMsg
                ,
                // adding on error listener
                Response.ErrorListener  error ->
                    Log.e("TAGAPI", "Error is : " + error.message + "\\n" + error)
                ) 
                override fun getHeaders(): kotlin.collections.MutableMap<kotlin.String, kotlin.String> 
                    val params: MutableMap<String, String> = HashMap()
                    // adding headers on below line.
                    params["Content-Type"] = "application/json"
                    params["Authorization"] =
                        "Bearer Enter your token here"
                    return params;
                
            

        // on below line adding retry policy for our request.
        postRequest.setRetryPolicy(object : RetryPolicy 
            override fun getCurrentTimeout(): Int 
                return 50000
            

            override fun getCurrentRetryCount(): Int 
                return 50000
            

            @Throws(VolleyError::class)
            override fun retry(error: VolleyError) 
            
        )
        // on below line adding our request to queue.
        queue.add(postRequest)
    

输出参考

https://media.geeksforgeeks.org/wp-content/uploads/20230118003207/Screenrecorder-2023-01-18-00-28-57-186.mp4?_=1

参考文章:https://www.geeksforgeeks.org/how-to-build-a-chatgpt-like-app-in-android-using-openai-api/

如何在 OpenAI 的 Answer api 中使用文件

【中文标题】如何在 OpenAI 的 Answer api 中使用文件【英文标题】:How to use files in the Answer api of OpenAI 【发布时间】:2022-01-01 05:54:00 【问题描述】:

随着 OpenAI 最终公开 GPT-3 相关 API, 我正在玩它来探索和发现他的潜力。

我正在尝试 Answer API,文档中的简单示例: https://beta.openai.com/docs/guides/answers

我按照说明上传了.jsonl文件,我可以看到它使用openai.File.list() api成功上传。

不幸的是,当我尝试使用它时,我总是遇到同样的错误:

>>> openai.File.create(purpose='answers', file=open('example.jsonl') )
<File file id=file-xxx at 0x7fbc9eca5e00> JSON: 
  "bytes": 140,
  "created_at": 1637597242,
  "filename": "example.jsonl",
  "id": "file-xxx",
  "object": "file",
  "purpose": "answers",
  "status": "uploaded",
  "status_details": null


#Use the file in the API:
openai.Answer.create(
    search_model="ada", 
    model="curie", 
    question="which puppy is happy?", 
    file="file-xxx", 
    examples_context="In 2017, U.S. life expectancy was 78.6 years.", 
    examples=[["What is human life expectancy in the United States?", "78 years."]], 
    max_rerank=10,
    max_tokens=5,
    stop=["\n", "<|endoftext|>"]
)
<some exception, then>
openai.error.InvalidRequestError: File is still processing.  Check back later.

我已经等了好几个小时了,我不认为这个内容值得这么长时间的等待...... 你知道这是正常行为,还是我错过了什么?

谢谢

【问题讨论】:

【参考方案1】:

几小时后(次日),文件元数据状态从 uploaded 更改为 processed,并且该文件可用于文档中所述的 Answer API。

我认为这需要在原始 OpenAI API 参考中得到更好的记录。

【讨论】:

以上是关于如何在Android中使用OpenAI API构建一个ChatGPT类的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

openai的的API如何使用

OpenAI 成近期顶流团队?如何使用 OpenAI 和 Node.js 构建 AI 图像生成器?

如何使用Spring+OpenAI生成图像

如何使用ChatGPT API 及 问题解决

如何申请 Azure OpenAI

如何使用Ionic 3为Android API 21构建apk?它继续为API 23构建,即使我在config.xml中将目标sdk更改为21