基于HarmonyOS的AI简历关键词提取——从对齐到评估的全流程技术实践
基于HarmonyOS的AI简历关键词提取——从对齐到评估的全流程技术实践
一、引言
在当今竞争激烈的求职市场中,一份精心优化的简历是求职者脱颖而出的关键。然而,大量求职者面临一个共同的难题:如何让自己的简历在成百上千份申请中通过ATS(Applicant Tracking System,申请人追踪系统)的初筛,并吸引招聘经理的目光?AI简历关键词提取工具应运而生,它利用人工智能技术,自动分析目标岗位描述(JD),提取关键技能和资质要求,并与求职者简历进行匹配度分析,从而提供精准的优化建议。
本文以HarmonyOS平台上的"AI简历关键词提取"应用为实践案例,详细阐述从需求对齐、架构设计、任务分解、审批确认、自动化执行到最终评估的全流程技术实践。项目源码位于entry/src/main/ets/apps/AI简历关键词提取/目录下,采用ArkTS语言和ArkUI框架进行开发,完整展示了HarmonyOS原生AI应用的标准开发范式。
本博客将深入探讨以下核心内容:
- 对齐阶段:如何将模糊的"做一个简历关键词提取工具"转化为精确的需求规格和验收标准
- 架构阶段:如何设计三层MVVM架构,定义清晰的模块职责和接口契约
- 原子化阶段:如何将开发任务分解为7个可独立执行的原子任务
- 审批阶段:如何建立质量门控机制,确保每个阶段的产出物符合预期
- 自动化执行阶段:如何通过标准化代码模板和规范化流程,高效完成代码实现
- 评估阶段:如何系统化评估项目成果,总结经验教训,规划未来方向

二、对齐阶段(Align)
对齐阶段的目标是将模糊的需求转化为精确的规范。这是整个开发流程的基石,任何在此阶段被忽略的细节都会在后续阶段被放大,导致返工和质量下降。对齐阶段的核心在于"三对齐":与项目上下文对齐、与用户需求对齐、与技术规范对齐。
2.1 项目上下文分析
2.1.1 项目整体架构分析
在开始开发之前,我们首先对现有项目结构进行了全面分析。本项目是一个HarmonyOS AI应用聚合平台,包含多个 AI 应用,覆盖健康生活、工作效率、创意娱乐、学习成长、职业发展五大分类。整体结构如下:
MyApplication/
├── entry/
│ ├── src/main/
│ │ ├── ets/
│ │ │ ├── pages/
│ │ │ │ └── Index.ets # 主入口页面,应用列表
│ │ │ ├── apps/
│ │ │ │ ├── AI简历关键词提取/ # 当前目标应用
│ │ │ │ │ ├── AI简历关键词提取Model.ets
│ │ │ │ │ ├── AI简历关键词提取Service.ets
│ │ │ │ │ ├── AI简历关键词提取Page.ets
│ │ │ │ │ └── BLOG_AI简历关键词提取.md
│ │ │ │ ├── AI简历诊断/
│ │ │ │ ├── AI面试模拟/
│ │ │ │ └── ... (共多个 AI 应用)
│ │ │ ├── entryability/
│ │ │ │ └── EntryAbility.ets # Ability生命周期管理
│ │ ├── resources/
│ │ │ ├── base/profile/
│ │ │ │ └── main_pages.json # 页面路由配置
│ │ │ └── rawfile/apps/
│ │ │ └── apps.json # 应用元信息配置
│ │ └── module.json5 # 模块配置
│ └── oh-package.json5 # 依赖管理
通过分析项目结构,我们可以发现以下关键设计模式:
1. 插件化应用架构
主应用(Index.ets)通过读取apps.json配置文件动态渲染应用网格,每个子应用作为一个独立的页面模块注册在main_pages.json中。这种插件化架构具有以下优势:
- 新增应用无需修改主应用代码
- 各应用之间完全解耦,可以独立开发和测试
- 支持动态加载,减少首屏加载时间
2. 标准化目录结构
每个AI应用统一使用以下目录和文件命名规范:
apps/{应用名称}/
├── {应用名称}Model.ets
├── {应用名称}Service.ets
└── {应用名称}Page.ets
这种标准化的目录结构大大降低了开发者的认知负担,使得开发者可以在不同应用之间快速切换。
3. 统一的路由注册机制
路由注册分为两步:首先在main_pages.json中注册页面路径,然后在apps.json中注册应用的显示信息(图标、标题、分类等)。这种分离设计使得路由管理和UI管理清晰分离。
2.1.2 技术栈深度分析
在明确项目结构后,我们对技术栈进行了深入分析,确保所选技术方案与项目现有技术栈完全兼容。
| 技术组件 | 选型 | 版本/API Level | 说明 |
|---|---|---|---|
| 开发语言 | ArkTS | API 12+ | HarmonyOS原生应用开发语言,基于TypeScript扩展,增加了声明式UI和响应式编程的支持 |
| UI框架 | ArkUI | 声明式范式 | 提供@State/@Component/@Builder等装饰器,支持响应式数据绑定 |
| 路由框架 | @kit.ArkUI router | 系统内置 | 支持页面级路由跳转,提供pushUrl/back等API |
| 构建工具 | DevEco Studio | 最新版 | 官方IDE,集成Hvigor构建系统,支持实时预览和调试 |
| 包管理 | oh-package.json5 | - | HarmonyOS包依赖管理,支持三方库引入 |
| 资源管理 | resourceManager | 系统内置 | 支持rawfile、resources等资源访问方式 |
ArkTS语言特性说明:
ArkTS是HarmonyOS的官方应用开发语言,它在TypeScript基础上进行了专门优化,以适应HarmonyOS的静态类型系统和运行时环境。与标准TypeScript相比,ArkTS有以下关键差异:
- 静态类型系统:ArkTS要求在编译时确定所有类型,不支持
any和unknown类型,也不支持运行时类型变更 - 声明式UI:通过
@Component装饰器定义UI组件,使用build()方法声明式构建UI树 - 响应式状态:
@State装饰器标记响应式状态变量,状态变化自动触发UI重建 - 受限的JavaScript特性:不支持
with语句、eval、in运算符等动态特性 - 增强的导入/导出:支持
export/import语法,但不支持export =和require
2.1.3 现有代码模式分析
通过分析项目中已有的AI应用(如"AI简历诊断"、“AI面试模拟”、"AI品牌起名Slogan"等),我们总结出以下可复用的开发模式:
模式一:三层架构模式(Model-Service-Page)
每个AI应用统一采用三层架构,各层职责明确:
Model层(数据定义)
├── 定义数据结构类
├── 所有字段显式声明类型
├── 构造函数中初始化所有字段
└── 不包含任何业务逻辑
Service层(业务逻辑)
├── 持有Model实例
├── 实现数据生成方法 generateData()
├── 封装AI调用逻辑
├── 输入数据预处理
└── 返回结构化数据
Page层(UI展示)
├── @State装饰状态变量
├── build()方法构建UI树
├── TextInput收集用户输入
├── Button触发业务操作
├── ForEach渲染列表数据
└── 条件渲染控制显示逻辑
模式二:数据驱动模式(@State驱动)
所有UI更新通过@State装饰器驱动,不直接操作DOM:
// 数据层
@State resultData: AI简历关键词提取Data | null = null
// 业务触发
this.resultData = this.service.generateData(this.inputData)
// UI自动更新——无需手动操作DOM
模式三:路由注册模式
每个应用需要完成两个配置步骤:
步骤1:在main_pages.json中添加页面路由
{
"src": [
"pages/Index",
"apps/AI简历关键词提取/AI简历关键词提取Page",
// ... 其他页面
]
}
步骤2:在apps.json中添加应用元信息
{
"icon": "🔑",
"title": "AI简历关键词提取",
"subtitle": "简历关键",
"color": "#8B5CF6",
"bg": "#F5F3FF",
"border": "#DDD6FE",
"page": "apps/AI简历关键词提取/AI简历关键词提取Page",
"cat": "职业发展"
}
模式四:Mock优先模式
在AI应用开发初期,使用Mock数据模拟AI输出,确保UI开发和AI模型开发可以并行进行:
generateData(input: Record<string, Object>): AI简历关键词提取Data {
let result: AI简历关键词提取Data = new AI简历关键词提取Data()
// Mock数据——后续替换为真实AI API调用
result.match_rate = '生成结果:' + String(input['resume'] || '')
result.matched_keywords = ['示例数据1', '示例数据2', '示例数据3']
// ... 更多Mock数据
return result
}
2.2 需求理解与确认
2.2.1 原始需求分析
原始需求描述为:“构建一个AI简历关键词提取应用,帮助求职者分析简历与目标岗位的匹配度。”
这是一个典型的模糊需求,需要我们在对齐阶段进行深入分析和细化。通过多轮沟通和场景分析,我们将原始需求拆解为以下核心功能点:
核心功能一:关键词匹配分析
- 输入:简历内容、目标岗位JD
- 处理:AI自动提取JD中的关键技能和资质要求
- 输出:匹配率、已匹配关键词列表、缺失关键词列表
核心功能二:关键词权重分析
- 对每个关键词赋予权重(高/中/低)
- 高权重关键词通常出现在JD的"任职要求"和"岗位职责"部分
- 低权重关键词可能是辅助性要求或"加分项"
核心功能三:行业术语检查
- 识别简历中是否包含目标行业的标准化术语
- 检查术语使用是否准确、规范
- 提供行业术语规范化建议
核心功能四:ATS优化建议
- 分析简历格式是否满足ATS解析要求
- 检查关键词密度和分布是否合理
- 提供具体的优化建议
核心功能五:简历改写建议
- 针对缺失的关键词,提供具体的改写建议
- 指明需要在简历的哪个模块(项目经历、技能特长等)补充
- 提供原文到建议修改的对比
2.2.2 核心痛点深度分析
通过用户调研和场景分析,我们识别出以下四个核心痛点,并针对每个痛点进行了深入分析:
痛点一:ATS系统筛选率低
ATS(Applicant Tracking System)是企业用来管理招聘流程的软件系统,据统计,超过75%的简历在ATS初筛阶段即被淘汰。ATS系统的工作机制如下:
简历投递 → ATS解析简历 → 关键词匹配 → 评分排序 → HR筛选
↓
简历格式不兼容 → 解析失败 → 直接淘汰
↓
关键技能词缺失 → 匹配度低 → 排名靠后
↓
格式复杂(表格/图片) → 信息丢失 → 匹配失败
ATS系统的主要筛选逻辑包括:
- 关键词匹配:将简历内容与JD中的关键词进行精确匹配
- 技能权重评分:不同技能有不同的权重分数
- 工作年限匹配:验证工作年限是否满足要求
- 学历要求匹配:验证学历是否符合要求
求职者往往不了解目标公司的ATS系统偏好,也无法准确判断哪些关键词是"必选项"、哪些是"加分项"。AI简历关键词提取工具的核心价值就在于帮助求职者"看透"ATS系统的筛选逻辑,有的放矢地优化简历。
痛点二:关键词识别依赖经验
传统的关键词匹配完全依赖求职者的行业经验和认知。对于转行者或应届生,由于缺乏对目标岗位的深度了解,往往无法准确识别JD中的关键技术要求和软技能关键词。
例如,以下是一份典型的前端工程师JD:
职位:高级前端工程师
岗位职责:
1. 负责公司核心产品的前端架构设计和开发
2. 参与技术选型和框架搭建
3. 优化页面性能和用户体验
任职要求:
1. 5年以上前端开发经验
2. 精通JavaScript/TypeScript,熟悉ES6+语法
3. 熟练掌握React或Vue框架,有大型项目经验
4. 了解Webpack/Vite等构建工具
5. 熟悉前端性能优化,了解浏览器渲染原理
6. 有Node.js开发经验者优先
7. 良好的沟通能力和团队协作精神
从这份JD中,AI工具需要自动提取的关键词包括:
- 硬技能关键词:JavaScript、TypeScript、React、Vue、Webpack、Vite、Node.js、ES6+
- 软技能关键词:沟通能力、团队协作
- 经验关键词:5年以上、大型项目、前端架构设计
- 工具关键词:性能优化、浏览器渲染原理、构建工具
对于经验不足的求职者,可能会遗漏"ES6+"、"浏览器渲染原理"等看似不太重要但实际被ATS系统重点匹配的关键词。
痛点三:简历优化缺乏针对性
即便求职者认识到需要优化简历,也难以确定具体优化方向——是补充项目经验、增加技术栈关键词,还是调整描述方式?缺乏数据驱动的精准建议。
AI简历关键词提取工具通过以下方式解决这个问题:
- 量化匹配度:给出具体的匹配率百分比,让求职者了解差距
- 优先级排序:按重要性排序缺失的关键词,指导求职者优先补充高权重关键词
- 具体建议:提供"如何在简历中补充该关键词"的具体操作建议
- 改写示例:给出原文到优化后的对比示例,供求职者参考
痛点四:多版本简历管理困难
求职者通常需要针对不同公司、不同岗位投递多版简历,手动管理和维护关键词匹配度是一项繁琐且易出错的工作。
虽然当前版本的AI简历关键词提取工具主要聚焦于单次分析,但在架构设计中已经考虑到后续扩展,包括:
- 分析历史记录保存
- 多版本简历对比
- 关键词匹配度追踪
2.2.3 需求规格详细定义
经过多轮分析和确认,我们最终定义了以下完整的需求规格:
用户输入规格:
| 字段 | 类型 | 说明 | 必填 | 长度限制 | 校验规则 |
|---|---|---|---|---|---|
| resume | string | 简历内容(纯文本) | 是 | ≤5000字符 | 非空校验 |
| job_description | string | 目标岗位JD(纯文本) | 是 | ≤5000字符 | 非空校验 |
AI输出规格:
| 输出字段 | 类型 | 说明 | 示例值 |
|---|---|---|---|
| match_rate | string | 整体匹配率,格式为"XX%" | “85%” |
| matched_keywords | string[] | 已匹配的关键词列表 | [“JavaScript”, “React”, “TypeScript”] |
| keyword | string | 当前正在分析的关键词 | “React” |
| in_resume | string | 关键词在简历中出现的位置/上下文 | “项目经验 → 电商平台前端开发” |
| weight | string | 关键词权重等级 | “高” / “中” / “低” |
| missing_keywords | string[] | 缺失的关键词列表 | [“Node.js”, “Webpack”] |
| importance | string | 缺失关键词的重要性说明 | “高频出现在JD中,建议补充” |
| how_to_add | string | 如何补充缺失关键词的建议 | “在项目经历中增加Node.js相关描述” |
| industry_terms | string[] | 行业术语检查结果 | [“组件化开发”, “响应式布局”] |
| ats_optimization | string | ATS优化建议 | “建议使用标准标题格式,避免使用表格” |
| rewrite_suggestions | string[] | 简历改写建议列表 | [“将’参与开发’改为’主导开发’”] |
| section | string | 建议修改的简历模块 | “项目经历” |
| original | string | 原文内容 | “参与了某某项目的开发” |
| suggested | string | 建议修改后的内容 | “主导了某某项目的架构设计和核心模块开发” |
2.2.4 边界条件确认
在需求确认过程中,我们明确了以下边界条件,确保开发范围清晰可控:
1. 输入边界
- 单次输入文本长度不超过5000字符(约800-1000个汉字),超过部分将自动截断
- 不支持图片、PDF、Word等格式的输入,仅支持纯文本
- 不支持批量输入,每次只分析一份简历和一个JD
2. 输出边界
- 所有输出数据通过结构化数据模型
AI简历关键词提取Data返回 - 数组类型字段(如
matched_keywords)最多返回20个元素 - 匹配率以百分比字符串形式返回(如"85%"),不做数值计算
3. 功能边界
- 当前版本使用Mock数据展示功能,不接入真实AI大模型
- 不支持历史记录保存
- 不支持简历版本管理
- 不支持多语言(仅支持中文)
4. 性能边界
- 页面初始化时间不超过500ms
- 数据生成和UI更新响应时间不超过100ms
- 列表渲染支持100+条数据的流畅显示
5. 隐私边界
- 用户输入的简历数据仅保存在本地内存中,不持久化到本地存储
- 不上传任何用户数据到云端(Mock模式下无网络请求)
- 应用退出后所有数据自动清除
2.2.5 目标用户群体分析
我们将目标用户分为以下三类,每类用户有不同的使用场景和需求:
第一类:普通求职者(占比约60%)
用户画像:
- 正在求职或准备求职的职场人士
- 有一定行业经验但对ATS系统了解不多
- 希望快速提升简历通过率
- 技术能力参差不齐,需要简单易用的工具
核心需求:
- 输入简历和JD,快速获得匹配度分析结果
- 清楚地知道需要补充哪些关键词
- 获得具体的优化建议
第二类:职业发展顾问/HR(占比约25%)
用户画像:
- 职业规划师、简历优化顾问
- 企业HR,需要帮助候选人优化简历
- 对ATS系统有较深了解
- 需要批量分析和管理功能
核心需求:
- 了解简历与目标岗位的匹配细节
- 获得专业的优化建议
- 为客户提供数据驱动的简历优化报告
第三类:学习爱好者(占比约15%)
用户画像:
- 在校学生,准备实习或求职
- 转行者,需要了解目标行业的关键技能
- 希望通过工具学习简历优化技巧
核心需求:
- 了解目标岗位的核心技能要求
- 学习如何撰写高质量的简历内容
- 通过反复练习提升简历撰写能力
2.3 关键决策记录
在对齐阶段,我们做出了一系列关键决策,这些决策直接影响后续阶段的设计和实现:
| 决策项 | 备选方案 | 选定方案 | 决策理由 |
|---|---|---|---|
| 状态管理 | @State / 全局状态管理 | @State | 项目统一采用,应用内状态足够简单,无需额外引入状态管理库 |
| 数据流 | 单向数据流 / 双向绑定 | 单向数据流 | Service生成数据 → Page绑定渲染,清晰可控,易于调试 |
| 代码生成 | 手动编码 / 自动化脚本 | 自动化脚本模板 | 项目有多个类似应用,代码模板化可以大幅提高效率 |
| 测试策略 | 自动化测试 / 手动测试+代码审查 | 手动测试+代码审查 | 项目规模较小,每个应用代码量在200-300行之间,手动测试成本更低 |
| AI集成策略 | 直接接入API / Mock优先 | Mock优先 | UI开发不依赖AI模型可用性,可并行开发 |
| 主题风格 | 浅色主题 / 深色主题 | 深色主题 | 符合AI应用科技感定位,视觉统一 |
| 输入组件 | TextInput / TextArea | TextInput | 当前输入量较小,TextInput足够使用 |
三、架构阶段(Architect)
基于对齐阶段形成的共识文档,我们进入架构设计阶段。本阶段的目标是设计一个清晰、可扩展、与现有系统高度一致的技术架构。架构设计遵循以下原则:
- 最小化原则:只设计当前需求所需的架构,不做过度设计
- 一致性原则:与项目现有架构保持一致,不引入新的架构模式
- 可扩展原则:为后续功能扩展预留接口,但不实现未规划的功能
3.1 整体架构设计
AI简历关键词提取应用采用经典的三层MVVM(Model-View-ViewModel)架构模式,与项目中的其他AI应用保持完全一致:
┌─────────────────────────────────────────────────────────────────┐
│ View 层(Page) │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ AI简历关键词提取Page.ets │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ @State 状态管理 │ │ │
│ │ │ ┌─────────────────┐ ┌──────────────────────┐ │ │ │
│ │ │ │ inputData │ │ resultData │ │ │ │
│ │ │ │ Record<string, │ │ AI简历关键词提取Data │null │ │ │
│ │ │ │ Object> │ │ │ │ │ │
│ │ │ └─────────────────┘ └──────────────────────┘ │ │ │
│ │ │ ┌──────────────────────────────────────────────┐ │ │ │
│ │ │ │ showResult: boolean │ │ │ │
│ │ │ └──────────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ build() UI 构建 │ │ │
│ │ │ ├── 顶部导航栏(Row + Text + Blank) │ │ │
│ │ │ ├── Scroll 内容区域 │ │ │
│ │ │ │ ├── 输入卡片(Column + TextInput) │ │ │
│ │ │ │ ├── 扫描按钮(Button) │ │ │
│ │ │ │ └── 结果卡片(条件渲染 + ForEach列表) │ │ │
│ │ │ └── 背景色 #0F172A │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ Service 层 │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ AI简历关键词提取Service.ets │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 私有成员 │ │ │
│ │ │ ┌──────────────────────────────────────────────┐ │ │ │
│ │ │ │ private model: AI简历关键词提取Data │ │ │ │
│ │ │ └──────────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 核心方法 │ │ │
│ │ │ generateData(input: Record<string, Object>) │ │ │
│ │ │ ├── 输入参数校验 │ │ │
│ │ │ ├── Mock数据生成(当前阶段) │ │ │
│ │ │ │ └── 后续替换为:AI API调用 │ │ │
│ │ │ │ ├── HTTP请求封装 │ │ │
│ │ │ │ ├── Prompt模板构建 │ │ │
│ │ │ │ ├── 响应解析与数据映射 │ │ │
│ │ │ │ └── 异常处理与降级策略 │ │ │
│ │ │ └── 返回结构化数据 │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ Model 层 │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ AI简历关键词提取Data │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ ├── match_rate: string │ │ │
│ │ │ ├── matched_keywords: string[] │ │ │
│ │ │ ├── keyword: string │ │ │
│ │ │ ├── in_resume: string │ │ │
│ │ │ ├── weight: string │ │ │
│ │ │ ├── missing_keywords: string[] │ │ │
│ │ │ ├── importance: string │ │ │
│ │ │ ├── how_to_add: string │ │ │
│ │ │ ├── industry_terms: string[] │ │ │
│ │ │ ├── ats_optimization: string │ │ │
│ │ │ ├── rewrite_suggestions: string[] │ │ │
│ │ │ ├── section: string │ │ │
│ │ │ ├── original: string │ │ │
│ │ │ └── suggested: string │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
3.1.1 各层职责详细说明
Model层(数据模型层)
Model层是整个应用的数据基础,定义了所有业务数据的结构和类型约束。其核心职责包括:
- 数据结构定义:明确定义AI分析结果的每个字段及其类型
- 类型安全保障:通过TypeScript的类型系统,确保数据在编译时即被正确使用
- 默认值提供:所有字段在声明时
更多推荐


所有评论(0)