【OpenHarmony/HarmonyOs 】教育 App 新能力探索:人脸识别开放能力、端侧 AI 与元服务集成
【OpenHarmony/HarmonyOs 】教育 App 新能力探索:人脸识别开放能力、端侧 AI 与元服务集成
本文基于 HarmonyOS 化学学习项目「化学视界」展开。当前项目已经实现元素周期表、方程式、知识库、挑战、收藏、错题、成就和学习统计。本文会结合现有代码,讨论如何进一步集成人脸识别开放能力、端侧 AI 和元服务能力,让一个离线学习工具升级为更聪明的全场景学习助手。🧪
一、先明确:这些能力应该服务学习,而不是为了“炫技”
人脸识别、端侧 AI、元服务都是很强的能力,但教育 App 接入时要避免三个误区:
- 为了登录而登录。
- 为了 AI 而上传用户数据。
- 为了元服务而把主 App 体验拆碎。
对「化学视界」来说,合理的方向应该是:
- 🔐 人脸识别:保护学习报告、错题本等隐私页面。
- 🧠 端侧 AI:根据错题和收藏做本地推荐。
- 🧩 元服务:把“每日一题、元素速查、挑战提醒”变成轻量入口。
这些能力的共同原则是:让用户更快进入学习状态,而不是增加使用负担。
二、项目现有基础:端侧数据已经足够做智能推荐
项目目前没有接入云端账号,也没有上传学习行为。但它已经在本地记录了很多有价值的学习数据:
- 查看过多少元素。
- 阅读过多少知识点。
- 收藏了哪些内容。
- 答对/答错了哪些题。
- 连续学习了多少天。
- 解锁了哪些成就。
成就系统的默认统计对象如下:
function getDefaultStatistics(): UserStatistics {
return {
totalEquationsViewed: 0,
totalElementsViewed: 0,
totalKnowledgeRead: 0,
dailyQuizCorrect: 0,
dailyQuizStreak: 0,
totalFavorites: 0,
totalSearches: 0,
visitDates: [],
currentStreak: 0,
unlockedAchievements: []
};
}
这意味着即使不接云端 AI,也能做很多端侧智能能力:
- 推荐用户复习错题。
- 根据收藏推荐相关知识点。
- 根据连续学习天数给出鼓励文案。
- 根据搜索次数判断用户当前关注方向。
- 根据题目分类统计薄弱模块。
这就是教育 App 很适合端侧 AI 的原因:数据量不一定大,但场景足够明确。
三、端侧 AI 方案一:基于错题的本地推荐
项目的错题集只保存题目 id:
export function getWrongQuestions(): QuizQuestion[] {
const list: QuizQuestion[] = [];
readIds().forEach((id: number) => {
const q = quizData.find((x: QuizQuestion) => x.id === id);
if (q) {
list.push(q);
}
});
return list;
}
这为端侧推荐提供了干净的数据源。
比如可以统计错题分类:
function buildWeaknessMap(wrongQuestions: QuizQuestion[]): Record<string, number> {
const map: Record<string, number> = {};
wrongQuestions.forEach((q: QuizQuestion) => {
map[q.category] = (map[q.category] || 0) + 1;
});
return map;
}
然后根据最高频分类给出学习建议:
function getReviewSuggestion(map: Record<string, number>): string {
const sorted = Object.entries(map).sort((a, b) => b[1] - a[1]);
if (sorted.length === 0) {
return '今天没有错题,可以尝试限时挑战。';
}
const [category] = sorted[0];
return `建议优先复习「${category}」相关知识点。`;
}
这其实就是轻量端侧 AI:不一定要上大模型,只要能基于本地数据做推理,就能提升学习效率。📈
四、端侧 AI 方案二:学习路径个性化
收藏数据也可以作为兴趣信号:
export interface FavoriteItem {
id: string;
type: FavoriteType;
title: string;
subtitle: string;
dateAdded: string;
}
如果用户收藏了很多金属元素,可以推荐“金属活动性顺序”“置换反应”等知识点;如果用户收藏了很多燃烧反应,可以推荐氧化还原、实验现象和安全注意事项。
推荐逻辑可以是:
function recommendByFavorites(favorites: FavoriteItem[]): string[] {
const hasElement = favorites.some(item => item.type === 'element');
const hasEquation = favorites.some(item => item.type === 'equation');
const result: string[] = [];
if (hasElement) {
result.push('复习元素周期律与元素性质');
}
if (hasEquation) {
result.push('整理常见反应类型与实验现象');
}
return result;
}
后续如果接入更强的端侧模型,可以把“错题分类 + 收藏内容 + 学习天数 + 搜索关键词”一起作为输入,生成更自然的学习建议。但第一版不建议太复杂,先从可解释规则开始。
五、人脸识别开放能力:适合保护隐私页,而不是替代所有操作
这个项目目前不需要登录,也不应该强制人脸识别。但有几个页面可以考虑“可选保护”:
- 学习统计。
- 错题本。
- 收藏夹。
- 成就记录。
因为这些页面能反映用户的学习状态,如果设备多人共用,用户可能希望加一层保护。
推荐交互是:
- 默认不启用。
- 用户在设置中主动开启“保护学习数据”。
- 进入学习统计或错题本时触发系统认证。
- 认证通过后展示内容。
- 认证失败时只展示空状态或返回。
伪代码结构如下:
async function guardPrivateStudyPage(): Promise<boolean> {
const enabled = AppStorage.get<boolean>('protect_study_data') ?? false;
if (!enabled) {
return true;
}
// 这里接入系统用户认证能力,例如人脸、指纹或锁屏密码
const authPassed = await requestSystemUserAuth();
return authPassed;
}
注意这里说的是“系统用户认证”,不是 App 自己采集和保存人脸。教育类 App 不应该自己做人脸库,也不应该上传人脸图片。
六、元服务能力:把高频学习动作做成轻入口
「化学视界」很适合拆出几个元服务入口:
- 每日一题:打开即答题。
- 元素速查:输入元素符号直接打开详情。
- 错题复习:展示错题数量并一键进入。
- 今日学习:展示连续学习天数和成就进度。
当前题库中已经有每日题逻辑:
syncDailyForCalendarDay(): void {
const today = new Date();
const mo = today.getMonth() + 1;
const da = today.getDate();
const dateKey =
`${today.getFullYear()}-${mo < 10 ? '0' + mo : mo}-${da < 10 ? '0' + da : da}`;
const official = getDailyQuestion();
if (dateKey !== this.lastDailyCalendarKey) {
this.lastDailyCalendarKey = dateKey;
this.dailyQuestion = official;
this.currentDailyId = official.id;
this.viewingOfficialDaily = true;
}
}
这段逻辑特别适合元服务化:用户不需要先打开 App、切到挑战页、再找每日题,而是从系统入口直接进入“今日题目”。
七、元服务入口设计:一定要短、准、轻
元服务不是把完整 App 缩小一份,而是把高频动作抽出来。
建议的入口设计:
| 元服务入口 | 展示内容 | 点击后 |
|---|---|---|
| 每日一题 | 题目分类 + 难度 | 打开每日挑战 |
| 元素速查 | 搜索框/热门元素 | 打开元素详情 |
| 错题复习 | 当前错题数量 | 打开错题 Tab |
| 学习连续天数 | 连续学习天数 | 打开学习统计 |
比如“每日一题”入口可以只展示:
- 今日题目。
- 难度标签。
- 开始答题按钮。
不要把完整选项、解析、收藏、成就都塞进去,否则元服务就失去了轻量价值。
八、和实况窗联动:挑战中展示进度,结束后回流报告
上一篇文章中提到,限时挑战适合接入实况窗。它也可以和元服务形成闭环:
- 元服务入口打开每日题。
- 用户开始限时挑战。
- 实况窗展示剩余时间和进度。
- 挑战结束后回到 App 内展示结果。
- 成就系统记录答题数据。
项目中限时挑战已经有状态:
@State private challengeState: string = 'setup';
@State private currentIndex: number = 0;
@State private remainingSeconds: number = 0;
@State private correctCount: number = 0;
@State private wrongCount: number = 0;
这些状态就是实况窗和元服务联动的基础数据。
九、用户体验边界:AI 和人脸识别都要可关闭
在教育类 App 中,任何智能能力都应该有边界:
- 人脸识别必须可选,不影响基础学习。
- 端侧 AI 推荐必须可解释,不制造焦虑。
- 元服务入口必须轻量,不替代完整 App。
- 学习数据默认本地保存,不默认上传。
- 未成年人场景下不做强刺激排行榜。
可以在设置页新增一个“智能能力”分组:
private smartItems: SettingsItem[] = [
{
icon: '🔐',
title: '保护学习数据',
subtitle: '进入统计和错题前进行系统认证',
action: 'protect'
},
{
icon: '🧠',
title: '端侧学习建议',
subtitle: '根据本地错题和收藏生成复习建议',
action: 'local_ai'
}
];
这能把功能选择权交给用户,而不是默认开启所有能力。
十、总结
基于「化学视界」可以这样规划新能力:
- 🔐 人脸识别开放能力:用于可选保护学习统计、错题和收藏,不自建人脸库。
- 🧠 端侧 AI:基于错题、收藏、成就和搜索记录生成本地学习建议。
- 🧩 元服务能力:把每日一题、元素速查、错题复习做成轻量入口。
- ⏱️ 实况窗联动:让限时挑战在系统层展示实时进度。
- 🛡️ 隐私边界:所有智能能力默认尊重本地优先和用户可控。
这类文章的重点不是堆概念,而是讲清楚:新能力如何进入真实业务场景。对教育 App 来说,最好的智能化不是替用户学习,而是帮助用户更快找到薄弱点、更轻松地坚持下去。🌟

更多推荐


所有评论(0)