作者:张大鹏 | 大鹏AI教育 | 2026-05-21
标签:
HarmonyOS端侧AIGCRAGData Augmentation Kit隐私计算

阅读提示
HarmonyOS 6 把端侧 AI 从「聊天 Demo」推进到「可进 App 的 Kit 级能力。Data Augmentation Kit 提供知识加工、向量检索、RAG 问答和端侧问答模型------数据不出设备,适合企业 FAQ、邮件助手、内部文档检索。
我在 DevEco Studio + API 20 真机上跑了一轮最小 RAG 链路。这篇只讲实测:权限怎么配、首帧为什么慢、三层架构怎么拆、踩了哪些坑。
1. Data Augmentation Kit 是什么
一句话:把本地文档变成可检索、可问答的端侧知识库,全程不依赖云端推理。
官方能力拆成三层:
| 层 | 职责 | 实测体感 |
|---|---|---|
| 知识加工 | 文档切片 → Embedding → 写入向量库 + 倒排索引 | 首次建库最耗时,CPU/GPU/NPU 占用明显 |
| 知识检索 | 多路召回 + 重排序 | 单次检索 200--800ms(视库大小) |
| 知识问答 | Prompt 组装 → 端侧 LLM 流式生成 | 首 token 延迟取决于模型加载状态 |

默认端侧问答模型为 Qwen2.5-7B-Instruct 量级(以官方文档为准),目前主要面向 PC / 2in1 设备------手机端能力边界要以当前 SDK Release Notes 为准,别按宣传稿假设全机型一致。
2. 实测环境与方法
| 项 | 配置 |
|---|---|
| 系统 | HarmonyOS 6.0(API 20) |
| IDE | DevEco Studio 5.x |
| 测试数据 | 52 篇 Markdown FAQ,合计约 180KB |
| 指标 | 建库耗时、首帧问答延迟、权限弹窗行为、断网可用性 |
测试流程:
导入文档 → 触发知识加工 → 创建 RAG Session → 发起流式问答 → 记录 hilog 时间戳
3. 权限:比想象中多一层
端侧 AIGC 不是「加个依赖就能跑」。实测涉及以下权限域:
| 权限/能力 | 用途 | 踩坑 |
|---|---|---|
| 文件读写 | 导入本地文档、持久化向量库 | 沙箱路径与 rawfile 路径混淆 |
| AI 模型推理 | Embedding + LLM 推理 | 首次调用需下载/加载模型包 |
| 网络(可选) | 仅模型首次下载 | 断网后推理不受影响,但无法更新模型 |
module.json5 中务必声明 AI 相关权限,并在 UI 层给用户明确说明「文档不上传云端」------这在企业内推时是合规刚需,不是文案装饰。
json
{
"requestPermissions": [
{ "name": "ohos.permission.READ_MEDIA", "reason": "$string:read_doc_reason" },
{ "name": "ohos.permission.INTERNET", "reason": "$string:model_download_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } }
]
}
实测结论:权限弹窗文案写不清楚,内测用户会直接关掉 AI 功能;建议首屏加一句「所有问答在本地完成,不上传服务器」。

4. 首帧耗时:冷启动 vs 热启动差一个数量级
这是本次实测最有价值的数字。
4.1 建库阶段(知识加工)
| 阶段 | 冷启动(首次) | 热启动(库已存在) |
|---|---|---|
| 52 篇文档切片 + Embedding | ~95s | ~3s(增量 5 篇) |
| 向量库 + 倒排索引写入 | ~12s | ~1s |
| 合计 | ~107s | ~4s |
首次建库慢,主要卡在 Embedding 模型加载 + 批量向量化。UI 必须给进度条,否则用户以为 App 卡死。
4.2 问答阶段(RAG Session)
| 指标 | 冷启动(App 刚启动) | 热启动(Session 已创建) |
|---|---|---|
| LLM 模型加载 | ~8.2s | ~0s(已在内存) |
| 检索 + Prompt 组装 | ~0.6s | ~0.4s |
| 首 token 延迟 | ~9.1s | ~1.2s |
| 完整回答(200 token) | ~18s | ~6s |

关键发现:
- 首帧 9 秒 在 Demo 里能接受,在正式 App 里不行------必须做 Session 预热或后台预加载
- 断网状态下,热启动问答完全可用,验证了「数据不出端」承诺
- 库超过 500 篇后,检索延迟线性上升,需要分层索引或分区策略
4.3 优化建议(实测有效)
| 策略 | 效果 |
|---|---|
| App 启动时后台预创建 RAG Session | 首帧从 9s 降到 1--2s |
| 知识加工放 Worker 线程 | UI 不阻塞,可显示进度 |
| 文档增量更新而非全量重建 | 热更新从 107s 降到 4s |
| 限制单次检索 topK | topK=3 比 topK=10 快 ~40% |
5. 最小 RAG 链路代码拆解
以官方示例为骨架,实测跑通的核心调用顺序:
typescript
// 1. 知识加工 --- 导入文档并建库
import { dataAugmentation } from '@kit.DataAugmentationKit';
const processor = dataAugmentation.createKnowledgeProcessor();
await processor.importDocuments([
{ path: '/data/storage/el2/base/files/faq/', type: 'markdown' }
]);
await processor.buildIndex(); // 耗时大头在这里
// 2. 创建 RAG Session
const session = dataAugmentation.createRAGSession({
knowledgeBaseId: processor.getBaseId(),
modelConfig: { streaming: true }
});
// 3. 流式问答
session.query('如何重置密码?', {
onToken: (token: string) => { this.answerText += token; },
onComplete: () => { hilog.info(DOMAIN, TAG, 'RAG complete'); },
onError: (err: Error) => { hilog.error(DOMAIN, TAG, 'RAG error: %{public}s', err.message); }
});
hilog 时间戳打点示例:
typescript
const t0 = Date.now();
await processor.buildIndex();
hilog.info(DOMAIN, TAG, 'buildIndex: %{public}d ms', Date.now() - t0);
6. 踩坑清单
| # | 现象 | 根因 | 修复 |
|---|---|---|---|
| 1 | 建库 0% 不动 | 文档路径在沙箱外 | 先 copy 到 filesDir 再导入 |
| 2 | 问答返回空 | 检索 topK=0 或索引未 build | 检查 buildIndex() 返回值 |
| 3 | 首帧 15s+ | 冷启动 + 大模型未预热 | Session 预创建 |
| 4 | 流式输出乱码 | 未按 token 拼接,一次性 setState | 用 @State 增量追加 |
| 5 | 内存 OOM | 一次导入 1000+ 大 PDF | 分批导入 + 队列控制 |
7. 小结
Data Augmentation Kit 把端侧 RAG 从概念变成了可集成的 Kit。实测三点结论:
- 权限与合规文案 是内推第一道关,不是技术关
- 首帧耗时 冷/热差一个数量级,必须预热 Session
- 建库策略 决定后续体验------增量更新比全量重建实用得多
端侧 AIGC 进 App,工程化比模型选型更重要。
下一步你可以这样做
- 在 DevEco 创建 API 20+ 工程,引入 Data Augmentation Kit
- 准备 50 条以内 Markdown FAQ,跑通
importDocuments → buildIndex → createRAGSession → query全链路 - 用 hilog 记录 建库耗时 和 首 token 延迟,对照上表做 Session 预热
- 断网状态下验证问答可用性,截图留作合规材料
有同学在 HarmonyOS 端侧 RAG 工程里踩过坑,欢迎评论区贴 建库耗时 和 设备型号------我帮你对照官方 Release Notes 看是不是机型能力边界问题。
参考:HarmonyOS 开发者社区 Data Augmentation Kit 文档 · 鸿蒙 6.0 端侧问答模型技术栈 · 知识加工 C 接口解析