HarmonyOS 的 AI 集成并非单一技术路径,可以根据定制化程度、集成成本和控制粒度形成了几个层次分明的方案。选型的关键在于先判断你的 AI 需求是“开箱即用的标准能力”,还是“需要嵌入自研模型并精细控制推理过程”,抑或是“让应用的功能被系统级 AI 入口(小艺)直接调度”。一般的方法先用系统 AI Kit 或 Intents Kit 跑通最小闭环,确有定制模型需求时再引入 MindSpore Lite,复杂编排场景再演进到 Agent。

路径一:系统原生 AI Kit(以 OCR 文字识别为例)

HarmonyOS 的 Core Vision Kit 提供了开箱即用的文字识别能力,底层基于预训练深度学习模型,端侧推理,不依赖云端,隐私敏感场景(身份证、发票识别)尤其适用。

步骤: 导入 @kit.CoreVisionKit → 创建 TextRecognitionEngine → 配置识别参数 → 传入 PixelMap 执行识别 → 解析 TextRecognitionResult。

核心代码(ArkTS):

import { textRecognition } from '@kit.CoreVisionKit';
import { image } from '@kit.ImageKit';

async function recognizeText(imageUri: string): Promise<string> {
  // 1. 图片源转 PixelMap
  const imageSource = image.createImageSource(imageUri);
  const imagePixelMap = await imageSource.createPixelMap();

  // 2. 创建识别引擎(FAST 为快速模式预设)
  const engine = textRecognition.TextRecognitionEngine.create(
    textRecognition.TextRecognitionPreset.FAST
  );

  // 3. 配置参数:启用文字检测和方向检测
  const config: textRecognition.TextRecognitionConfig = {
    isTextDetectionEnabled: true,
    isDirectionDetectionEnabled: true
  };

  // 4. 执行识别
  const result = await engine.recognizeText(imagePixelMap, config);

  // 5. 提取文本
  return result.value ?? '';
}

这段代码覆盖了从图片到文本的完整链路。实际使用时还需要在 module.json5 中声明相机或文件读取权限,并对识别结果按行/按块进行后处理(合并低置信度片段、按坐标排序等)。

如果需求是物体检测,路径类似:使用 @kit.CoreVisionKit 的 objectDetection.ObjectDetector.create(),输出目标的类别、边框位置和置信度,支持风景、动物、人脸、文档等预置类别。分词则使用 @kit.NaturalLanguageKit 的 textProcessing.getWordSegment(),直接对输入文本返回分词结果与词性标注。

路径二:MindSpore Lite 端侧推理(自研模型集成)

当系统 AI Kit 的预置能力不够用,而你有自研或第三方训练的模型需要嵌入应用时,MindSpore Lite 是首选。它是 HarmonyOS 面向端侧的轻量级推理框架,支持模型转换 → 硬件加速(NNRt/NPU)→ 推理调度全链路。

完整步骤:

Step 1:模型准备。 MindSpore Lite 使用 .mindir 格式。PyTorch/TensorFlow 模型先转 ONNX,再用 MindSpore Lite 转换工具转为 .mindir;MindSpore 原生模型直接用 ms.export(..., file_format="MINDIR") 导出。

Step 2:依赖声明。 在 oh-package.json5 中添加:

{
  "dependencies": {
    "@ohos/mindspore-lite": "^1.0.0"
  }
}

Step 3:初始化长生命周期对象。 关键原则:Context 和 Model 应在应用启动时创建、退出时释放,不要每次推理都重建。

import { mindSporeLite } from '@kit.MindSporeLiteKit';

export class ImageClassifier {
  private model: mindSporeLite.Model | null = null;

  async loadModel(rawfilePath: string): Promise<void> {
    // 配置推理后端:['cpu']、['gpu'] 或 ['nnrt'](NPU加速)
    const contextConfig: mindSporeLite.Context = {
      target: ['cpu'],
      cpuThreadNum: 4,
      cpuBindMode: mindSporeLite.CpuBindMode.MIDDLE_CPU
    };

    this.model = await mindSporeLite.loadModelFromFile(
      rawfilePath, contextConfig
    ) as mindSporeLite.Model;
  }
}

Step 4:执行推理。 核心是填充输入张量 → predict → 读取输出张量:

async predict(inputData: Float32Array): Promise<Float32Array> {
  if (!this.model) throw new Error('Model not loaded');

  const inputs: mindSporeLite.MSTensor[] = this.model.getInputs();
  // 将预处理后的 Float32Array 写入输入张量的 data
  inputs[0].setData(inputData);

  const outputs: mindSporeLite.MSTensor[] = await this.model.predict(inputs);
  return outputs[0].getData() as Float32Array;
}

loadModelFromFile 的 API 签名和输入张量获取方式在官方文档中有明确示例。如果要启用 NPU 加速,将 context.target 设为 ['nnrt'] 并确保设备支持 NNRt 后端即可。

工程化注意: 模型文件应放在 rawfile 或沙箱目录;输入数据的预处理(归一化、Resize、颜色通道顺序)必须与训练时严格一致,否则推理结果会系统性偏移。

路径三:Intents Kit(意图框架)——让应用功能被小艺直接调用

意图框架解决的是“用户不想打开 App 层层点击,而是直接说一句话就到达功能页”的问题。开发者将应用内功能注册为意图(Intent) ,小艺理解自然语言后转换为意图调用,拉起应用对应页面或执行对应逻辑。

步骤:

Step 1:在 AGC 创建意图。 登录 AppGallery Connect → 增长 > 意图框架 → 创建意图,填写意图名称、领域、参数和示例语句。例如“订咖啡”意图,参数包括 coffeeType、size、quantity,示例语句为“帮我订一杯拿铁”。

Step 2:编写意图声明文件。 在 src/main/resources/base/profile/insight_intent.json 中声明。以一个更通用的“跳转功能页”意图 JumpFunctionPage 为例:

{
  "insightIntents": [
    {
      "intentName": "JumpFunctionPage",
      "domain": "ToolsDomain",
      "intentVersion": "1.0.1",
      "srcEntry": "./ets/entryability/InsightIntentExecutorImpl.ets",
      "uiAbility": {
        "ability": "EntryAbility",
        "executeMode": ["foreground"]
      },
      "inputParams": [{
        "properties": {
          "pageId": {
            "type": "string",
            "enum": [
              { "value": "1", "displayName": "查找路线",
                "keywords": ["查路线", "路线查询", "找路线"] },
              { "value": "2", "displayName": "扫一扫",
                "keywords": ["扫码"] }
            ]
          }
        }
      }]
    }
  ]
}

这段声明注册了一个参数 pageId,枚举值“1”对应“查找路线”,“2”对应“扫一扫”,小艺根据用户语句匹配 keywords 选择对应枚举值传入。

Step 3:实现意图执行逻辑。 以“订咖啡”为例,核心是解析参数并返回结构化结果:

import { insightIntent } from '@kit.IntentsKit';

async function handleOrderCoffee(
  params: Record<string, Object>
): Promise<insightIntent.InsightIntentResult> {
  const coffeeType = (params.coffeeType as string) || '拿铁';
  const size = (params.size as string) || '中杯';
  const quantity = (params.quantity as number) || 1;

  try {
    const order = await orderCoffeeAPI({ type: coffeeType, size, quantity });
    return {
      code: 0,
      result: {
        orderId: order.orderId,
        message: `已为您下单${quantity}杯${size}${coffeeType}`,
        estimatedTime: order.estimatedTime
      }
    };
  } catch (err) {
    return { code: -1, result: { message: `下单失败` } };
  }
}

Step 4:在 EntryAbility 中注册执行器:

import { insightIntent } from '@kit.IntentsKit';
import { UIAbility } from '@kit.AbilityKit';
import { executeIntent } from '../intents/OrderCoffee';

export default class EntryAbility extends UIAbility {
  onCreate(): void {
    insightIntent.registerIntentExecutor('com.example.app', {
      onExecute: async (intentName, parameters) => {
        return await executeIntent(intentName, parameters);
      }
    });
  }
}

注册后将 intentName 分发到对应处理函数即可。意图开发完成后需在 AGC 提交审核,审核通过才能被小艺实际调用。

对于“功能一步达”场景(如打开“查找路线”或“扫一扫”页面),执行器需继承 InsightIntentExecutor 并重写 onExecuteInUIAbilityForegroundMode,根据 pageId 拉起对应落地页。

路径四:AI Agent(智能体)——更高阶的编排形态

Agent 在意图之上进一步,核心差异是自主规划:Agent 接收用户目标,自主决定调用哪些 Skill、以什么顺序执行,而不是只响应单一意图。HarmonyOS 的 Agent 开发可以通过 DevEco Studio 的 New → Extension Ability → Agent 模板生成基础结构,agent_config.json 向小艺声明能力,也可以通过小艺开放平台创建智能体后获取 Agent ID 进行集成。这一路径适合“帮我安排明天出差行程”这类需要跨应用联动和多步工具调用的场景,开发复杂度显著高于前三条路径,建议在前述路径跑通后再演进。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐