鸿蒙项目云捐助第十三讲大模型进行智能问答应用进阶
前面已经熟悉了百度千帆大模型的使用方法,这里需要结合开发的角度进行智能问答的逻辑处理。换句话说,需要鸿蒙应用进行百度千帆大模型的应用接入。
一、百度千帆大模型的应用接入
如果需要在百度千帆大模型的应用平台上进行应用接入,需要进入百度智能云平台后,选择“应用接入”,如下图所示。

点击左侧导航的“应用接入”后,在右侧界面中选择“创建应用”,如下图所示。

这里点击“创建应用”来进行一个应用的创建,在弹出的创建应用对话框中输入应用名称及应用描述,如下图所示。

这里输入了应用名称myheardemo, 把这个应用描述成“一个demo”的接口。输入内容后点击“确定”按钮即可。这样就在“应用接入”中创建了一个应用。如下图所示。

这里对应用进行开发需要使用API Key及Secret Key两个部分的数值。
在开发之前,可以查看左侧导航中的“模型推理”,这里需要找到免费的百度千帆的大模型推理。通过查找发现“Yi-34B-Chat”模型是免费使用的,不需要开通。如下图所示。

这里就使用免费的“Yi-34B-Chat”模型进行智能问答的开发。
当然,后面还有免费的图转文接口,如下图所示。

这里并不使用这个功能,暂时不进行这个接口的调用。
接下来使用鸿蒙技术开发“Yi-34B-Chat”模型的智能问答功能。
二、鸿蒙云捐助智能问答的开发
在智能问答的领域中,一般在线咨询的界面如下图所示。

这里开发过程使用百度智能云免费的“Yi-34B-Chat”模型接口,在接口的后面可以看到api文档。如下图所示。

这里可以点击api文档。在api文档中找到鸿蒙端口的调用方法,这里调用的curl的方法。如下图所示。

文档中指明了大模型“Yi-34B-Chat”接口调用需要分两步,一步是先获取access_token,后面再调用免费的接口“Yi-34B-Chat”,如下图所示。

首先实现布局效果,然后调用大模型接口。这里的布局代码直接给出,如下图所示。

代码使用弹性盒子Flex,在Flex中声明direction的方向是FlexDirection.Column的竖向结构,在弹性盒子中分为上下两个部分,上面是信息的显示窗口,有两个人说的话,一个是自己的问题,一个是大模型的智能问答,由于显示对话的信息窗口可以滚动,这里使用Scroll组件,在Scroll组件中包括两个Text文本组件,两个Text文本组件的width都为100%,都统治每一行,只不过自己的问题放在TextAlign.End的屏幕右端,也就是一行的行末,大模型回答的问题放在TextAlign.Start的屏幕左端,也就是一行的行首。在弹性盒子的下半部分,是用户输入框和一个发送按钮,用户输入框和发送按钮使用Row()方法放在一行中,在属性方面,TextInput输入框设置width宽度和fontSize的字体大小。发送信息Image组件设置宽度width和高度height,并且设置objectFit(ImageFit.Fill)将图像适配宽度和高度。
在这样的界面布局中,当用户需要提问问题时,就会在TextInput文本输入框中输入内容,代码如下图所示。

输入问题后,需要使用“发送”的图片按钮进行大模型问答,代码如下图所示。

根据百度大模型api的需求,首先需要请求apikey,这里首先通过http进行apikey的请求,代码如下图所示。

在之前建立应用时百度AI平台给出的api key和secrent key的信息,也就是在百度AI的应用接入平台可以看到api key和secrent key,如下图所示。

这里点击眼睛可以看到secret key,如下图所示。

然后把这两个key复制到代码中,如下图所示。

代码中通过httpRequest.request发送到get请求申请百度AI连接的token值。这里请求后就会在Log日志中输出access_token的值,如下图所示。

这里的access_token在json数据中,这里需要根据json的结构输出access_token的值。代码如下图所示。

这里通过JSON.parse(value["result"]+"")把value的result项数据转换成json,然后调用json的access_token键对应的值就是获取的access_token。得到token值后,使用post方法,在http请求的extraData的配置项中添加参数,参数中message构建消息问题,消息问题的json数据必须有role指定为user,content的键中指定this.question的问题,代码如下所示。

这里再次发送问题后,就可以在日志中看到输出的问题结果,如下图所示。

结合输出数据特点,需要获取的是result中的result ,结果分析如下图所示。

根据分析,这里解析出result,然后再取result,代码如下图所示。

在运行中发现,提出的问题question在运行对话发送后,对话的内容被清空了,如下图所示。

使用question变量聊天,聊天滚动框不能没有值,始终保留最终的问题,这里把question问题和文本框的输入值分开处理,设置全局变量input_value处理输入框的值。代码如下图所示。

然后在用户发送问题时把输入框的值存储在question中,代码如下图所示。

问题保存后,原来输入框的值就会为空,代码如下图所示。

这个input_value用于控制文本框中的值显示,需要设置在TextInput输入框的text属性中,代码如下所示。

这里把问题和答案的布局稍微改一下,在问题和答案前分别加上头像,代码如下图所示。

这里就实现了大模型的鸿蒙界面问答。

这里也存在一个bug,这里有一处是关于文本框清空的修改,注意代码如下图所示。

这个文本框清空由this.input_value来控制,在发送问题的按钮中代码处理如下图所示。

这里带来的问题时,把文本框清空,由于question中保留了一个问题,再次发送问题时,原来的内容被清空。效果如下图所示。

如果在程序中需要保留原有的问题数据,需要把问题数据和答案数据放在数组中保存。这里在程序初始建立问题数组和答案数组,代码如下图所示。

在大模型回答问题的最后,把问题和答案都放在数组中,代码如下。

由于添加问题和添加答案是同时进行的,同一个索引对应了同一个问题和答案,这里可以把答案和问题当成一个组件绑定在一起,一个问题,一个答案,在build中遍历所有问题时,只需要一次遍历,这个索取即适用于答案,也适用于问题,布局代码修改如下图所示。

这样就完美解决了大模型的智能问答问题,同时问题也是叠加显示处理的方式。后续还会带来华为云应用及智能元素的应用,欢迎大家关注。