
# HarmonyOS NEXT 体验官 # 搭建AI聊天小助手(娱乐) 原创
运行环境
运行真机型号 | IDE工具 | API版本 |
---|---|---|
Laval 开发者手机 oriole | devecostudio-windows-5.0.3.403 | 11 |
AI模型采用百度千帆大模型平台,
通过HTTP POST方式获取相应的能力,具体可参考API在线调试 - 千帆大模型平台
AI模型 | 模式 | |
---|---|---|
对话模型 | Yi-34B-Chat (免费)良心👍👍👍👍👍 | 单轮 |
图像理解模型 | Fuyu-8B(免费)良心👍👍👍👍👍 | 单轮 |
运行效果:
无图片识别对话效果:
有图片识别对话效果:
完整视频:HarmonyOS NEXT 搭建AI聊天小助手(娱乐)哔哩哔哩bilibili
开发步骤
1.搭建UI界面
整体布局内部分为:聊天框:Scroll容器;输入框:Row容器
在Scroll中采用ForEach的方式来显示聊天记录:
当中的设计想法是,每一次的循环渲染对应着一次发送问题和接收回答的整个过程,图中就对应了3次循环。
细心的同学会发现,我在代码当中循环遍历的数组是this.HumanMessage表示我们说给AI的消息,而渲染的时候我却只用了循环遍历的下标index做为传参进行处理,而不去使用this.HumanMessage里面的tokenToAIMessage内容,这是因为在每次收发消息的过程中,我会将question和answer存放在对应的数组中,这样还可以实现一键清除聊天记录的效果。
那这和index有什么关系呢?
思考一下,每一次的对话,我说一句存在HumanMessage数组里面,AI回答一句存在AIMessage数组里面,那对于数组来说,两个消息的下标index就都是相等的0、1、2、3、4、5…
那么在渲染的时候,我只需要将index给到对应的数组就可以显示出对应的消息了,并且在没有收到AI消息的时候,会显示一个加载的小圈圈
2.获取AI服务能力
我的方法应该是最简单粗暴也是最笨的方法:异步嵌套
获取百度AI的能力需要两层密钥:
第一层:如何获取AKSK 提供的API_KEY和SECRET_KEY,然后调用
来获取一个访问凭证access_token鉴权
第二层:拿到access_token之后,将提问的数据进行JSON格式的封装
然后调用
由于两次调用HTTP都采用了异步的方法,有时就会出现access_token还没拿到就调用TokenWithYi34BChat,很显然会出问题,于是便有了异步的嵌套,朋友亲切的称为是💩山,也尝试过其他办法,让getAccessToken和TokenWithYi34BChat融合在一起用一个异步来处理,但效果都不尽人意。
有思路的大佬咱们可以聊聊,没思路的大佬可以凑合着用吧,有时也会在第一次调用出现undifine的问题,增加一下setTimeout的时间可以缓解。
3.进行对话
获取输入框中的数据
将this.tokenMessage保存到this.HumanMessage用于显示,再将this.tokenMessage保存为JSON格式
最后将保存的JSON数据发送给Yi34B模型等待拿到data数据,之后将data数据保存到this.AIMessage中用于显示。
4.待优化
待优化项 | 优化内容 | 是否完成 |
---|---|---|
API调用时的异步嵌套 | 简化调用步骤,并且现阶段获取结果的延迟平均在3.3秒左右,需尽可能减少延迟时间,提升响应速度。 | 否 |
发送按钮控件 | 当AI在进行回答时,发送按钮应当无法点击。 | 否 |
代码规范化 | 封装代码当中的魔鬼数以及部分代码可以进行模块化处理 | 否 |
输入显示效果 | 键盘显示时顶出输入框,浏览时scroll指定到最后问答的内容 | 否 |
