最新案例动态,请查阅【案例共创】使用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. 案例流程
说明:
用户进入开发者空间,在 MaaS 平台上领取模型;
用户在本地安装 DevEco Studio 开发工具;
使用 DevEco Studio 开发工具编写代码,调用模型 API 接口;
5. 资源总览
本案例预计花费 0 元。
二、资源与开发环境准备
1. 开发者空间配置
面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。
2. 领取大模型服务 Tokens
参考案例《华为云MaaS大模型服务百万商用Tokens领取使用指导》中的“一、 领取”章节内容,领取华为开发者空间百万token代金券福利,购买 ModelArts Studio DeepSeek-V3 轻量体验包(¥3.50)。开通商用模型服务,最后获取模型名称、API 地址和 API Key 的参数值。
注意:记录 API Key、API 地址以及 model 名称留作后面步骤使用。
三、创建鸿蒙项目,调用 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 项目
通过如下两种方式,打开工程创建向导界面:
选择创建 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}
复制代码
参数说明:
发起 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)); });}
复制代码
注意:
点击运行按钮,运行鸿蒙项目,成功返回: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 应用的案例已全部完成。
评论