在鸿蒙应用里接入AI,通常有两种做法:一是“贴上去”,单独开一个AI助手页面,业务逻辑和智能能力各走各的;二是“长进去”,让搜索框、输入流程、内容生成这些既有功能本身具备理解与生成能力。前者集成快,但用户要多走一步;后者体验自然,却对架构设计提出更高要求。本文从工程化角度拆解后一种做法,围绕能力分层、端云协同与降级兜底,给出可落地的实现思路。
一、先看清智能能力从哪来
HarmonyOS的AI能力并非零散接口,而是一套分层体系。从HarmonyOS 6.0起,AI Kit家族已扩展到11个,按职责大致分为三层:面向“用户说一句话、应用完成任务”的服务层,包含Intents Kit与Agent Framework Kit;面向“某个具体功能变聪明”的能力层Kit;以及负责模型部署与推理的MindSpore Lite Kit。
选对融合的接缝,比盲目堆接口更重要。如果你的目标是让应用理解意图并调度任务,接缝在服务层;如果只是让某个功能具备识别、生成或分类能力,接缝在能力层Kit或MindSpore Lite的自定义模型部署。
端侧推理由基于MindSpore Lite构建的轻量引擎承接,支持CPU与麒麟NPU异构调度。官方生态已积累超200种预置模型,覆盖图像、语音、文本、传感器四大类,并通过Model Zoo开放集成。这意味着大多数“变聪明”的功能可以不联网、不传数据,在几百毫秒内完成。
版本兼容同样影响接缝选择。能力层Kit起始API为12,如果应用还需兼容低版本设备,这是较稳妥的融合点;面向API 26的新应用,则可以在服务层直接为智能体化预留接口。理清演进脉络,能避免把融合点打在即将被平台接管的位置上。
二、第一性原则:AI是增量,不是侵入
实际开发中最重要的架构判断只有一句:AI功能必须是可摘除的增量。当模型加载失败、网络中断或云端配额耗尽时,基础功能必须照常运行。落到工程上就是三条纪律。
第一,服务层隔离。把AI调用收敛到独立的AIFeatureService,页面只消费它返回的Promise结果,不感知模型与网络细节。
第二,降级兜底。每个AI增强点都定义传统路径:OCR失败就回手动输入,端侧推理失败就回云端,云端失败就回规则逻辑。
第三,端云分流。简单、隐私敏感、低延迟的任务走端侧;长上下文、复杂生成任务走云端,两端通过统一的任务路由衔接。
三、实战一:端云协同的路由服务层
融合的地基是一个能分流、能降级的路由服务。下面的AIFeatureService把“任务判定→端侧或云端→兜底”收口为一个方法,页面侧零感知。
- // ai/AIFeatureService.ets —— 端云协同 + 降级兜底的融合服务层
- import { connection } from '@kit.NetworkKit';
- export interface AiResult {
- text: string;
- source: 'onDevice' | 'cloud' | 'fallback';
- }
- export class AIFeatureService {
- // 任务判定:短任务、含敏感词、离线 → 端侧;其余 → 云端
- private async shouldUseOnDevice(input: string): Promise<boolean> {
- const hasNet: boolean = await connection.hasDefaultNet();
- const isShort: boolean = input.length <= 64;
- const isSensitive: boolean = /身份证|银行卡|病历/.test(input);
- return !hasNet || isSensitive || (isShort && !this.needsLongContext(input));
- }
- private needsLongContext(input: string): boolean {
- return input.length > 256; // 长上下文场景交云端
- }
- async process(input: string): Promise<AiResult> {
- try {
- if (await this.shouldUseOnDevice(input)) {
- const r = await this.onDeviceInfer(input); // MindSpore Lite 端侧推理
- return { text: r, source: 'onDevice' };
- }
- const c = await this.cloudInfer(input); // 云端大模型
- return { text: c, source: 'cloud' };
- } catch (e) {
- return { text: this.ruleFallback(input), source: 'fallback' }; // 规则兜底
- }
- }
- private async onDeviceInfer(input: string): Promise<string> { /* 端侧推理 */ return input; }
- private async cloudInfer(input: string): Promise<string> { /* 云端调用 */ return input; }
- private ruleFallback(input: string): string { return input; } // 传统路径
- }
复制代码
页面侧只负责展示结果和来源状态,调用逻辑保持克制。
- @Entry
- @Component
- struct SmartNotePage {
- @State result: string = '';
- @State from: string = '';
- private ai: AIFeatureService = new AIFeatureService();
- build() {
- Column() {
- Text(this.result || '输入内容,体验智能处理')
- Text(this.from === 'onDevice' ? '端侧推理 · 数据不出设备'
- : this.from === 'cloud' ? '云端推理 · 深度理解'
- : '离线兜底 · 规则处理').fontSize(12).fontColor('#0369a1')
- Button('智能处理').onClick(() => {
- this.ai.process('整理这份会议纪要的关键结论').then((r: AiResult) => {
- this.result = r.text;
- this.from = r.source;
- });
- })
- }.padding(16)
- }
- }
复制代码
四、实战二:把自然语言能力缝进搜索框
第二个范式是把Natural Language Kit的NLU能力融入既有交互。搜索框不再只做字符串匹配,而是先做分词与实体识别,再驱动联想。用户感知是“搜索变懂事了”,实现上只是一个前置处理步骤。
- // search/SmartSuggest.ets —— NLU 融入搜索联想
- import { textProcessing } from '@kit.NaturalLanguageKit';
- export interface SuggestItem { keyword: string; entity: string; }
- export class SmartSuggest {
- async build(input: string): Promise<SuggestItem[]> {
- // 分词 + 实体识别:把自然语言拆成可检索的结构
- const tokens: string[] = await textProcessing.tokenize(input);
- const entity: string = await textProcessing.getEntity(input);
- return tokens.map((k: string): SuggestItem => ({ keyword: k, entity: entity }));
- }
- }
复制代码
在SearchBar的onSubmit中先走SmartSuggest,识别失败时直接退回原字符串检索,既有数据流完全不变。这类融合性价比最高:改动只有一个函数调用点,却让“附近的川菜馆”“下周五的机票”这类自然语言查询有了结构化的可执行语义。
五、实战三:用MindSpore Lite Kit部署自定义模型
当功能需要专属模型,例如品类识别、表单抽取,可以用MindSpore Lite Kit做端侧部署。模型文件(.ms格式)放入entry/src/main/resources/rawfile,通过@ohos.ai.inference完成加载、输入张量、取回结果三步,无需关心底层CPU与NPU的差异。
- // ai/OnDeviceModel.ets —— 端侧自定义模型三步走
- import { inference } from '@ohos.ai.inference';
- export class OnDeviceModel {
- private session?: inference.ModelSession;
- // 第一步:加载模型(建议在 Ability 启动阶段预加载,避免首次推理卡顿)
- async load(context: Context): Promise<void> {
- const config: inference.ModelConfig = {
- modelName: 'mobilenetv2.ms',
- deviceType: inference.DeviceType.NPU // 优先 NPU,失败自动回退 CPU
- };
- this.session = await inference.loadModel(context, config);
- }
- // 第二步 + 第三步:输入张量 → 取回结果
- async classify(tensor: inference.Tensor): Promise<string[]> {
- if (!this.session) { return []; } // 未加载成功 → 走兜底
- const out: inference.Tensor = await this.session.infer(tensor);
- return this.decodeLabels(out); // 标签解码
- }
- private decodeLabels(t: inference.Tensor): string[] { return []; }
- }
复制代码
两个工程细节决定成败。其一,模型预加载放在AbilityStage启动阶段,避免用户首次点击时等待;其二,NPU优先、CPU兜底,NPU路径的推理时延通常是CPU路径的数分之一。量化后的模型体积可从数百MB压至几MB,且准确率保持95%以上,这让“每个功能都带一点智能”在资源上成为可能。
六、工程纪律:安全、性能与可维护
凭证安全:云端模型API Key严禁硬编码在.ets中,应经@ohos.security.cryptoFramework加密后存入Preferences,或全部收口到自建网关。
推理性能:优先NPU设备路径;输入张量在进入推理前完成尺寸归一化,避免在推理线程内做图像解码。
隐私边界:端侧路径的数据全程不出设备,是合规与体验的双重优势;需要上云的内容务必在服务层做脱敏,并在UI上明示“云端处理”。
版本对齐:各Kit起始API不同(12、15、20),工程compatibleSdkVersion升级到API 26后应统一盘点可用能力,低版本设备在服务层判断并降级。
可观测:给每次AI调用打上source标签(onDevice、cloud、fallback)并上报埋点。端云占比是后续优化路由策略最直接的数据依据。
七、小结
AI与功能融合的成熟标志,不是界面上有多少个AI按钮,而是用户在正常使用功能时察觉不到AI的存在,却在每一步都得到更聪明、更确定的结果。HarmonyOS 7.0的Kit体系把智能拆成意图、能力、模型三层接缝,开发者要做的是选对接缝、守住“增量不侵入”的架构纪律,并用端云协同与降级兜底把确定性交给用户。当端侧推理与云端智能成为每个功能的默认选项而非独立卖点,融合才算真正完成。 |