HarmonyOS AI集成的几个主要路径
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 进行集成。这一路径适合“帮我安排明天出差行程”这类需要跨应用联动和多步工具调用的场景,开发复杂度显著高于前三条路径,建议在前述路径跑通后再演进。
更多推荐
所有评论(0)