【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;
}

后续如果接入更强的端侧模型,可以把“错题分类 + 收藏内容 + 学习天数 + 搜索关键词”一起作为输入,生成更自然的学习建议。但第一版不建议太复杂,先从可解释规则开始。

五、人脸识别开放能力:适合保护隐私页,而不是替代所有操作

这个项目目前不需要登录,也不应该强制人脸识别。但有几个页面可以考虑“可选保护”:

  • 学习统计。
  • 错题本。
  • 收藏夹。
  • 成就记录。

因为这些页面能反映用户的学习状态,如果设备多人共用,用户可能希望加一层保护。

推荐交互是:

  1. 默认不启用。
  2. 用户在设置中主动开启“保护学习数据”。
  3. 进入学习统计或错题本时触发系统认证。
  4. 认证通过后展示内容。
  5. 认证失败时只展示空状态或返回。

伪代码结构如下:

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
学习连续天数 连续学习天数 打开学习统计

比如“每日一题”入口可以只展示:

  • 今日题目。
  • 难度标签。
  • 开始答题按钮。

不要把完整选项、解析、收藏、成就都塞进去,否则元服务就失去了轻量价值。

八、和实况窗联动:挑战中展示进度,结束后回流报告

上一篇文章中提到,限时挑战适合接入实况窗。它也可以和元服务形成闭环:

  1. 元服务入口打开每日题。
  2. 用户开始限时挑战。
  3. 实况窗展示剩余时间和进度。
  4. 挑战结束后回到 App 内展示结果。
  5. 成就系统记录答题数据。

项目中限时挑战已经有状态:

@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 来说,最好的智能化不是替用户学习,而是帮助用户更快找到薄弱点、更轻松地坚持下去。🌟

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐