【OpenHarmony/HarmonyOs 】端侧 AI 与元服务思路:数学视界的人脸识别开放能力、智能练习与轻量化入口设计

项目类型:OpenHarmony / HarmonyOS ArkTS 数学学习应用
文章主题:人脸识别开放能力、端侧 AI、元服务能力集成
说明:当前项目没有直接接入人脸识别或云端 AI,本文重点分享“如何基于现有项目结构设计可扩展方案” 🧠

一、先说结论:学习应用不一定要上来就做人脸识别

“人脸识别开放能力、端侧 AI、元服务”这些词听起来都很强,但落到数学学习 App 上,不能为了接能力而接能力。

对数学视界来说,更合理的路线是:

  1. 先把端侧学习数据组织好;
  2. 用本地规则实现“智能练习”和“学习反馈”;
  3. 在需要保护个人学习数据时,再考虑系统级用户认证;
  4. 把最高频、最轻量的学习入口改造成元服务能力。

也就是说,人脸识别不是用来“识别学生是谁并上传数据”,而更适合用于本地敏感入口保护,例如:

  • 打开个人学习报告前做本机认证;
  • 查看长期学习统计前做认证;
  • 导出学习数据前做认证;
  • 家长模式或教师模式切换前做认证。

端侧 AI 也不一定等于大模型。对一个数学学习工具来说,基于本地答题数据做题目推荐、知识点掌握度分析,就是非常实用的端侧智能。

二、项目当前的智能基础:挑战结果与掌握度统计

数学视界的挑战答题并不是简单判断对错,它会记录挑战次数、题目数量、正确数量、耗时、最好成绩、连续通过次数、掌握年级和掌握知识点。

核心数据结构在 AppState.ets

challengeStats: ChallengeStats = {
  totalChallenges: 0,
  totalQuestions: 0,
  totalCorrect: 0,
  totalTimeSpent: 0,
  averageScore: 0,
  bestScore: 0,
  currentStreak: 0,
  longestStreak: 0,
  masteredGrades: [],
  masteredKnowledge: [],
  recentResults: [],
  categoryStats: {},
}

每次挑战结束后,项目会更新统计:

recordChallengeResult(result: ChallengeResult): void {
  const stats = this.challengeStats
  stats.totalChallenges++
  stats.totalQuestions += result.totalCount
  stats.totalCorrect += result.correctCount
  stats.totalTimeSpent += result.totalTime

  if (result.totalCount > 0) {
    stats.averageScore = Math.round((stats.totalCorrect / stats.totalQuestions) * 100)
  }

  if (result.score > stats.bestScore) {
    stats.bestScore = result.score
  }
}

这就是端侧智能的第一步:先有高质量本地数据。

三、端侧 AI 思路一:用本地规则生成学习建议

项目里已经有知识点正确率计算:

private getKnowledgeCorrectRate(knowledgeId: string): number {
  let total = 0
  let correct = 0
  for (let i = 0; i < this.challengeStats.recentResults.length; i++) {
    const r = this.challengeStats.recentResults[i]
    for (let j = 0; j < r.questions.length; j++) {
      if (r.questions[j].question.knowledgeIds.indexOf(knowledgeId) >= 0) {
        total++
        if (r.questions[j].isCorrect) correct++
      }
    }
  }
  return total > 0 ? correct / total : 0
}

基于这个函数,可以继续做一个本地推荐器:

interface StudySuggestion {
  type: 'review' | 'practice' | 'challenge'
  title: string
  reason: string
  knowledgeId?: string
}

function buildSuggestion(rate: number, knowledgeName: string): StudySuggestion {
  if (rate < 0.6) {
    return {
      type: 'review',
      title: '建议复习 ' + knowledgeName,
      reason: '最近正确率偏低,先看公式和例题会更稳',
    }
  }

  if (rate < 0.8) {
    return {
      type: 'practice',
      title: '继续练习 ' + knowledgeName,
      reason: '已经入门,可以通过 10 题练习巩固',
    }
  }

  return {
    type: 'challenge',
    title: '挑战更高难度',
    reason: '当前知识点掌握较好,可以尝试限时题',
  }
}

这不是大模型,但它很实用:

  • 不需要网络;
  • 不需要上传学习数据;
  • 解释性强;
  • 对低龄学生更可控;
  • 可以直接和现有题库、成就系统结合。

四、端侧 AI 思路二:智能组卷

挑战配置页中,用户可以选择年级、知识点、题目数量、难度、限时:

const config: ChallengeConfig = {
  gradeId: this.selectedGradeId,
  knowledgeIds: this.selectedKnowledgeIds,
  questionCount: questions.length,
  timeLimit: this.timeLimit,
  difficulty: this.selectedDifficulty,
}

现在的组卷逻辑是从题库中筛选并打乱:

let pool: Question[] = getQuestionsByGradeAndKnowledge(this.selectedGradeId, this.selectedKnowledgeIds)
if (this.selectedDifficulty > 0) {
  pool = pool.filter((q: Question): boolean => q.difficulty === this.selectedDifficulty)
}
const questions: Question[] = shuffleQuestions(pool, this.selectedCount)

后续可以升级为“智能组卷”:

  • 最近错得多的知识点提高权重;
  • 太简单的题降低出现概率;
  • 长时间没练的知识点重新加入;
  • 限时模式下优先选择计算量适中的题;
  • 复盘模式下优先展示曾经做错的题。

示意逻辑:

function getQuestionWeight(q: Question, weakKnowledge: string[]): number {
  let weight = 1
  q.knowledgeIds.forEach((kid: string) => {
    if (weakKnowledge.indexOf(kid) >= 0) {
      weight += 2
    }
  })
  if (q.difficulty >= 4) {
    weight += 0.5
  }
  return weight
}

这种端侧 AI 更像“学习策略引擎”。它不需要识别用户照片,也不需要把答案上传到服务器,却能明显提升个性化体验。

五、人脸识别开放能力:更适合做本机认证,而不是业务识别

人脸识别能力在学习 App 中要非常谨慎。我的建议是:不要自己采集和管理人脸图片,不要把人脸模型作为业务数据保存,而是优先使用系统级用户认证能力。

适合接入的场景:

  • 🔐 查看学习报告前认证;
  • 📤 导出学习数据前认证;
  • 👨‍👩‍👧 家长模式切换前认证;
  • 🧾 清空历史记录前认证。

业务层可以先定义一个认证入口,而不是直接把人脸逻辑写进页面:

interface AuthResult {
  success: boolean
  message: string
}

class LocalAuthGuard {
  async verifyBeforeExport(): Promise<AuthResult> {
    // 这里预留系统用户认证能力接入点
    return { success: true, message: '认证通过' }
  }
}

这样后续无论使用人脸、指纹、锁屏密码还是系统统一认证,业务页面都不需要大改。

六、为什么不建议在项目里保存人脸数据?

学习类应用的核心是学习,不是身份系统。自己保存人脸数据会带来很重的责任:

  • 人脸属于高度敏感个人信息;
  • 需要明确采集目的、保存周期和删除方式;
  • 一旦泄露风险极高;
  • 对未成年人场景尤其敏感;
  • 很多学习功能其实不需要人脸识别。

所以更好的设计是:

应用只关心“系统告诉我认证是否通过”,不关心“用户的人脸长什么样”。

这也符合最小化原则:不采集、不保存、不传输,就不会产生额外风险。

七、元服务能力:把高频学习动作做轻

数学视界目前是完整应用形态,包含首页、挑战、成就、收藏、我的、画板、公式、计算器等页面。

如果要做元服务化,我不会把整个应用都塞进去,而是拆出轻量入口:

元服务入口 适合功能 原因
今日一题 每天一道数学题 高频、轻量、可快速完成
公式速查 常用公式卡片 不需要完整 App 路径
单位换算 长度、面积、体积换算 工具属性强
今日目标 查看学习进度 信息短、打开快
错题复习 最近 3 道错题 任务明确

对应到当前项目,很多能力已经有基础:

  • 题库来自 AppState.ets
  • 单位换算已有独立页面;
  • 今日目标来自 studyData.dailyGoaltodayCount
  • 收藏公式已有 FavoriteItem
  • 挑战结果已有 recentResults

元服务不是“缩小版 App”,而是把某个明确任务做到最短路径。

八、从完整应用到元服务的拆分思路

以“今日一题”为例,可以这样拆:

  1. 从本地题库中选一道适合当前年级的题;
  2. 展示题目、选项、提交按钮;
  3. 答完后显示解析;
  4. 更新本地学习统计;
  5. 提供“打开完整应用继续练习”入口。

业务模型可以复用现有 Question

export interface Question {
  id: string
  type: string
  gradeId: string
  knowledgeIds: string[]
  difficulty: number
  title: string
  answer: string
  analysis: string
  createdAt: number
  usageCount: number
  correctRate: number
}

这样元服务和完整应用共享同一套题目结构,后续维护成本会低很多。

九、架构建议:把 AI、认证、元服务都变成可替换模块

如果继续演进,我建议把项目拆出几个服务类:

class StudyInsightService {
  buildSuggestions(): StudySuggestion[] {
    return []
  }
}

class SmartQuestionService {
  pickQuestions(config: ChallengeConfig): Question[] {
    return []
  }
}

class LocalAuthService {
  async verify(reason: string): Promise<boolean> {
    return true
  }
}

class AtomicEntryService {
  getTodayQuestion(): Question {
    return {} as Question
  }
}

这样页面只负责展示和交互,智能推荐、认证、元服务入口都可以独立演进。

十、总结

围绕“人脸识别开放能力、端侧 AI、元服务能力集成”,数学视界可以采用一条比较稳的路线:

  • 🧠 端侧 AI:先基于本地答题数据做掌握度分析和智能组卷;
  • 🔐 人脸识别:只作为系统级本机认证入口,不保存人脸数据;
  • 🚀 元服务:拆出“今日一题、公式速查、单位换算、错题复习”等轻量任务;
  • 📦 架构上:把推荐、认证、元服务拆成独立服务类,避免和页面强耦合;
  • 🛡 隐私上:默认本地处理,敏感能力用户主动触发。

对学习类应用来说,最好的智能不是“看起来用了多少 AI”,而是用户每次打开时,都能更快进入适合自己的学习任务。数学视界的下一步,也会围绕这个方向继续打磨。✨

img

Logo

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

更多推荐