【案例共创】 使用HarmonyOS NEXT和MaaS快速开发鸿蒙AI应用

一、概述

1. 案例介绍

鸿蒙(HarmonyOS)是华为开发的面向万物互联时代的分布式操作系统‌,支持手机、平板、智能穿戴等全场景设备,实现硬件互助、资源共享。该系统基于组件化设计,具备内核层自主可控、一次开发多端部署等特性。

MaaS (即 ModelArts Studio大模型即服务平台)是华为云面向AI开发者推出的一站式大模型开发平台,支持开发者一键体验大模型能力,快速构建大模型应用。MaaS平台提供大模型训练、推理、部署、管理、监控等全生命周期管理能力,帮助开发者快速构建大模型应用,加速AI开发。

ModelArts Studio大模型即服务平台(MaaS)的应用场景:

  • 业界主流开源大模型覆盖全
    MaaS集成了业界主流开源大模型,含Llama、Baichuan、Yi、Qwen模型系列,所有的模型均基于昇腾AI云服务进行全面适配和优化,使得精度和性能显著提升。开发者无需从零开始构建模型,只需选择合适的预训练模型进行微调或直接应用,减轻模型集成的负担。

  • 零代码、免配置、免调优模型开发
    平台结合与100+客户适配、调优开源大模型的行业实践经验,沉淀了大量适配昇腾,和调优推理参数的最佳实践。通过为客户提供一键式训练、自动超参调优等能力,和高度自动化的参数配置机制,使得模型优化过程不再依赖于手动尝试,显著缩短了从模型开发到部署的周期,确保了模型在各类应用场景下的高性能表现,让客户能够更加聚焦于业务逻辑与创新应用的设计。

  • 资源易获取,按需收费,按需扩缩,支撑故障快速恢复与断点续训
    企业在具体使用大模型接入企业应用系统的时候,不仅要考虑模型体验情况,还需要考虑模型具体的精度效果,和实际应用成本。
    MaaS提供灵活的模型开发能力,同时基于昇腾云的算力底座能力,提供了若干保障客户商业应用的关键能力。
    保障客户系统应用大模型的成本效率,按需收费,按需扩缩的灵活成本效益资源配置方案,有效避免了资源闲置与浪费,降低了进入AI领域的门槛。
    架构强调高可用性,多数据中心部署确保数据与任务备份,即使遭遇故障,也能无缝切换至备用系统,维持模型训练不中断,保护长期项目免受时间与资源损耗,确保进展与收益。

  • 大模型应用开发,帮助开发者快速构建智能Agents
    在企业中,项目级复杂任务通常需要理解任务并拆解成多个问题再进行决策,然后调用多个子系统去执行。MaaS基于多个优质昇腾云开源大模型,提供优质Prompt模板,让大模型准确理解业务意图,分解复杂任务,沉淀出丰富的多个智能Agent,帮助企业快速智能构建和部署大模型应用。

2. 适用对象

  • 企业
  • 个人开发者
  • 高校学生

3. 案例时间

本案例总时长预计60分钟。

4. 案例流程

说明:

  1. 用户进入开发者空间,在MaaS平台上领取模型;
  2. 用户在本地安装DevEco Studio开发工具;
  3. 使用DevEco Studio开发工具编写代码,调用模型API接口;

5. 资源总览

本案例预计花费0元。

资源名称规格单价(元)时长(分钟)
开发者空间—云主机4vCPUs | 8GB | ARM | Ubuntu免费60
ModelArts Studio免费60
DevEco StudioDevEco Studio 5.0.3 Release免费60
Local EmulatorHarmonyOS 5.0.3免费60

二、资源与开发环境准备

1. 开发者空间配置

面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。

2. 领取大模型服务Tokens

参考案例《华为云MaaS大模型服务免费Tokens领取使用指导》 的“二、免费领取”章节,领取DeepSeek-V3-32K(NEW)模型Tokens。记录API地址API Key留作后面步骤使用。

三、创建鸿蒙项目,调用API接口

1. 安装开发工具、创建本地模拟器

下载DevEco Studio,选择DevEco Studio 5.0.3 Release版本:

https://developer.huawei.com/consumer/cn/download/deveco-studio

安装DevEco Studio:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-software-install

创建模拟器:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-emulator-create

2. 创建HarmonyOS NEXT项目

通过如下两种方式,打开工程创建向导界面:

  • 如果当前未打开任何工程,可以在DevEco Studio的欢迎页,选择Create Project开始创建一个新工程。
  • 如果已经打开了工程,可以在菜单栏选择File > New > Create Project来创建一个新工程。

选择创建Application,再选择需要的Ability工程模板,然后单击Next。

在工程配置页面,需要根据向导配置工程的基本信息。

点击finish,等待项目同步完成。

添加网络权限:

在entry->src->main->module.json5下,添加网络权限:

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ],

3. 编写代码调用API接口

使用HTTP发起请求分为:一般数据请求和流式传输请求。

发起HTTP一般数据请求:

  • 从@kit.NetworkKit中导入http命名空间。
  • 调用createHttp()方法,创建一个HttpRequest对象。
  • 调用该对象的on()方法,订阅http响应头事件,此接口会比request请求先返回。可以根据业务需要订阅此消息。
  • 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。
  • 按照实际业务需要,解析返回结果。
  • 调用该对象的off()方法,取消订阅http响应头事件。
  • 当该请求使用完毕时,调用destroy()方法主动销毁。

具体操作步骤,请参考以下代码。

在Index外层导入http和 BusinessError:

import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';

在Index.ets文件中的aboutToAppear 方法中定义方法,发起一般数据请求:

  aboutToAppear(): void {
    // HTTP一般数据请求
    commonRequest()
  }

commonRequest方法的完整代码:

function commonRequest() {
  // 每一个httpRequest对应一个HTTP请求任务,不可复用
  let httpRequest = http.createHttp();
  // 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
  httpRequest.on('headersReceive', (header) => {
    console.info('header: ' + JSON.stringify(header));
  });
  httpRequest.request(
    // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
    "EXAMPLE_URL",
    {
      method: http.RequestMethod.POST,
      // 开发者根据自身业务需要添加header字段
      header: {
        'Content-Type': 'application/json',
        // 把yourApiKey替换成真实的API Key
        "Authorization": 'Bearer yourApiKey'
      },
      // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
      extraData: {
        "model": "DeepSeek-V3",
        "messages": [
          { "role": "system", "content": "You are a helpful assistant." },
          { "role": "user", "content": "请介绍下中华人名共和国的首都" }
        ],
        "stream": false,
        "temperature": 0.6
      },
      expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
      usingCache: true, // 可选,默认为true
      priority: 1, // 可选,默认为1
      connectTimeout: 60000, // 可选,默认为60000ms
      readTimeout: 60000, // 可选,默认为60000ms
      usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
    }, (err: BusinessError, data: http.HttpResponse) => {
    if (!err) {
      // data.result为HTTP响应内容,可根据业务需要进行解析
      console.info('Result:' + JSON.stringify(data.result));
      console.info('code:' + JSON.stringify(data.responseCode));
      // data.header为HTTP响应头,可根据业务需要进行解析
      console.info('header:' + JSON.stringify(data.header));
      console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
      // 当该请求使用完毕时,调用destroy方法主动销毁
      httpRequest.destroy();
    } else {
      console.error('error:' + JSON.stringify(err));
      // 取消订阅HTTP响应头事件
      httpRequest.off('headersReceive');
      // 当该请求使用完毕时,调用destroy方法主动销毁
      httpRequest.destroy();
    }
  });
}

注意:

  • EXAMPLE_URL 要替换成上一个步骤中获取的API地址
  • yourApiKey 要替换成上一个步骤中获取的API Key
  • extraData:POST请求时此字段用于传递请求体内容。

这里我们调用模型能力,帮忙介绍下中华人名共和国的首都。

点击运行按钮,运行鸿蒙项目,成功获取数据:

返回数据:

{
    "id": "chat-905be6d7c37448348bc1b29a27e89cf6",
    "object": "chat.completion",
    "created": 1748404209,
    "model": "DeepSeek-V3",
    "choices": [{
        "index": 0,
        "message": {
            "role": "assistant",
            "content": "中华人民共和国的首都是北京。北京是一座具有悠久历史和灿烂文化的古城,也是中国的政治、文化、国际交往、科技创新和教育中心。北京拥有许多著名的文化古迹和现代建筑,如故宫、天安门广场、颐和园、鸟巢等。同时,北京还是中国最重要的交通枢纽之一,拥有发达的交通网络和便捷的公共交通系统。",
            "tool_calls": []
        },
        "logprobs": null,
        "finish_reason": "stop",
        "stop_reason": null
    }],
    "usage": {
        "prompt_tokens": 28,
        "total_tokens": 107,
        "completion_tokens": 79
    },
    "prompt_logprobs": null
}

参数说明:

参数参数类型描述
IdStr请求ID
objectStr请求任务
createdInt请求生成的时间戳
modelStr调用的模型名
choicesArray模型生成内容
usageObject请求输入长度、输出长度和总长度

发起HTTP流式传输请求:

  • 从@kit.NetworkKit中导入http命名空间。
  • 调用createHttp()方法,创建一个HttpRequest对象。
  • 调用该对象的on()方法,可以根据业务需要订阅HTTP响应头事件、HTTP流式响应数据接收事件、HTTP流式响应数据接收进度事件和HTTP流式响应数据接收完毕事件。
  • 调用该对象的requestInStream()方法,传入http请求的url地址和参数,发起网络请求。
  • 按照实际业务需要,可以解析返回的响应码。
  • 调用该对象的off()方法,取消订阅响应事件。
  • 当该请求使用完毕时,调用destroy()方法主动销毁。

具体操作步骤,请参考以下代码。

在Index.ets文件中的aboutToAppear 方法中定义方法,发起HTTP流式传输请求:

  aboutToAppear(): void {
    // HTTP一般数据请求
    // commonRequest()
    // HTTP流式传输请求
    streamRequest()
  }

streamRequest方法的完整代码:

function streamRequest() {
  // 每一个httpRequest对应一个HTTP请求任务,不可复用
  let httpRequest = http.createHttp();
  // 用于订阅HTTP响应头事件
  httpRequest.on('headersReceive', (header: Object) => {
    console.info('header: ' + JSON.stringify(header));
  });
  // 用于订阅HTTP流式响应数据接收事件
  let res = new ArrayBuffer(0);
  httpRequest.on('dataReceive', (data: ArrayBuffer) => {
    const newRes = new ArrayBuffer(res.byteLength + data.byteLength);
    const resView = new Uint8Array(newRes);
    resView.set(new Uint8Array(res));
    resView.set(new Uint8Array(data), res.byteLength);
    res = newRes;
    console.info('res length: ' + res.byteLength);
  });
  // 用于订阅HTTP流式响应数据接收完毕事件
  httpRequest.on('dataEnd', () => {
    console.info('No more data in response, data receive end');
  });
  let streamInfo: http.HttpRequestOptions = {
    method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
    // 开发者根据自身业务需要添加header字段
    header: {
      'Content-Type': 'application/json',
      // 把yourApiKey替换成真实的API Key
      "Authorization": 'Bearer yourApiKey'
    },
    // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
    extraData: {
      "model": "DeepSeek-V3",
      "messages": [
        { "role": "system", "content": "You are a helpful assistant." },
        { "role": "user", "content": "请介绍下中华人名共和国的首都" }
      ],
      "stream": false,
      "temperature": 0.6
    },
    expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
    usingCache: true, // 可选,默认为true
    priority: 1, // 可选,默认为1
    connectTimeout: 60000, // 可选,默认为60000ms
    readTimeout: 60000, // 可选,默认为60000ms。若传输的数据较大,需要较长的时间,建议增大该参数以保证数据传输正常终止
    usingProtocol: http.HttpProtocol.HTTP1_1 // 可选,协议类型默认值由系统自动指定
  }
  // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
  httpRequest.requestInStream("EXAMPLE_URL",
    streamInfo).then((data: number) => {
    console.info("requestInStream OK!");
    console.info('ResponseCode :' + JSON.stringify(data));
    // 取消订阅HTTP响应头事件
    httpRequest.off('headersReceive');
    // 取消订阅HTTP流式响应数据接收事件
    httpRequest.off('dataReceive');
    // 取消订阅HTTP流式响应数据接收完毕事件
    httpRequest.off('dataEnd');
    // 当该请求使用完毕时,调用destroy方法主动销毁
    httpRequest.destroy();
  }).catch((err: Error) => {
    console.info("requestInStream ERROR : err = " + JSON.stringify(err));
  });
}

注意:

  • EXAMPLE_URL 要替换成上一个步骤中获取的API地址
  • yourApiKey 要替换成上一个步骤中获取的API Key

点击运行按钮,运行鸿蒙项目,成功返回:200

FAQ:

request和requestInStream使用区别:如果响应数据小于5M用request,大于5M用requestinstream。

参考

https://support.huaweicloud.com/usermanual-maas-modelarts/maas-modelarts-0011.html

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/http-request-V5

三方库

https://plugins.jetbrains.com/plugin/25151-json2ets

至此,使用HarmonyOS NEXT和MaaS快速开发鸿蒙AI应用的案例已全部完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值