[经验分享] 结合百度AI模型和分布式设备协同网络的分布式AI聊天室 原创 精华

数创院刘Sir 显示全部楼层 发表于 2024-7-25 14:24:16
stage模型API9工程
分布式AI聊天室可以实现下面4种功能:
1、实现自动发现与组网:利用api9系统的分布式组网技术,实现设备间的自动发现与快速组网,无需用户进行复杂的Wi-Fi或蓝牙匹配操作,同一局域网下想扩大通信距离就连接同一WiFi,短距离通信则同时开启蓝牙和WiFi,无需配网和任何匹配操作,聊天室自动接入。
2、构建安全聊天室:设计并实现一个基于分布式网络的安全聊天室系统,支持文本、表情等信息的即时传输,同时确保数据传输过程中的安全性,设备直接直接连接,不需要单独开发转发服务器中转通信内容,基本无法被监听。
3、集成AI问答功能:在聊天室内嵌入AI模型,提供智能问答服务,增强聊天室的互动性和实用性。
4、优化用户体验:确保系统在不同设备上的兼容性和稳定性,提供流畅、便捷的操作体验,同时增强用户对于数据安全的信任感。

fakename.png
技术难点1:如何用分布式网络实现设备间的信息发送?
在api9的ARKTS接口中没有分布式设备管理的API接口,我这里使用的是分布式键值对数据库,把名字和信息内容用json格式封装直接存储到分布式数据库中,
  1. let obj = {
  2.                 name:this.name,
  3.                 message:this.message

  4.               }
  5. this.pushData(JSON.stringify(obj))
复制代码

分布式数据库的内容一旦改变会马上更新,我们要实现接收信息只显示其他设备的信息,而不会一直刷新出自己刚刚放的数据,需要只订阅远端信息
  1. try {
  2.       this.kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_REMOTE,
  3.         (data: distributedKVStore.ChangeNotification) => {
  4.           if ((data.updateEntries.length > 0) || (data.insertEntries.length > 0)) {
  5.             callback(data);
  6.             console.info('KvStoreModel setDataChangeListener dataChange success');
  7.           }
  8.         });
  9.     } catch (error) {
  10.       console.error('KvStoreModel setDataChangeListener on dataChange failed, err= '+JSON.stringify(error));

  11.     }
复制代码
剩下的消息展示设计自己UI组件设计即可
技术难点2:官方提供分布式接口调用,但是无完整权限申请教程,如何启动分布式协同能力?
分布式协调能力只修改module.json5文件申请分布式权限我试过并没有启动分布式功能,需要修改EntryAbility.ts文件为EntryAbility.ets文件onWindowStageCreate
  1. checkPermissions(this.context);
  2. async function checkPermissions(context: common.UIAbilityContext) {
  3.   let grantStatus: abilityAccessCtrl.GrantStatus = await checkAccessToken();
  4.   if (grantStatus !== abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
  5.     // Applying for the distributed data synchronization permission.
  6.     let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  7.     atManager.requestPermissionsFromUser(context, permissions).then((data) => {
  8.       let grantStatus: Array<number> = data.authResults;
  9.       let length: number = grantStatus.length;
  10.       for (let i: number = 0; i < length; i++) {
  11.         if (grantStatus[i] === 0) {
  12.           hilog.info(0x0000,'EntryAbility', `checkPermissions request permission ${permissions[i]} success`);
  13.         } else {
  14.           hilog.error(0x0000,'EntryAbility',
  15.             `checkPermissions request fail permission=${permissions[i]}, grantStatus=${grantStatus[i]}`);
  16.           return;
  17.         }
  18.       }
  19.     }).catch((err: Error) => {
  20.       hilog.error(0x0000,'EntryAbility',
  21.         `checkPermissions request permissions failed, err=${JSON.stringify(err)}`);
  22.     })
  23.   }
  24. }

  25. /**
  26. * Obtains the authorization status.
  27. *
  28. * @returns Grant status.
  29. */
  30. async function checkAccessToken() {
  31.   let atManager = abilityAccessCtrl.createAtManager();
  32.   let tokenId: number = 0;
  33.   try {
  34.     let bundleInfo: bundleManager.BundleInfo = await bundleManager
  35.       .getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
  36.     let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
  37.     tokenId = appInfo.accessTokenId;
  38.   } catch (err) {
  39.     hilog.error(0x0000,'EntryAbility',
  40.       `checkAccessToken Failed to get bundle info for self. err=${JSON.stringify(err)}`);
  41.   }

  42.   let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
  43.   try {
  44.     grantStatus = await atManager.checkAccessToken(tokenId, 'ohos.permission.DISTRIBUTED_DATASYNC');
  45.   } catch (err) {
  46.     hilog.error(0x0000,'EntryAbility',
  47.       `checkAccessToken Failed to check access token. err=${JSON.stringify(err)}`);
  48.   }

  49.   return grantStatus;
  50. }
复制代码
技术难点3,api9的ARKTS接口除了next版系统有ai的kit接口,低版本一点的arkts一个AI的机器学习能力也没有,HMS也不提供,如何实现AI聊天功能呢,或者人脸识别等功能?
api9的ARKTS接口应用开发提供了http,其他的平台提供的机器学习接口很多都是可以通过http进行通信的,我封装了一个网络请求接口和chat的请求接口,对接的百度平台,AI模型接口里发现零一AI接口是免费的
  1. export class BaiduHttpUtils {
  2.   text :string = ''
  3.   request(question: string){
  4.     let httpRequest = http.createHttp();
  5.     // 2 发起请求
  6.     httpRequest.request(
  7.       "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=",
  8.       {
  9.         method: http.RequestMethod.POST,
  10.         header: {
  11.           "Content-Type": "application/json"
  12.         }
  13.       }, (err, data: http.HttpResponse) => {
  14.       if (err) {
  15.         hilog.error(0x0000, 'testTag', 'Failed to request BaiD111u. Cause: %{public}s', JSON.stringify(err) ?? '');
  16.         httpRequest.destroy();
  17.       } else {
  18.         hilog.error(0x0000, 'testTag', 'Request POST BaiDu success. data: %{public}s', JSON.stringify(data.result));
  19.         httpRequest.destroy();
  20.         // 携带认证信息 发起对话请求
  21.         let respToken: BaiDuToken = JSON.parse(data.result.toString())
  22.         this.chatRequest(respToken.access_token, question)

  23.       }
  24.     }
  25.     )
复制代码
chat请求接口代码
  1. chatRequest(token: string, question: string) {

  2.     // 1 createHttp接口创建请求
  3.     let httpRequest = http.createHttp();

  4.     // 2 发起请求
  5.     httpRequest.request(
  6.       // 请求地址
  7.       "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/yi_34b_chat?access_token=" + token,
  8.       {
  9.         method: http.RequestMethod.POST,
  10.         header: {
  11.           "Content-Type": "application/json"
  12.         },
  13.         extraData: {
  14.           "messages": [
  15.             {
  16.               "role": "user",
  17.               "content": question
  18.             }
  19.           ]
  20.         }
  21.       }, (err, data: http.HttpResponse) => {
  22.       if (err) {
  23.         hilog.error(0x0000, 'testTag', 'Failed to request BaiDu. Cause: %{public}s', JSON.stringify(err) ?? '');
  24.         httpRequest.destroy();
  25.       } else {
  26.         this.text =  JSON.parse(data.result.toString()).result
  27.         hilog.error(0x0000, 'testTag', 'Request BaiDu success. data: %{public}s', this.text);
  28.         httpRequest.destroy();
  29.       }
  30.     })
  31.   }
  32. }
复制代码
后面我也研究出来人脸对比这个功能的开发,不过因为API9只能支持应用沙箱内的图片路径,所以我用的工程项目提前存的图片进行识别功能开发,存在无法使用图库或者相机拍照识别的技术难题没解决,以及图片转base64字符串延时问题导致识别上传的字符串请求http快了会为空的技术难题不过我解决了,效果如下,感兴趣的可以评论,单独教你怎么开发:
fakename.png



©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部