android集成百度文心一言实现对话功能,实战项目讲解,人人都能拥有一款ai应用

大家好,今天给大家讲解下如何实现一个基于百度文心一言的app功能,app内部同时集成了讯飞的语音识别。本文适用于有android基础的小伙伴阅读,文章末尾放上本项目用到的全部实例代码,在使用前请务必看完本文章。

先来给大家看看效果。

百度文心一言API权限申请及创建应用

第一步:打开百度文心一言的api开发者平台-千帆

百度智能云千帆大模型平台ModelBuilder

第二步:创建应用

第三步:打开android studio创建一个app

这个步骤相信大家都会,不会的就说明不适合本篇文章,可以退出阅读了。

第四步:文心一言api封装实例(从项目中提取出来的)

下面代码封装了整个文心一言的对话请求,此处用的基类,为了方便如果有不同的请求需要。

AiExample.java

/**
**封装文心一言请求
**/
public abstract class AiExample {Context mContext;static List<ChatWxyyRequestBean> chatWxyyRequestBeanList = new ArrayList<>();//用于存储文心一言的对话listpublic AiExample(Context context) {this.mContext = context;}private static final String API_URL_35 = Const.OpenAi.url35;private static final String API_URL_40 = Const.OpenAi.url40;private List<String> dialogHistory = new ArrayList<>();//定义个OkHttpClient对象static OkHttpClient client = new OkHttpClient.Builder().connectTimeout(1, TimeUnit.DAYS).readTimeout(1, TimeUnit.DAYS).callTimeout(1, TimeUnit.DAYS).build();private String context = ""; // 当前的对话上下文/*** 将当前的上下文清空,开启新对话时用到** @param chatGptExample*/public void clearContext(AiExample chatGptExample) {if (chatGptExample != null) {chatGptExample.context = "";chatWxyyRequestBeanList.clear();}}//第一次请求回调public interface FirstCallback {public void callback(String msg);}/*** 请求文心一言** @param message 请求的文字* @param tag*/public void startChatWithWxyy(String message, int tag, String API_KEY, String SECRET_KEY) {//开始第一次请求try {getAccessToken(API_KEY, SECRET_KEY, new FirstCallback() {@Overridepublic void callback(String msg) {//第一次请求成功后,获取的msg为access_tokenLog.e("tag", "文心一言的access_token=" + msg);if (!StringUtils.isBlank(msg)) {//开始进行第二次请求try {Log.e("tag", "第二次请求的messsge:" + message);requestSecond(msg, message);} catch (IOException e) {throw new RuntimeException(e);}}}});} catch (IOException e) {throw new RuntimeException(e);}}/*** 从用户的AK,SK生成鉴权签名(Access Token)** @param API_KEY* @param SECRET_KEY* @return 鉴权签名(Access Token)* @throws IOException IO异常*/public void getAccessToken(String API_KEY, String SECRET_KEY, FirstCallback firstCallback) throws IOException {final String[] access_token = {""};MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");RequestBody body = RequestBody.create("grant_type=client_credentials&client_id=" + API_KEY+ "&client_secret=" + SECRET_KEY, mediaType);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();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("tag", "获取access token 失败");}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {JSONObject jsonObject = JSONObject.parseObject(response.body().string());String access_token1 = jsonObject.getString("access_token");if (!StringUtils.isBlank(access_token1)) {access_token[0] = access_token1;firstCallback.callback(access_token[0]);Log.e("tag", "获取access token==" + access_token[0]);}}});}public void requestSecond(String access_token, String message) throws IOException {Gson gson = new Gson();ChatWxyyRequestBean chatWxyyRequestBean = new ChatWxyyRequestBean();chatWxyyRequestBean.setRole("user");chatWxyyRequestBean.setContent(message);ChatWxyyBodyBean chatWxyyBodyBean = new ChatWxyyBodyBean();chatWxyyRequestBeanList.add(chatWxyyRequestBean);chatWxyyBodyBean.setMessages(chatWxyyRequestBeanList);chatWxyyBodyBean.setTemperature(0.95);chatWxyyBodyBean.setTop_p(0.8);chatWxyyBodyBean.setPenalty_score(1);chatWxyyBodyBean.setDisable_search(false);chatWxyyBodyBean.setEnable_citation(false);chatWxyyBodyBean.setResponse_format("text");chatWxyyBodyBean.setStream(true);//支持流式输出String jsonStr = gson.toJson(chatWxyyBodyBean);//比如将对话对话打包{\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}]}Log.e("tag", "构造的json数据:" + jsonStr);
//        设置请求头MediaType mediaType = MediaType.parse("application/json;charset=utf-8");RequestBody requestBody = RequestBody.create(jsonStr, mediaType);Request request = null;Log.e("tag", "这里是getAccessToken(API_KEY,SECRET_KEY)==" + access_token);request = new Request.Builder().url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-3.5-8k-0205?access_token=" + access_token).method("POST", requestBody).addHeader("Content-Type", "application/json").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {//Failed callbackcallback.onFailed("请求失败的原因:" + e.getMessage());}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (!response.isSuccessful()) {throw new IOException("Unexpected code " + response);} else {StringBuffer sb = new StringBuffer();BufferedReader bf = new BufferedReader(response.body().charStream());String line;while ((line = bf.readLine()) != null) {if (line.equals("")) {continue;}// 提取JSON字符串(去掉"data: "前缀)String jsonString = line.substring(line.indexOf(':') + 1).trim();//直接提取后面的{}内的字符串,data: {"id":"as-vdb8b44zzu","object":"chat.completion","created":1717511275,"sentence_id":0,"is_end":false,"is_truncated":false,"result":"你好,","need_clear_history":false,"finish_reason":"normal","usage":{"prompt_tokens":1,"completion_tokens":0,"total_tokens":1}}JSONObject jsonObject = JSON.parseObject(jsonString);// 获取result字段的值String ret = jsonObject.getString("result");sb.append(ret);handleUI(callback,sb.toString());
//                        callback.onSuccess(sb.toString());//将获取到result字符串回调给homefragment中}handleContent(callback,sb.toString());}}});}/*** 处理获取到ai结果的后续* @param callback* @param result*/public abstract void handleContent(AiExample.ICallback callback,String result);///*** 处理获取到ai结果后的UI更新* @param callback* @param result*/public abstract void handleUI(AiExample.ICallback callback,String result);//----------------------------------------------------分割线---------------------------------------------------------/***回调接口,向外暴露回调信息,比如让activity,或者fragment继承此接口,然后设置接口就可以*/public interface ICallback {public void onSuccess(String s);public void onFailed(String errMsg);}ICallback callback;public void setListener(ICallback callback) {this.callback = callback;}}

第五步:如何调用封装类方法实现文心一言请求。

5.1.继承父类AiExample。

如下所示:

WXYYService.java

public class WXYYService extends AiExample{public WXYYService(Context context) {super(context);}@Overridepublic void handleContent(ICallback callback,String result) {if(callback!=null){callback.onSuccess(TextReplaceUtils.replaceText(result));//将获取到result字符串回调给homefragment中//将回复的内容作为下次请求的参数ChatWxyyRequestBean chatWxyyRequestBean1 = new ChatWxyyRequestBean();chatWxyyRequestBean1.setRole("assistant");chatWxyyRequestBean1.setContent(result.toString());chatWxyyRequestBeanList.add(chatWxyyRequestBean1);//这里直接把生成的文章存储到数据库中,如果不是用于展示对话的记录,下面这段可以不需要String title = ArticleUtils.convertArticleTitle(TextReplaceUtils.replaceText(result));//获取文章标题String content = ArticleUtils.convertArticleContent(TextReplaceUtils.replaceText(result));//获取文章内容ArticleHistoryBean articleHistoryBean = new ArticleHistoryBean();articleHistoryBean.setArticle_title(title);articleHistoryBean.setArticle_content(content);new ArticleHistoryDao().insert(articleHistoryBean);}}@Overridepublic void handleUI(ICallback callback, String result) {if(callback!=null){callback.onSuccess(result);}}}

5.2如何使用调用请求

关键代码:创建一个封装好的业务对象

 chatGptExample = new WXYYService(getActivity());//new 一个WXYYService对象

继承回调接口:

public class HomeFragment extends Fragment implements View.OnClickListener, View.OnTouchListener, AiExample.ICallback {

回调设置好了以后设置监听对象,用于文心一言的返回文本供UI显示

        chatGptExample.setListener(this);//设置监听器,为了回调显示UI

在回调接口中更新你的UI信息,需要在UI线程中:

 @Overridepublic void onSuccess(String data) {Log.e("tag", "进入回调监听成功");chatMsgList.get(chatMsgList.size() - 1).setContent(data);//将流对象拼接字符串到显示框中try {getActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {if (chatMsgList != null && data != null) {
//                        chatAdapter.notifyItemInserted(chatMsgList.size() - 1);
//                        chatAdapter.notifyItemChanged(chatMsgList.size() - 1);//当有新消息时,刷新RecyclerView中的显示chatAdapter.notifyDataSetChanged();chatAdapter.notifyItemRangeChanged(0, chatMsgList.size());linearLayoutManagerWrap.setStackFromEnd(true);recyclerView.setLayoutManager(linearLayoutManagerWrap);recyclerView.scrollToPosition(chatMsgList.size() - 1);//将RecyclerView定位到最后一行editText.setText("");showContent(data);//显示界面}}});} catch (Exception e) {}}

文章最后打包本实例中的代码,需要的朋友自行下载:

项目参考代码打包下载:https://pan.quark.cn/s/b1e8c935970f

如果遇到开发问题需要解答的,请看我的主页个性签名,先跟大家说声道歉,私信或者留言我基本没怎么留意看。

好了,写到这里就结束了,希望大家都能开发属于自己的文心一言对话app。假如大家不想做成太麻烦的对话形式的话,那也很简单,做一个简单的界面,包括一个点击发送的button,一个接受对话结果的textview,一个对话输出框EditText就可以了。把请求得到的数据显示在textview上就可以了。

网创有方论坛icon-default.png?t=N7T8http://www.wcyf520.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/344897.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码&#xff0c;直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…

编译原理-词法分析(实验 C语言)

编译原理-词法分析 1. 实验目的 设计、编写并调试一个词法分析程序&#xff0c;加深对词法分析原理的理解 2. 实验要求 2.1 待分析的简单语言的词法 关键字&#xff1a;begin&#xff0c;if&#xff0c;then&#xff0c;while&#xff0c;do&#xff0c;end 所有关键字都是…

DevOps入门

DevOps: 让技术团队、运维、测试等团队实现一体式流程自动化 CICD: CI:持续集成 CD:持续交付持续集成:从编码、编译、测试、发布项目到仓库的自动化流程持续交付:包含持续集成&#xff0c;并且增加将项目部署到对应的环境的自动化流程 传统项目闭环流程: DevOps闭环流程…

基于非下采样小波包分析的滚动轴承故障诊断(MATLAB R2021B)

小波变换具有良好的时频局部化特性和多分辨率特性&#xff0c;可准确定位信号的突变点并可在不同尺度上描述信号的局部细节特征&#xff0c;被广泛应用于信号降噪。但标准正交小波变换不具有平移不变性&#xff0c;采用标准正交小波对信号消噪后&#xff0c;会在脉冲尖峰处产生…

VSCode调试揭秘:Live Server助力完美测试Cookie与Session,远超“Open in Browser“!

文章目录 一、项目场景&#xff1a;二、问题描述1. open in browser&#xff1a;2. open with live server 三、原因分析&#xff1a;先了解一下open in browser和open with live server的区别两者的优缺点open in browseropen with live server 四、解决方案&#xff1a;总结 …

Java开发-面试题-0005-==和String的equals()和String的intern()方法的区别

Java开发-面试题-0005-和String的equals()和String的intern()方法的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术…

前端多人项目开发中,如何保证CSS样式不冲突?

在前端项目开发中&#xff0c;例如突然来了一个大项目&#xff0c;很可能就需要多人一起开发&#xff0c;领导说了&#xff0c;要快&#xff0c;要快&#xff0c;要快&#xff0c;你们给我快。然后下面大伙就一拥而上&#xff0c;干着干着发现&#xff0c;一更新代码&#xff0…

转型AI产品经理(5):“锚定效应”如何应用在Chatbot产品中

锚定效应是认知心理学中一个重要的概念&#xff0c;它描述了人们在进行判断或决策时&#xff0c;往往过于依赖最先接收到的信息或数字&#xff08;即“锚点”&#xff09;&#xff0c;即使后续信息与初始锚点无关甚至相反&#xff0c;这个初始信息也会显著地影响最终的判断结果…

【下篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。上回我解释了YoloX, 今天从Yolov6开始。 YOLOv6:面向工业应用的单级物体检测框架 美团视觉人工智能事业部(Meituan Vision AI Department)于 2022 年 9 月在…

拯救者Legion Y9000X IRX9 2024(83FD)原装出厂Windows11系统镜像下载

lenovo联想2024款拯救者Y9000X IRX9 笔记本电脑【83FD】OEM预装Win11系统安装包&#xff0c;恢复开箱状态&#xff0c;自带恢复重置还原功能 链接&#xff1a;https://pan.baidu.com/s/1i_sVcnXF4qgsuj02rebe-Q?pwdyefp 提取码&#xff1a;yefp 联想原装WIN11系统自带所有…

Junit 单元测试 详解,包你掌握

Java单元测试----Junit详解 1 什么是 Junit JUnit 是一个广泛使用的 Java 单元测试框架。它用于编写和运行可重复的测试&#xff0c;以验证 Java 程序的行为是否符合预期 也许有人会好奇&#xff0c;之前学的 Selenium 和 Junit 有什么关系&#xff1f;答案就是没关系&#…

htb-linux-6-beep

nmap web渗透 目录扫描 漏洞关键词 shell py脚本执行 flag root 目前的权限 nmap root

《精通ChatGPT:从入门到大师的Prompt指南》第4章:避免常见错误

第4章&#xff1a;避免常见错误 在使用ChatGPT进行Prompt编写时&#xff0c;常见的错误可能会大大影响生成内容的质量和准确性。本章将详细讨论这些错误&#xff0c;并提供如何避免它们的建议。 4.1 不明确的指令 在使用ChatGPT时&#xff0c;一个常见的问题是指令不够明确。…

使用proteus仿真51单片机的流水灯实现

proteus介绍&#xff1a; proteus是一个十分便捷的用于电路仿真的软件&#xff0c;可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域&#xff0c;使用代码实现电路功能的仿真。 汇编语言介绍&#xff1a; 百度百科介绍如下&#xff1a; 汇编语言是培养…

Spring boot+vue前后端分离

目录 1、前端vue的搭建 2、后端项目的构建 pom文件中引入的jar包 yml文件用来配置连接数据库和端口的设置 application.property进行一些整合 service层 imp层 mapper 实体类 额外写一个类、解决跨域问题 3、测试 1、前端vue的搭建 建立项目的过程略 开启一个建立好…

JDK下载安装Java SDK

Android中国开发者官网 Android官网 (VPN翻墙) 通过brew命令 下载OracleJDK(推荐) 手动下载OracleJDK(不推荐) oracle OracleJDK下载页 查找硬件设备是否已存在JDK环境 oracle官网 备注&#xff1a; JetPack JavaDevelopmentKit Java开发的系统SDK OpenJDK 开源免费SDK …

unity3d:GameFramework+xLua+Protobuf+lua-protobuf,生成.cs,.pb工具流

概述 1.区分lua&#xff0c;cs用的proto 2.proto生成cs&#xff0c;使用protogen.exe&#xff0c;通过csharp.xslt修改生成cs样式 3.proto生成lua加载.pb二进制文件&#xff0c;并生成.pb列表文件&#xff0c;用于初始化加载 4.协议id生成cs&#xff0c;lua中枚举 区分cs&…

spring boot3登录开发-2(3邮件验证码接口实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 接口设计与实现 1.接口分析 2.实现思路 3.代码实现 1.定义验证码短信HTML模板枚举类 2.定义验证码业务接口 3. 验证码业务接口实现 4.控制层代码 4.测试 写…

【原创】springboot+mysql农业园区管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【物联网实战项目】STM32C8T6+esp8266/mqtt+dht11+onenet+uniapp

一、实物图 前端uniapp效果图&#xff08;实现与onenet同步更新数据&#xff09; 首先要确定接线图和接线顺序&#xff1a; 1、stm32c8t6开发板连接stlinkv2下载线 ST-LINK V2STM323.3V3.3VSWDIOSWIOSWCLKSWCLKGNDGND 2、ch340串口连接底座&#xff08;注意RXD和TXD的连接方式…