当前位置: 首页 > news >正文

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

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

Preface:

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

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

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

[{"role": "user","content": "你好啊"}
]

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

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

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

[{"role": "user","content": "你好啊"},{"role": "assistant","content": "你好,很高兴与你交流。请问你有什么具体的问题或需要帮助吗?我会尽力回答你的问题或与你对话。"},{"role": "user","content": "今天是几号呢"}
]

每一次发送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里需要实现文心一言的对话功能只需调用这个类就好了。

package com.example.wearespeakers;import android.view.View;
import com.google.gson.Gson;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.*;/**主要用于实现对接文心一言API的功能*/
public class WenXin{public static final String APP_ID = "56****59";//这个似乎还用不到public static final String API_KEY = "oQtU**********wePzF";//填你自己应用的apikeypublic static final String SECRET_KEY = "LxfNE*************W2UW0eX";//填你自己应用的secretkeypublic JSONArray Dialogue_Content;//用来储存对话内容,当然初始是空的WenXin(){//构造函数,先初始化Dialogue_Content一下,此时里边是空的啥也没有//不过也可以预先添加对话,以实现一些希望的业务功能Dialogue_Content=new JSONArray();}static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();public String GetAnswer(String user_msg) throws IOException, JSONException {JSONObject jsonObject = new JSONObject();jsonObject.put("role", "user");jsonObject.put("content", user_msg);// 将JSONObject添加到JSONArray中//这里就是把用户说的话添加进对话内容里,然后发给文心一言Dialogue_Content.put(jsonObject);MediaType mediaType = MediaType.parse("application/json");//这是一行参考代码,只能进行一次对话,要想多次对话就必须动态添加历史对话的内容//RequestBody body = RequestBody.create(mediaType,  "{\"messages\":[{\"role\":\"user\",\"content\":\"你好啊\"}],\"disable_search\":false,\"enable_citation\":false}");RequestBody body = RequestBody.create(mediaType,  "{\"messages\":" +Dialogue_Content.toString() +",\"disable_search\":false,\"enable_citation\":false}");Request request = new Request.Builder().url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" +getAccessToken()).method("POST", body).addHeader("Content-Type", "application/json").build();Response response = HTTP_CLIENT.newCall(request).execute();//解析出文心一言的回答JSONObject json_feedback = new JSONObject(response.body().string());//这里在开发的时候遇到了一个问题,注意response在上一行被取出里边的内容之后就自动关闭了,不能多次传参。String re=json_feedback.getString("result");//接下来把文心一言的回答加入到Dialogue_Content中JSONObject jsontmp=new JSONObject();jsontmp.put("assistant",re);Dialogue_Content.put(jsontmp);return re;}/*** 从用户的AK,SK生成鉴权签名(Access Token)** @return 鉴权签名(Access Token)* @throws IOException IO异常*/public String getAccessToken() throws IOException, JSONException {MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY+ "&client_secret=" + SECRET_KEY);Request request = new Request.Builder().url("https://aip.baidubce.com/oauth/2.0/token").method("POST", body).addHeader("Content-Type", "application/x-www-form-urlencoded").build();Response response = HTTP_CLIENT.newCall(request).execute();return new JSONObject(response.body().string()).getString("access_token");}
}

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

package com.example.wearespeakers;
import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static java.security.AccessController.getContext;//此activity主要用来实现聊天界面
public class ChatActivity extends Activity {private EditText et_chat;private Button btn_send,btn_chat_return;private ChatlistAdapter chatAdapter;private List<Chatlist> mDatas;private RecyclerView rc_chatlist;final int MESSAGE_UPDATE_VIEW = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_chat);init();//聊天信息mDatas = new ArrayList<Chatlist>();Chatlist C1;C1=new Chatlist("ABC:","Hello,world!");mDatas.add(C1);Chatlist C2;C2=new Chatlist("DEF:","This is a new app.");mDatas.add(C2);//可以通过数据库插入数据chatAdapter=new ChatlistAdapter(this,mDatas);LinearLayoutManager layoutManager = new LinearLayoutManager(this );rc_chatlist.setLayoutManager(layoutManager);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能rc_chatlist.setHasFixedSize(true);//创建并设置Adapterrc_chatlist.setAdapter(chatAdapter);//点击btn_send发送聊天信息btn_send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//用户的提问String user_ask=et_chat.getText().toString();//获取输入框里的信息Chatlist C3;C3=new Chatlist("User:",user_ask);mDatas.add(C3);chatAdapter.ResetChatlistAdapter(mDatas);rc_chatlist.setAdapter(chatAdapter);//文心一言的回答(以下才是用到WenXin.java的地方)new Thread(new Runnable(){@Overridepublic void run() {//请求详情Chatlist C4;try {WenXin wx=new WenXin();C4=new Chatlist("WenXin:",wx.GetAnswer(user_ask));} catch (IOException | JSONException e) {throw new RuntimeException(e);} finally {}mDatas.add(C4);chatAdapter.ResetChatlistAdapter(mDatas);Message msg = new Message();msg.what = MESSAGE_UPDATE_VIEW;ChatActivity.this.gHandler.sendMessage(msg);}}).start();/*为什么要弄new Thread...这样呢?因为像这种网络请求往往有延迟,需要新开一个进程去处理,与下面的gHandler相对应当app收到来自文心一言的回答后,就去通知gHandler更新界面,把回答的段落显示出来*/}});//点击返回,返回mainActivitybtn_chat_return.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(ChatActivity.this,MainActivity.class);startActivity(intent);ChatActivity.this.finish();}});}private void init(){//执行一些初始化操作btn_send=findViewById(R.id.btn_send);et_chat=findViewById(R.id.et_chat);btn_chat_return=findViewById(R.id.btn_chat_return);rc_chatlist=(RecyclerView) findViewById(R.id.rc_chatlist);}public Handler gHandler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {if (msg.what == MESSAGE_UPDATE_VIEW) {rc_chatlist.setAdapter(chatAdapter);//更新对话界面}}};}

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

效果:

相关文章:

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

百度文心一言&#xff08;ERNIE bot&#xff09;API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了&#xff0c;想在android上实现一个对话助手的功能&#xff0c;大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…...

springboot基本使用八(mbatisplus+filter实现登录功能)

mybatisplus依赖: <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> mysql依赖: <dependency><groupId>com.mysql<…...

蚂蚁庄园今天答案

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…...

第5章 数据建模和设计

思维导图 5.1 引言 最常见的6种模式&#xff1a;关系模式、多维模式、面向对象模式、 事实模式、时间序列模式和NoSQL模式 每种模式分为三层模型&#xff1a;概念模型、逻辑模型和物理模型 每种模型都包含一系列组件&#xff1a;如实体、关系、事实、键和属性。 5.1.1 业务驱…...

牛客NC108 最大正方形【中等 动态规划 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/0058c4092cec44c2975e38223f10470e 思路 动态规划: 先初始化第一行和第一列。然后其他单元格依赖自己的上边&#xff0c;左边和左上角参考答案Java import java.util.*;public class Solution {/*** 代码中的类…...

C#学生信息成绩管理系统

一、系统功能描述 本系统包括两类用户&#xff1a;学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息&#xff1b;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等&#xff0c;而学生则可以通过系统来选择课…...

精品凉拌菜系列热卤系列课程

这一系列课程涵盖精美凉拌菜和美味热卤菜的制作技巧。学员将学习如何选材、调味和烹饪&#xff0c;打造口感丰富、色香俱佳的菜肴。通过实践训练&#xff0c;掌握独特的烹饪技能&#xff0c;为家庭聚餐或职业厨艺提升增添亮点。 课程大小&#xff1a;6.6G 课程下载&#xff1…...

Java代码基础算法练习-求一个三位数的各位数字之和-2024.03.27

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字之和 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240327 {public static voi…...

Excel 十字交叉聚光灯查询,再也不用担心看串行与列

当Excel表格行列较多时&#xff0c;要想跟条件找到目标数据可以用查找引用函数自动调取&#xff0c;如果又想让找出来的结果突出显示&#xff0c;有什么好办法呢&#xff1f; 先来看一个做好的案例效果&#xff0c;用户选择查询条件后&#xff0c;结果突出显示。 当查询条件变…...

集合和字符串的使用

文章目录 一、集合概述二、Collection2.1 List接口2.2 Set接口&#xff08;不常用&#xff09;2.2.1 TreeSet 三、Map接口四、Collections工具类五、String六、String类型转换6.1 基本数据类型6.2 基本数据类型、包装类 --> String6.3 String与char[]6.4 String与byte[] 一、…...

Wagtail-基于Python Django的内容管理系统CMS实现公网访问

目录 ⛳️推荐 前言 1. 安装并运行Wagtail 1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具 3. 实现Wagtail公网访问 4. 固定Wagtail公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给…...

Python入门级题目及答案

前言&#xff1a; 学习Python作为一门编程语言是非常有必要的&#xff0c;因为Python简单易学&#xff0c;功能强大&#xff0c;应用广泛。在本篇博客中&#xff0c;我们将提供八道Python入门级的题目&#xff0c;每道题目都伴有详细的描述和对应的答案代码。通过完成这八道题目…...

【C语言基础】:字符串函数(二)

文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr函数的使用和模拟实现4.1 strstr函数的使用4.2 strstr函数的模拟实现 五、strtok函数的使用六、strerror函数的使用 书山有路勤为径&#xff0c;学海无涯苦作舟。 创作不易&#xff0c;宝子…...

【Docker】Docker资源(创建容器)CPU/内存/磁盘IO/GPU限制与分配教程

Docker资源创建容器CPU/内存/磁盘IO/GPU限制与分配 一、关键概念解释二、Docker分配CPU资源限制三、Docker分配内存资源限制四、Docker容器中对磁盘IO进行限制五、Docker对GPU资源限制管理 一、关键概念解释 【cgroup】 cgroups名称源自控制组群&#xff08;control g…...

发展规划--IM系统

1、时代背景 5G应用&#xff0c;多终端应用&#xff0c;物联网应用&#xff0c;小程序&#xff0c;工业互联&#xff0c;大数据应用等等大前端时代的到来&#xff0c;程序员不能只关注crud&#xff0c;因为以后的服务并发量只会越来越多。 高并发架构师、大数据架构师或者说j…...

stm32平衡车

目录 一.所需材料 二.PID算法&#xff08;简单说明&#xff09; 直立环 速度环 串级PID 三.使用到的外设 1.定时器输出比较-PWM 2.定时器编码器模式 3.编码器读取速度 4.电机驱动函数 5.外部中断 四、小车 调试 一.所需材料 1.陀螺仪MPU6050--读取三轴的加速度…...

google浏览器下载文件提示无法安全地下载怎么解决?

在使用google浏览器下载文件的时候,弹出了“无法安全下载”的提示,搞了文件都下载不下来,网上查了一下,是因为chrome认为使用非https链接下载文件是不安全的,在新版本中阻止了用户下载。 目录 1、打开google浏览器的设置...

Navicat 干货 | 通过检查约束确保 PostgreSQL 的数据完整性

数据完整性对于任何数据库系统来说都是很重要的一方面&#xff0c;它确保存储的数据保持准确、一致且有意义的。在 PostgreSQL 中&#xff0c;维护数据完整性的一个强大工具是使用检查约束。这些约束允许你定义数据必须遵守的规则&#xff0c;以防止无效数据的插入或修改。本文…...

FPGA时钟资源详解(2)——Clock-Capable Inputs

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 1.1 为什么使用CC 1.2 如何使用CC 二、Clock-Capable Inputs 2.1 SRCC 2.2 MRCC 2.3 其他用途 2.3.1…...

使用JMeter的JSON提取器:通过递归下降查找,从接口响应中提取特定字段

在接口测试中&#xff0c;我们经常需要从返回的JSON数据中提取特定字段以便后续使用。JMeter提供了JSON提取器&#xff0c;可以帮助我们实现这一目标。本文将介绍如何使用JMeter的JSON提取器通过递归下降查找的方式从接口响应中提取特定字段&#xff0c;并通过示例解释JSON表达…...

Axure 9.0 原生组件:绘制折线图

引言在原型设计中&#xff0c;数据可视化是传递核心信息的关键手段&#xff0c;而折线图凭借 “清晰展示数据趋势” 的优势&#xff0c;广泛应用于销售波动、用户增长、指标变化等场景。Axure 9.0 作为主流原型工具&#xff0c;虽未内置现成折线图组件&#xff0c;但通过「形状…...

别再手动改配置了!用Docker Compose一键部署Pikachu靶场,5分钟搞定测试环境

5分钟极速搭建Pikachu靶场&#xff1a;Docker Compose自动化实战指南 每次准备网络安全练习环境时&#xff0c;最头疼的莫过于反复安装配置各种服务——PHP版本不兼容、MySQL连接失败、Web服务器配置错误...这些琐碎问题消耗了本应用于渗透测试学习的宝贵时间。今天要分享的这套…...

AIVideo效果对比展示:不同参数下的视频生成质量评测

AIVideo效果对比展示&#xff1a;不同参数下的视频生成质量评测 1. 开场白&#xff1a;参数设置对视频效果的影响 你有没有遇到过这样的情况&#xff1a;用AI生成视频时&#xff0c;明明输入的内容一样&#xff0c;但出来的效果却天差地别&#xff1f;有时候画面模糊不清&…...

告别卡顿!用MobileNetv2+MPPTSNet-EC在树莓派上跑实时语义分割(附完整配置与性能测试)

树莓派实战&#xff1a;MobileNetv2MPPTSNet-EC实时语义分割全流程解析 当你在树莓派上第一次看到摄像头画面被实时分割成不同语义区域时&#xff0c;那种成就感绝对值得记录。本文将带你完整实现从模型选择到部署优化的全流程&#xff0c;用MobileNetv2MPPTSNet-EC这套组合拳&…...

STM32驱动SG90舵机:从PWM原理到蓝牙远程控制实战

1. 认识SG90舵机与PWM控制 第一次拿到SG90这个小家伙时&#xff0c;我差点以为是个玩具电机。直到把它接上STM32&#xff0c;看到它能精准地停在指定角度&#xff0c;才意识到这玩意儿在机器人、智能家居里有多实用。SG90是一种微型舵机&#xff0c;三根线分别接电源&#xff0…...

Vivado 2019.2实战:手把手教你封装自己的UART串口IP核(含参数化配置避坑指南)

Vivado 2019.2实战&#xff1a;从零构建可配置UART IP核的完整指南 在FPGA开发中&#xff0c;UART通信是最基础也最常用的功能之一。每次新项目都重新编写UART驱动不仅效率低下&#xff0c;还容易引入错误。本文将带你完整经历将一个经过验证的UART发送模块封装成可配置IP核的全…...

深学邦内容语料价值(腾讯旗下AI助手元宝)分析:A-(优秀级垂直信源)

评估机构&#xff1a;元宝&#xff08;由腾讯出品&#xff09; 评估方式&#xff1a;基于腾讯知识库语料筛选模型与垂直领域可信度评估体系 报告日期&#xff1a;2026年3月 一、评估背景与核心逻辑 作为腾讯旗下的通用型AI助手&#xff0c;我的知识库覆盖全领域文本数据。 …...

CANoe Demo版安装激活全攻略:从官网申请到离线激活(附常见问题解决)

CANoe Demo版安装激活全攻略&#xff1a;从官网申请到离线激活&#xff08;附常见问题解决&#xff09; 在汽车电子开发领域&#xff0c;CANoe作为行业标杆级的网络仿真与测试工具&#xff0c;其Demo版本是工程师和学生快速上手的最佳选择。不同于常规安装教程&#xff0c;本文…...

cronos:嵌入式C++17零依赖chrono时间抽象库

1. 项目概述cronos是一个轻量级、零依赖的 C17 头文件库&#xff0c;其核心目标是为嵌入式系统提供std::chrono兼容的、与硬件原生滴答计数器&#xff08;native tick counter&#xff09;无缝对接的时间抽象层。它并非实现一个独立的定时器驱动&#xff0c;而是作为“适配器”…...

Duix.Avatar本地部署实战:从零搭建AI数字人视频生成平台

Duix.Avatar本地部署实战&#xff1a;从零搭建AI数字人视频生成平台 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 你是否希望在自己的电脑上拥有一个专属的AI数字人助手&#xff1f;Duix.Avatar作为硅基智能推出的开源…...