HarmonyOS 6.1 AI深度融合:从“功能”到“智能”的大模型落地
系列智能化篇·第47篇。全场景篇后有产品经理问“现在的电商Demo功能齐全了但感觉还是‘死’的。能不能接入AI让它像真人客服一样聊天或者自动生成商品文案” 这正是生成式AIGenAI带来的变革。今天我们将电商Demo升级为“AI电商助手”深度集成华为盘古大模型及MindSpore Lite端侧推理实现智能客服对话、商品图文生成、个性化推荐、图像识别搜索。我们将解决大模型体积大、推理慢、隐私保护三大落地难题。全程基于API23含官方文档未涉及的“端云协同推理架构”和“Prompt工程优化”技巧。一、前言为什么端侧AI是鸿蒙的“王炸”云端大模型如ChatGPT虽强但存在延迟高、隐私泄露、断网不可用的问题。鸿蒙的端云协同AI架构给出了完美答案端侧负责实时性要求高、隐私敏感的任务如键盘输入预测、本地相册识别使用轻量化模型MindSpore Lite。云侧负责复杂推理、知识问答如盘古大模型通过安全隧道传输数据。协同端侧预处理云侧深度推理端侧后处理兼顾效果与效率。今天我们将把AI能力植入电商Demo的每一个毛孔让它从“工具”进化为“助手”。二、核心概念辨析传统算法 vs 大模型维度传统算法 (ML/DL)大语言模型 (LLM)能力​单一任务分类、回归通用任务理解、生成、推理数据​需要大量标注数据训练预训练Few-shot学习少量样本即可交互​输入特征输出结果自然语言对话多轮交互泛化​泛化能力弱换场景需重训泛化能力强适应新场景资源​轻量适合端侧庞大通常需云侧支持三、代码实现从“功能”到“智能”3.1 集成盘古大模型智能客服使用AGC的GenAI Kit调用盘古大模型实现电商场景的智能客服。创建entry/src/main/ets/ai/PanguChatService.etsimport { genAi } from hw-agconnect/genai import { BusinessError } from kit.BasicServicesKit export interface ChatMessage { role: user | assistant | system content: string } export class PanguChatService { private chatSession: genAi.ChatSession | null null private systemPrompt: string 你是一个专业的电商智能助手名为“鸿蒙购物助手”。 你的任务是帮助用户查找商品、解答售后问题、提供购物建议。 请遵循以下规则 1. 回答简洁明了不超过100字。 2. 如果不知道答案请诚实告知不要编造。 3. 优先推荐平台内的商品。 4. 语气友好使用表情符号增加亲和力。 5. 当前平台主打电子产品特别是华为鸿蒙生态产品。 /** * 初始化聊天会话 */ async init(): Promisevoid { try { // 1. 配置大模型参数 const config: genAi.SessionConfig { modelName: pangu-nlp-3.0, // 盘古NLP大模型 temperature: 0.7, // 控制随机性越低越确定 maxTokens: 200, // 最大输出长度 topP: 0.9, systemPrompt: this.systemPrompt } // 2. 创建聊天会话 this.chatSession await genAi.createChatSession(config) console.log(盘古大模型会话初始化成功) } catch (err) { console.error(初始化失败:, err) } } /** * 发送消息并获取回复 */ async sendMessage(userInput: string): Promisestring { if (!this.chatSession) { await this.init() } try { // 1. 构建消息历史实际应用中需维护完整的对话历史 const messages: ChatMessage[] [ { role: user, content: userInput } ] // 2. 调用大模型 const response await this.chatSession.sendMessage(messages) // 3. 提取回复内容 const reply response.getContent() console.log(AI回复:, reply) return reply } catch (err) { console.error(发送消息失败:, err) return 抱歉AI助手暂时无法响应请稍后再试。 } } /** * 流式对话打字机效果 */ async sendMessageStream( userInput: string, onChunk: (chunk: string) void, onComplete: () void ): Promisevoid { if (!this.chatSession) { await this.init() } try { const messages: ChatMessage[] [ { role: user, content: userInput } ] // 使用流式接口 const stream this.chatSession.sendMessageStream(messages) stream.on(data, (chunk: genAi.StreamChunk) { const text chunk.getText() onChunk(text) }) stream.on(end, () { console.log(流式对话结束) onComplete() }) stream.on(error, (err: BusinessError) { console.error(流式对话错误:, err) onChunk(抱歉对话出错。) onComplete() }) } catch (err) { console.error(启动流式对话失败:, err) onChunk(抱歉AI助手暂时无法响应。) onComplete() } } /** * 清理会话资源 */ destroy(): void { if (this.chatSession) { this.chatSession.destroy() this.chatSession null } } }3.2 端侧图像识别拍照搜商品使用MindSpore Lite在端侧运行轻量化图像识别模型实现拍照搜商品。创建entry/src/main/ets/ai/ImageSearchEngine.etsimport { mindSporeLite } from kit.MindSporeLiteKit import { image } from kit.ImageKit import { fileIo } from kit.CoreFileKit export class ImageSearchEngine { private model: mindSporeLite.Model | null null private labels: string[] [] /** * 加载模型和标签 */ async loadModel(): Promisevoid { try { // 1. 加载模型文件.ms模型 const modelPath ${getContext().filesDir}/mobilenet_v2.ms // 注实际项目中需将模型文件放入rawfile目录并复制到沙箱 await this.copyModelToSandbox() // 2. 创建MSContext const context new mindSporeLite.Context() context.target [cpu] // 使用CPU推理也可配置GPU/NPU context.cpuThreadPoolNum 4 // 线程数 context.cpuPowerMode mindSporeLite.CpuPowerMode.BIG_CORES_FIRST // 3. 加载模型 this.model await mindSporeLite.Model.createFromFile(modelPath, context) // 4. 加载标签文件 const labelPath ${getContext().filesDir}/labels.txt const labelContent fileIo.readTextSync(labelPath) this.labels labelContent.split(\n).map(line line.trim()) console.log(图像识别模型加载成功标签数:, this.labels.length) } catch (err) { console.error(模型加载失败:, err) } } /** * 复制模型文件到沙箱 */ private async copyModelToSandbox(): Promisevoid { const resourceManager getContext().resourceManager const modelData await resourceManager.getRawFileContent(mobilenet_v2.ms) const labelData await resourceManager.getRawFileContent(labels.txt) const modelPath ${getContext().filesDir}/mobilenet_v2.ms const labelPath ${getContext().filesDir}/labels.txt fileIo.writeSync(fileIo.openSync(modelPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE_ONLY), modelData) fileIo.writeSync(fileIo.openSync(labelPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE_ONLY), labelData) } /** * 识别图片并返回最可能的商品类别 */ async recognizeImage(imagePixelMap: image.PixelMap): Promise{ label: string, confidence: number }[] { if (!this.model) { await this.loadModel() } try { // 1. 图像预处理 const tensor await this.preprocessImage(imagePixelMap) // 2. 创建输入张量 const inputs: mindSporeLite.Tensor[] [tensor] // 3. 执行推理 const outputs await this.model!.predict(inputs) // 4. 后处理解析结果 const results this.postprocessOutputs(outputs) return results.slice(0, 5) // 返回前5个最可能的结果 } catch (err) { console.error(图像识别失败:, err) return [] } } /** * 图像预处理缩放、归一化、格式转换 */ private async preprocessImage(pixelMap: image.PixelMap): PromisemindSporeLite.Tensor { // 1. 缩放到模型输入尺寸 (224x224) const scaleOptions: image.ScalingOptions { size: { height: 224, width: 224 } } const scaledPixelMap await image.createPixelMap(pixelMap, scaleOptions) // 2. 读取像素数据 const pixelBytes await scaledPixelMap.readPixelsToBuffer() // 3. 转换为Tensor (NHWC格式float32) const tensor mindSporeLite.Tensor.create([1, 224, 224, 3], mindSporeLite.DataType.FLOAT32) // 4. 归一化处理 (像素值 / 255.0) const floatData new Float32Array(1 * 224 * 224 * 3) for (let i 0; i pixelBytes.length; i 4) { const r pixelBytes[i] / 255.0 const g pixelBytes[i 1] / 255.0 const b pixelBytes[i 2] / 255.0 // 跳过alpha通道 floatData[(i / 4) * 3] r floatData[(i / 4) * 3 1] g floatData[(i / 4) * 3 2] b } tensor.setData(floatData.buffer) return tensor } /** * 后处理解析输出张量匹配标签 */ private postprocessOutputs(outputs: mindSporeLite.Tensor[]): { label: string, confidence: number }[] { const outputTensor outputs[0] const data new Float32Array(outputTensor.getData()) // Softmax计算概率 const expData data.map(x Math.exp(x)) const sumExp expData.reduce((a, b) a b, 0) const probabilities expData.map(x x / sumExp) // 创建索引-概率对并排序 const results probabilities .map((prob, index) ({ label: this.labels[index] || 未知类别_${index}, confidence: prob })) .sort((a, b) b.confidence - a.confidence) return results } }3.3 AI生成商品文案使用大模型的生成能力为商品自动生成营销文案。export class ProductCopywriter { private panguService: PanguChatService constructor() { this.panguService new PanguChatService() this.panguService.init() } /** * 生成商品标题 */ async generateTitle(productName: string, features: string[]): Promisestring { const prompt 请为以下商品生成一个吸引人的电商标题要求 1. 包含核心关键词${productName} 2. 突出卖点${features.join(、)} 3. 长度控制在20字以内 4. 使用感叹号或emoji增加吸引力 示例华为FreeBuds Pro 3 → 华为FreeBuds Pro 3静谧通话无损音质 return await this.panguService.sendMessage(prompt) } /** * 生成商品描述 */ async generateDescription(productName: string, specs: Recordstring, string): Promisestring { const specStr Object.entries(specs).map(([k, v]) ${k}: ${v}).join() const prompt 请为商品${productName}撰写一段详细的电商描述规格参数${specStr}。 要求 1. 分段落每段一个小标题。 2. 语言生动突出用户体验。 3. 包含使用场景建议。 4. 字数在200字左右。 return await this.panguService.sendMessage(prompt) } /** * 生成社交媒体短文案 */ async generateSocialMediaPost(productName: string, platform: weibo | xiaohongshu): Promisestring { const prompt 请为商品${productName}生成一条适合${platform}发布的文案。 ${platform xiaohongshu ? 要求包含emoji使用小红书风格的语言添加相关话题标签。 : } ${platform weibo ? 要求简洁有力包含热门话题适合转发。 : } return await this.panguService.sendMessage(prompt) } }3.4 端云协同架构设计一个高效的端云协同推理流程。export class AICoordinator { private cloudService: PanguChatService private edgeEngine: ImageSearchEngine private cache: Mapstring, any new Map() constructor() { this.cloudService new PanguChatService() this.edgeEngine new ImageSearchEngine() } /** * 端云协同推理智能问答 */ async hybridChat(userQuery: string): Promisestring { // 1. 端侧意图识别快速过滤 const intent await this.classifyIntent(userQuery) if (intent image_search) { // 2. 如果是图像搜索直接在端侧处理 return 请拍摄商品照片我将为您搜索相似商品。 } else if (intent simple_faq) { // 3. 简单FAQ使用端侧小模型 return await this.answerWithEdgeModel(userQuery) } else { // 4. 复杂问题调用云端大模型 return await this.cloudService.sendMessage(userQuery) } } /** * 端侧意图分类简化版 */ private async classifyIntent(query: string): Promisestring { const keywords { image_search: [拍照, 图片, 识别, 这是什么], simple_faq: [多少钱, 在哪买, 营业时间, 退货政策] } for (const [intent, words] of Object.entries(keywords)) { if (words.some(word query.includes(word))) { return intent } } return complex_query } /** * 使用端侧小模型回答问题模拟 */ private async answerWithEdgeModel(query: string): Promisestring { const faq: Recordstring, string { 多少钱: 商品价格请查看详情页不同配置价格不同哦~, 在哪买: 您可以在华为商城、京东、天猫官方旗舰店购买。, 退货政策: 支持7天无理由退货1年质保服务。 } for (const [question, answer] of Object.entries(faq)) { if (query.includes(question)) { return answer } } return 这个问题有点难让我问问云端专家... } }四、踩坑记录官方文档没写的AI落地细节模型转换的“暗坑”MindSpore Lite支持的模型格式是.ms通常需要将PyTorch/TensorFlow模型通过converter_lite工具转换。转换时要注意算子支持度有些复杂算子可能不支持需要替换或修改模型结构。端侧推理的内存爆炸在手机端加载大模型即使是轻量版也会占用大量内存。如果同时加载多个模型如OCR图像识别NLP极易触发OOM。解决方案使用懒加载按需加载模型及时调用model.destroy()释放资源使用NAPI将推理放在Native层减少JS堆压力。Prompt工程的“玄学”大模型的输出质量极度依赖Prompt的设计。同样的请求不同的Prompt模板效果天差地别。经验给AI设定明确的角色Role、任务Task、约束Constraints和示例Examples。比如“你是一个专业的电商文案专家请用小红书风格写一段文案要求包含emoji不超过100字”。流式输出的UI卡顿使用流式对话打字机效果时如果每次收到一个字符就更新UI高频刷新会导致UI线程阻塞。解决方案使用节流Throttle每积累一定长度的文本如10个字符或每隔一定时间如50ms更新一次UI或者使用TaskPool将字符串拼接放在后台线程。隐私合规红线AI涉及大量用户数据聊天记录、图片。必须明确告知用户数据用途并提供撤回同意和数据删除的入口。对于端侧AI强调“数据不出端”对于云侧AI使用匿名化和脱敏技术并遵守GDPR等法规。

相关新闻

18650电池片定制实力企业

18650电池片定制实力企业

找18650电池片定制,为何实力企业是品质的“压舱石”?在新能源浪潮席卷全球的今天,18650电池片作为动力与储能的基石,其定制化需求正变得前所未有的旺盛。从智能小家电到电动工具,从便携式储能到精密仪器,一…

2026/9/27 13:51:28 阅读更多 →
Dear ImGui即时模式GUI:C++桌面应用高效开发实战指南

Dear ImGui即时模式GUI:C++桌面应用高效开发实战指南

1. Dear ImGui项目概述与核心价值如果你是一名C开发者,正在为桌面应用、工具软件或者游戏编辑器寻找一个轻量、高效且易于集成的即时模式图形用户界面库,那么Dear ImGui几乎是你绕不开的选择。我第一次接触它是在一个需要快速迭代内部工具的项目中&#…

2026/9/28 1:04:41 阅读更多 →
2026学生耐用行李箱推荐:开学季不踩坑,热门行李箱横评对比

2026学生耐用行李箱推荐:开学季不踩坑,热门行李箱横评对比

前言:那些年被行李箱支配的恐惧开学季拖着行李箱赶高铁、挤地铁,结果轮子卡在瓷砖缝里纹丝不动;好不容易挤上车,箱子在斜坡上溜走差点砸到人;托运回来发现箱角裂了、拉链崩了——这些场景,相信不少学生党都…

2026/9/26 0:45:01 阅读更多 →

最新新闻

基于springboot + vue人力资源管理系统(源码+数据库+文档)

基于springboot + vue人力资源管理系统(源码+数据库+文档)

人力资源管理系统 目录 基于springboot vue人力资源管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue人力资源管理系统 一、前言 博主介绍&…

2026/10/4 14:52:41 阅读更多 →
第29章:RAGFlow Kubernetes/Helm 部署与弹性扩缩容

第29章:RAGFlow Kubernetes/Helm 部署与弹性扩缩容

1 项目背景 业务场景 「云帆科技」的 Docker Compose 单机部署已经支撑了 500 人三个月的使用。但随着业务量增长,单机的资源瓶颈逐渐显现——32GB 内存已被占满 85%,而且每逢周一早高峰(全员集中问答),CPU 飙到 95%…

2026/10/4 14:52:41 阅读更多 →
从零搭建AI Native系统:架构设计、模型选型与实战避坑指南

从零搭建AI Native系统:架构设计、模型选型与实战避坑指南

AI Native 这个词这两年出现的频率越来越高,但真正动手从零搭一套以 AI 为核心的系统时,很多人还是会不自觉地退回到传统架构的老路——先把业务逻辑写死,再在旁边挂一个模型调用接口,美其名曰"AI 赋能"。这种做法本质上…

2026/10/4 14:52:40 阅读更多 →
计算机网络协议栈实战:从PDF习题到Mininet实验

计算机网络协议栈实战:从PDF习题到Mininet实验

简介:本资源是一份面向计算机网络初学者与备考人员的权威习题集,聚焦网络基础核心概念与安全相关协议原理,适用于高校课程复习、软考/思科认证入门及网络安全岗位岗前训练。文件为单个PDF文档(862KB),内容结…

2026/10/4 14:52:40 阅读更多 →
ESP32芯片与模组选型指南:从原型到量产的成本与射频设计

ESP32芯片与模组选型指南:从原型到量产的成本与射频设计

1. 从一次选型翻车说起:ESP32芯片和模组到底差在哪 前阵子帮一个做智能硬件的朋友看方案,他拿着原理图问我:“我明明选了 ESP32,怎么采购说这个料号买不到?是不是被坑了?”我一看图纸,他画的是裸…

2026/10/4 14:52:40 阅读更多 →
插件系统从原理到实战:加载机制、报错排查与插件开发指南

插件系统从原理到实战:加载机制、报错排查与插件开发指南

做开发这些年,plugins这个英文单词我几乎每天都要见到十几次。从 IDE 到播放器,从构建工具到 CI/CD 平台,但凡稍微有点规模的软件,都在往“插件化”的方向走。你搜索 plugins,大概率要么是被某个failed to load plugin…

2026/10/4 14:51:40 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →