HarmonyOS开发:AI套件的技能调用 原创

三掌柜
发布于 2025-3-28 16:44
浏览
1收藏

前言

在AI开启的新技术时代,HarmonyOS凭借其原生的分布式架构与端侧AI能力,正在重新定义智能终端开发范式。基于鸿蒙官方的信息来看,鸿蒙AI的三大核心优势:数据隐私性(本地计算)、毫秒级响应(端侧推理)与零边际成本(模型复用),为开发者提供了独特的创新土壤和开发新范式。那么本文就来以HarmonyOS开发中关于AI套件的技能调用功能的使用来详细聊聊,深入解析如何通过系统级AI接口、分布式协同框架与模型优化工具链,实现高效智能业务开发。

关于技能调用

技能调用是意图框架依托系统AI多模态大模型能力做深度用户输入理解,并通过解析的用户意图对接应用或元服务内的功能和内容。

使用场景描述

使用者通过对小艺对话进行自然语言输入实现内容查询,知识问答,以及通过对图片选定识别问答进行服务获取。技能调用场景分为两种:

  • 功能服务类:端侧意图调用直接进入应用或元服务对应意图功能服务页面。
  • 信息交互类:云侧意图调用进行内容查询后展示,端侧用户点击进行意图调用闭环。
    典型的使用场景分为:功能服务类和信息交互类两种场景。

1、信息交互类

信息交互类的场景分为三种情况,具体如下所示:

  • 内容展示场景。例如查找菜谱:语音对话输入“鱼香肉丝怎么做”,即可搜索到对应的菜谱。
  • 内容展示+AIGC生成场景。例如查公司:语音对话输入“某公司怎么样”,即可生成并展示关于某公司的信息。
  • 功能履约场景。例如订电影票:语音对话输入“买两张今天的电影票,某电影”,即可进行电影票购买选座。

2、功能服务类

功能服务类的场景也分为三种情况,具体如下所示:

  • 跳转页面不带参数场景。例如打开付款码:语音对话输入“打开xx付款码”,即可弹窗对应付款码。
  • 跳转页面带参数场景。例如搜索商品带关键词:语音对话输入“打开xx应用搜一下xx品牌39码”,即可弹窗对应商品。
  • 功能执行并展示UIExtension。例如操控蓝牙开关:语音对话输入“打开蓝牙”,即可弹窗蓝牙设置,并打开蓝牙开关。

使用接入方案

1、接入方案概述

关于使用接入方案的概述,开发者需要按照意图定义,进行意图注册并实现意图调用;用户通过对小艺对话进行自然语言输入,小艺理解语义转换成意图调用(含意图参数),执行意图调用实现对应交互体验。具体流程图如下所示:
HarmonyOS开发:AI套件的技能调用-鸿蒙开发者社区

2、意图注册

这里以“搜索旅游攻略”特性为例,使用者需要首先注册“查看旅游攻略”(ViewTravelGuides),其他意图见各垂域意图Schema:https://developer.huawei.com/consumer/cn/doc/service/intents-schema-0000001901962713。开发者需要编辑对应的意图配置PROJECT_HOME/entry/src/main/resources/base/profile/insight_intent.json文件,实现意图注册,具体操作如下所示:

{
  "insightIntents": [
    {
      "intentName": "ViewTravelGuides",
      "domain": "TravelDomain",
      "intentVersion": "1.0.1",
      "srcEntry": "./ets/entryability/InsightIntentExecutorImpl.ets",
      "uiAbility": {
        "ability": "EntryAbility",
        "executeMode": [
          "background",
          "foreground"
        ]
      },
      "uiExtension": {
        "ability": "insightIntentUIExtensionAbility"
      }
    }
  ]
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

其中,配置参数信息如下所示:
HarmonyOS开发:AI套件的技能调用-鸿蒙开发者社区

具体使用

根据上面的接入方案,这里通过前台意图和前台窗口意图两个调用来介绍具体的使用。

1、前台意图调用

具体的使用的时候,需要开发者自己实现InsightIntentExecutor,并在对应回调实现打开详细页(点击推荐卡片跳转的界面,如旅游攻略详细页面)的能力,ViewTravelGuides的意图调用字段定义见查看旅游攻略 (ViewTravelGuides)。实际操作步骤如下:
(1)继承InsightIntentExecutor。
(2)重写对应方法,例如目标拉起前台页面,则可重写onExecuteInUIAbilityForegroundMode方法。
(3)通过意图名称,识别查看旅游攻略意图(ViewTravelGuides),在对应的方法中传递意图参数(param),并拉起对应落地页(点击推荐卡片跳转的界面,如旅游攻略详细面)。
具体的实现代码如下所示:

import { insightIntent, InsightIntentExecutor } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

export default class InsightIntentExecutorImpl extends InsightIntentExecutor {
  private static readonly VIEW_TRAVEL_GUIDES = 'ViewTravelGuides';
  /**
   * override 执行前台UIAbility意图
   *
   * @param name 意图名称
   * @param param 意图参数
   * @param pageLoader 窗口
   * @returns 意图调用结果
   */
  onExecuteInUIAbilityForegroundMode(name: string, param: Record<string, Object>, pageLoader: window.WindowStage):
    Promise<insightIntent.ExecuteResult> {
    // 根据意图名称分发处理逻辑。接入方可根据实际业务实现页面跳转
    switch (name) {
      case InsightIntentExecutorImpl.VIEW_TRAVEL_GUIDES:
        return this.viewTravelGuides(param, pageLoader);
      default:
        break;
    }
    return Promise.resolve({
      code: -1,
      result: {
        message: 'unknown intent'
      }
    } as insightIntent.ExecuteResult)
  }
  /**
   * 实现调用查看旅游攻略功能
   *
   * @param param 意图参数
   * @param pageLoader 窗口
   */
  private viewTravelGuides(param: Record<string, Object>, pageLoader: window.WindowStage): Promise<insightIntent.ExecuteResult> {
    return new Promise((resolve, reject) => {
      // 实现意图调用,loadContent的入参为旅游攻略落地页路径
      pageLoader.loadContent('pages/TravelGuidePage')
        .then(() => {
          let entityId: string = (param.items as Array<object>)?.[0]?.['entityId'];
          resolve({
            code: 0,
            result: {
              message: 'Intent execute succeed'
            }
          });
        })
        .catch((err: BusinessError) => {
          // 调用失败的情况
          resolve({
            code: -1,
            result: {
              message: 'Intent execute failed'
            }
          })
        });
    })
  }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.

2、前台窗口意图调用

具体的使用的时候,开发者还需要自己实现InsightIntentExecutor,并在对应回调实现窗口页面内容加载的能力。实际操作步骤如下:
(1)继承InsightIntentExecutor。
(2)重写对应方法,例如目标拉起前台窗口化页面,则可重写onExecuteInUIExtensionAbility方法。
(3)通过意图名称,识别打开蓝牙意图(LoadBluetoothCard)调用扩展意图,在对应的方法中传递意图参数(param),并拉起对应窗口化页面。
具体的实现代码如下所示:

import { insightIntent, InsightIntentExecutor, UIExtensionContentSession } from '@kit.AbilityKit';

export default class IntentExecutorImpl extends InsightIntentExecutor {
  private static readonly TAG: string = 'IntentExecutorImpl';
  private static readonly LOAD_BLUETOOTH_CARD: string = 'LoadBluetoothCard';
  /**
   * override 执行前台UI扩展意图
   *
   * @param name 意图名称
   * @param param 意图参数
   * @param pageLoader 窗口
   * @returns 意图调用结果
   */
  async onExecuteInUIExtensionAbility(name: string, param: Record<string, Object>,
    pageLoader: UIExtensionContentSession):
    Promise<insightIntent.ExecuteResult> {
    console.info(IntentExecutorImpl.TAG, `onExecuteInUIExtensionAbility`);
    switch (name) {
      case IntentExecutorImpl.LOAD_BLUETOOTH_CARD:

        return this.openLoadBluetoothCard(pageLoader);
      default:

        break;
    }

    let result: insightIntent.ExecuteResult = {
      code: -1,
      result: {
        message: 'onExecuteInUIExtensionAbility failed'
      }
    };
    return result;
  }

  /**
   * 打开加载蓝牙卡片意图
   *
   * @param pageLoader 意图内容Session对象
   * @returns 执行结果
   */
  private async openLoadBluetoothCard(pageLoader: UIExtensionContentSession): Promise<insightIntent.ExecuteResult> {
    pageLoader.loadContent('pages/UiExtensionPage');
    let result: insightIntent.ExecuteResult = {
      code: 0,
      result: {
        message: 'intent execute succeed'
      }
    }
    return result;
  }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.

结束语

通过上文的介绍,HarmonyOS的AI套件不仅是一组工具集,更是构建"数智世界"的操作系统级基座,本质上构建了开发者与机器智能的"共生界面"。从"科技平权"视角看,本地化AI能力大幅降低了创新门槛,个人开发者凭数行代码即可实现过去需百人团队研发的智能特性。展望未来,随着多模态大模型与分布式硬件的深度融合,HarmonyOS或将成为首个实现"泛在智能"的操作系统。站在技术史维度回望,HarmonyOS或许正在复现Android初生时的颠覆性力量——只不过这次颠覆的不仅是交互方式,更是人机协作的本质。让我们以AI套件为笔,在这张无限延展的蓝图上,共同绘制下一代智能应用的瑰丽画卷!

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-3-28 16:54:14修改
1
收藏 1
回复
举报
1
1


回复
    相关推荐