当前位置:   article > 正文

百度文心一言(ERNIE bot)API接入Android应用_ernie bot api

ernie bot api

百度文心一言(ERNIE bot)API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com)

 需要完整代码的话:https://gitee.com/liyizhe2002/we-are-speakers

Preface:

现在生成式AI越来越强大了,想在android上实现一个对话助手的功能,大概摸索了一下接入百度文心一言API的方法。

与AI助手交换信息的方式可以这么理解:

我向文心一言发送一个message:你好啊:

  1. [
  2. {
  3. "role": "user",
  4. "content": "你好啊"
  5. }
  6. ]

文心一言回答我:你好,很高兴与你交流。请问你有什么具体的问题或需要帮助吗?我会尽力回答你的问题或与你对话:

  1. {
  2. "id":"as-n24a5sytuz",
  3. "object":"chat.completion",
  4. "created":1711203238,
  5. "result":"你好,请问有什么我可以帮助你的吗?如果你有任何问题或需要帮助,请随时告诉我,我会尽力回答和提供帮助。",
  6. "is_truncated":false,
  7. "need_clear_history":false,
  8. "finish_reason":"normal",
  9. "usage":{
  10. "prompt_tokens":1,
  11. "completion_tokens":28,
  12. "total_tokens":29
  13. }
  14. }

接着我继续发送message:今天是几号呢?......

  1. [
  2. {
  3. "role": "user",
  4. "content": "你好啊"
  5. },
  6. {
  7. "role": "assistant",
  8. "content": "你好,很高兴与你交流。请问你有什么具体的问题或需要帮助吗?我会尽力回答你的问题或与你对话。"
  9. },
  10. {
  11. "role": "user",
  12. "content": "今天是几号呢"
  13. }
  14. ]

每一次发送message,都要带上之前的对话,这样才能实现连续对话的功能。

 具体实现

Android应用AndroidManifest.xml文件中添加网络访问权限:

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

在build.gradle中添加必要的依赖:

implementation 'com.squareup.okhttp3:okhttp:4.9.3'

 接下来注册开发者账户、往里边充钱啥的,完成这些之后,在百度智能云控制台 (baidu.com)创建一个新应用,

如上图所示,我们主要需要API Key和Secret Key这俩东西

创建一个新的类以处理文心一言的API信息:WenXin.java,在Activity里需要实现文心一言的对话功能只需调用这个类就好了。

  1. package com.example.wearespeakers;
  2. import android.view.View;
  3. import com.google.gson.Gson;
  4. import okhttp3.*;
  5. import org.json.JSONArray;
  6. import org.json.JSONException;
  7. import org.json.JSONObject;
  8. import java.io.*;
  9. /**主要用于实现对接文心一言API的功能
  10. */
  11. public class WenXin{
  12. public static final String API_KEY = "oQtUE*********rwePzF";
  13. public static final String SECRET_KEY = "LxfNEC************L4W2UW0eX";
  14. View view;
  15. public JSONArray Dialogue_Content;//用来储存对话内容,当然初始是空的
  16. Gson gson = new Gson();
  17. WenXin(){
  18. Dialogue_Content=new JSONArray();
  19. //初始化
  20. }
  21. static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
  22. public String GetAnswer(String user_msg) throws IOException, JSONException {
  23. JSONObject jsonObject = new JSONObject();
  24. jsonObject.put("role", "user");
  25. jsonObject.put("content", user_msg);
  26. // 将JSONObject添加到JSONArray中
  27. Dialogue_Content.put(jsonObject);
  28. MediaType mediaType = MediaType.parse("application/json");
  29. //这是一行参考代码,只能进行一次对话,要想多次对话就必须动态调整content的内容
  30. //RequestBody body = RequestBody.create(mediaType, "{\"messages\":[{\"role\":\"user\",\"content\":\"你好啊\"}],\"disable_search\":false,\"enable_citation\":false}");
  31. RequestBody body = RequestBody.create(mediaType, "{\"messages\":" +
  32. Dialogue_Content.toString() +
  33. ",\"system\":\"你的名字是ERNIE,你是一位英语对话练习助手,你只能以英语进行回答\",\"disable_search\":false,\"enable_citation\":false}");
  34. //预先设定AI的角色功能啥的
  35. Request request = new Request.Builder()
  36. .url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" +
  37. getAccessToken())
  38. .method("POST", body)
  39. .addHeader("Content-Type", "application/json")
  40. .build();
  41. Response response = HTTP_CLIENT.newCall(request).execute();
  42. //解析出文心一言的回答
  43. JSONObject json_feedback = new JSONObject(response.body().string());
  44. String re=json_feedback.getString("result");
  45. //把文心一言的回答加入到Dialogue_Content中
  46. JSONObject jsontmp=new JSONObject();
  47. jsontmp.put("assistant",re);
  48. Dialogue_Content.put(jsontmp);
  49. return re;
  50. }
  51. /**
  52. * 从用户的AK,SK生成鉴权签名(Access Token)
  53. *
  54. * @return 鉴权签名(Access Token)
  55. * @throws IOException IO异常
  56. */
  57. public String getAccessToken() throws IOException, JSONException {
  58. MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
  59. RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
  60. + "&client_secret=" + SECRET_KEY);
  61. Request request = new Request.Builder()
  62. .url("https://aip.baidubce.com/oauth/2.0/token")
  63. .method("POST", body)
  64. .addHeader("Content-Type", "application/x-www-form-urlencoded")
  65. .build();
  66. Response response = HTTP_CLIENT.newCall(request).execute();
  67. return new JSONObject(response.body().string()).getString("access_token");
  68. }
  69. }

在Activity中是这样写的(Activity里的RecyclerView对话界面参考Android RecyclerView的使用(以实现一个简单的动态聊天界面为例),下边大多数都是无关的代码,主要就那几行):

  1. package com.example.wearespeakers;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Handler;
  5. import android.os.Looper;
  6. import android.os.Message;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import androidx.appcompat.app.AppCompatActivity;
  11. import android.os.Bundle;
  12. import androidx.recyclerview.widget.LinearLayoutManager;
  13. import androidx.recyclerview.widget.RecyclerView;
  14. import org.json.JSONException;
  15. import java.io.IOException;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. import static java.security.AccessController.getContext;
  19. //此activity主要用来实现聊天界面
  20. public class ChatActivity extends Activity {
  21. private EditText et_chat;
  22. private Button btn_send,btn_chat_return;
  23. private ChatlistAdapter chatAdapter;
  24. private List<Chatlist> mDatas;
  25. private RecyclerView rc_chatlist;
  26. final int MESSAGE_UPDATE_VIEW = 1;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_chat);
  31. init();
  32. //聊天信息
  33. mDatas = new ArrayList<Chatlist>();
  34. Chatlist C1;
  35. C1=new Chatlist("ABC:","Hello,world!");
  36. mDatas.add(C1);
  37. Chatlist C2;
  38. C2=new Chatlist("DEF:","This is a new app.");
  39. mDatas.add(C2);
  40. //可以通过数据库插入数据
  41. chatAdapter=new ChatlistAdapter(this,mDatas);
  42. LinearLayoutManager layoutManager = new LinearLayoutManager(this );
  43. rc_chatlist.setLayoutManager(layoutManager);
  44. //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
  45. rc_chatlist.setHasFixedSize(true);
  46. //创建并设置Adapter
  47. rc_chatlist.setAdapter(chatAdapter);
  48. //点击btn_send发送聊天信息
  49. btn_send.setOnClickListener(new View.OnClickListener() {
  50. @Override
  51. public void onClick(View v) {
  52. //用户的提问
  53. String user_ask=et_chat.getText().toString();//获取输入框里的信息
  54. Chatlist C3;
  55. C3=new Chatlist("User:",user_ask);
  56. mDatas.add(C3);
  57. chatAdapter.ResetChatlistAdapter(mDatas);
  58. rc_chatlist.setAdapter(chatAdapter);
  59. //文心一言的回答(以下才是用到WenXin.java的地方)
  60. new Thread(new Runnable(){
  61. @Override
  62. public void run() {
  63. //请求详情
  64. Chatlist C4;
  65. try {
  66. WenXin wx=new WenXin();
  67. C4=new Chatlist("WenXin:",wx.GetAnswer(user_ask));
  68. } catch (IOException | JSONException e) {
  69. throw new RuntimeException(e);
  70. } finally {
  71. }
  72. mDatas.add(C4);
  73. chatAdapter.ResetChatlistAdapter(mDatas);
  74. Message msg = new Message();
  75. msg.what = MESSAGE_UPDATE_VIEW;
  76. ChatActivity.this.gHandler.sendMessage(msg);
  77. }
  78. }).start();
  79. /*为什么要弄new Thread...这样呢?
  80. 因为像这种网络请求往往有延迟,需要新开一个进程去处理,与下面的gHandler相对应
  81. 当app收到来自文心一言的回答后,就去通知gHandler更新界面,把回答的段落显示出来
  82. */
  83. }
  84. });
  85. //点击返回,返回mainActivity
  86. btn_chat_return.setOnClickListener(new View.OnClickListener() {
  87. @Override
  88. public void onClick(View v) {
  89. Intent intent=new Intent(ChatActivity.this,MainActivity.class);
  90. startActivity(intent);
  91. ChatActivity.this.finish();
  92. }
  93. });
  94. }
  95. private void init(){//执行一些初始化操作
  96. btn_send=findViewById(R.id.btn_send);
  97. et_chat=findViewById(R.id.et_chat);
  98. btn_chat_return=findViewById(R.id.btn_chat_return);
  99. rc_chatlist=(RecyclerView) findViewById(R.id.rc_chatlist);
  100. }
  101. public Handler gHandler = new Handler(Looper.getMainLooper()) {
  102. @Override
  103. public void handleMessage(Message msg) {
  104. if (msg.what == MESSAGE_UPDATE_VIEW) {
  105. rc_chatlist.setAdapter(chatAdapter);//更新对话界面
  106. }
  107. }
  108. };
  109. }

其实只需要关注new Thread和gHandler部分的代码即可。

效果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/638087
推荐阅读
相关标签
  

闽ICP备14008679号