在鸿蒙生态中,应用智能化远不止在界面塞一个聊天框接大模型。真正有价值的智能化,是让系统级AI能力、云端大模型和意图框架协同工作,让用户无需手动打开应用就能完成操作。本文以完整实现的「智慧收据管家」为例,拆解如何利用Core Vision Kit端侧OCR、阿里百联多模态大模型(qwen-vl-plus)以及意图框架(Intent Framework)来实现拍小票记账功能。
一、为什么选“拍小票记账”作为智能化载体
这个场景恰好触及系统AI与云端大模型的边界:文字提取是系统端侧OCR的强项(离线、隐私好),但语义理解(如判断“金龙鱼”属于餐饮还是购物)则是多模态大模型的长处。同时,记账有高频、低认知负担诉求,适合用意图框架让语音助手直接调度。
二、第一层:系统AI能力——Core Vision Kit端侧OCR
鸿蒙的Core Vision Kit内置通用OCR,运行在设备本地,不联网、图片不出设备。调用链路简化为:图片→PixelMap→文字识别→释放资源。注意必须将图片转为RGBA_8888格式的PixelMap,且显式调用source.release()避免内存堆积。示例代码封装在VisionService中:- import { textRecognition } from '@kit.CoreVisionKit';
- import { image } from '@kit.ImageKit';
- export interface OcrResult {
- ok: boolean;
- text: string;
- error: string;
- }
- export class VisionService {
- static async uriToPixelMap(uri: string): Promise<image.PixelMap | null> {
- try {
- const source = image.createImageSource(uri);
- const pm = await source.createPixelMap({
- desiredPixelFormat: image.PixelMapFormat.RGBA_8888
- });
- source.release();
- return pm;
- } catch (e) {
- return null;
- }
- }
- static async recognize(pm: image.PixelMap): Promise<OcrResult> {
- try {
- const visionInfo: textRecognition.VisionInfo = { pixelMap: pm };
- const config: textRecognition.TextRecognitionConfiguration = {
- isDirectionDetectionSupported: false
- };
- const result = await textRecognition.recognizeText(visionInfo, config);
- const fullText: string = result.value;
- if (fullText.trim().length === 0) {
- return { ok: false, text: '', error: '未识别到文字,请重拍或手动输入' };
- }
- return { ok: true, text: fullText, error: '' };
- } catch (e) {
- return { ok: false, text: '', error: '文字识别失败,模拟器可能不支持OCR,建议真机运行' };
- }
- }
- }
复制代码 推荐使用系统Picker获取图片(`photoAccessHelper.PhotoViewPicker`)而非申请完整权限,实现最小权限。Core Vision Kit返回的是原始文本,需要自己解析。例如提取金额时使用关键词定位加多级兜底策略:先找“合计/应付/实付”等关键词所在行,再从中提取数字;若失败则取全文最后一个带¥/¥的数字。
三、第二层:云端大模型协同——多模态模型补足语义短板
端侧OCR无法处理语义分类,因此接入阿里百联的qwen-vl-plus多模态模型。图片通过Base64编码内嵌到请求中,利用鸿蒙的`util.Base64Helper`同步编码小体积图片。构造OpenAI兼容格式的content数组,包含image_url和text。提示词要求模型只输出结构化JSON,并限定分类枚举集合(餐饮、交通、购物等)。解析层使用“截取首尾大括号”技巧过滤模型偶尔输出的markdown包裹,每个字段用??默认值兜底。
真实案例:同一张小票(应付166.77元),AI识别为16677,因为热敏打印的小数点极小,模型将其忽略。这印证了“置信度”字段只是模型自我评估,最终必须交给人审——应用中的结果可编辑修正正是为此设计。
四、第三层:意图框架——让语音助手直接调度记账
default export class ReceiptIntentExecutor extends InsightIntentExecutor {
async onExecuteInUIAbilityForegroundMode(
name: string,
param: Record<string, Object>,
pageLoader: object
): Promise<insightIntent.ExecuteResult> {
let message = '';
if (name === 'QueryMonthSpending') {
message = await this.doQueryMonth();
} else {
message = await this.doAdd(param);
}
AppStorage.setOrCreate('lastIntentMsg', message);
AppStorage.setOrCreate('intentTick', Date.now());
return { code: 0, result: { message: message } } as insightIntent.ExecuteResult;
}
}
[/code]
意图执行器与UI不在同一生命周期,通过AppStorage跨上下文传递信息。为离线验证意图解析逻辑,应用内提供“模拟语音触发”入口,输入自然语言(如“记一下打车35元”)后本地关键词匹配解析参数并完成记账。本地规则匹配几乎零延迟,适合语音场景。
五、总结
鸿蒙应用智能化应遵循“确定性强、成本低的系统能力优先;大模型补足模糊地带;意图框架让能力被系统发现”的工程原则。端侧OCR+云端多模态+意图框架三层组合,既保证了隐私和离线可用性,又提供了语义理解的灵活性,最终实现“拍小票记账”的流畅体验。任何AI接入都应设计为“建议+确认”的协同模式,而不是自动化黑盒。 |