HarmonyOS AI 应用开发实战:读书笔记自动生成系统
·
HarmonyOS AI 应用开发实战:读书笔记自动生成系统
本文基于 HarmonyOS + ArkTS 的 Model-Service-Page 架构,详细解析读书笔记自动生成 AI 应用的完整开发流程,涵盖阅读效率痛点、架构设计、提示词工程、核心实现、性能优化等全链路技术要点。
一、项目背景与需求分析
1.1 阅读效率与知识转化的挑战
在信息爆炸的时代,阅读已成为获取知识的主要途径。然而,大多数人在阅读后很快就会遗忘所读内容。根据艾宾浩斯遗忘曲线,学习后的 20 分钟内遗忘率高达 42%,一个月后遗忘率达 79%。有效的笔记是对抗遗忘、促进知识内化的关键手段。
当前阅读和笔记领域面临的主要挑战包括:
- 阅读效率低:逐字逐句阅读耗时多,难以快速提取核心观点
- 笔记质量差:缺乏系统的笔记方法,笔记内容零散无序
- 知识转化难:阅读后难以将书中的知识转化为自己的认知和行动
- 思维导图缺失:缺乏对书籍内容的整体性理解和结构化呈现
- 深度思考不足:阅读后缺乏反思和批判性思考

1.2 产品功能定位
本应用旨在利用 AI 大语言模型的能力,将书摘内容自动转化为结构化的读书笔记。核心功能包括:
- 笔记生成:根据书摘内容自动生成结构化的读书笔记
- 摘要提炼:提取书摘的核心摘要和关键信息
- 重点标记:识别书摘中的重点内容和关键观点
- 思维导图:生成书籍内容的结构化思维导图
- 个人思考:基于书摘内容生成启发性的个人思考
1.3 技术选型
| 维度 | 方案 | 说明 |
|---|---|---|
| 平台 | HarmonyOS NEXT | 国产操作系统 |
| 语言 | ArkTS | 声明式 UI,类型安全 |
| 框架 | ArkUI | 响应式布局 |
| 架构 | Model-Service-Page | 三层分离 |
| AI | 大语言模型 | 笔记自动生成 |
二、技术架构设计
2.1 架构总览
┌──────────────────────────────────────────────────────────────┐
│ Page 层 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ NotePage │ │
│ │ ├── 输入:书摘文本、风格类型 │ │
│ │ ├── 按钮:AI 生成 │ │
│ │ └── 结果:笔记、摘要、重点、思维导图、思考 │ │
│ └───────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────┤
│ Service 层 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ NoteService │ │
│ │ ├── Prompt 构建(阅读笔记方法 + 书摘内容) │ │
│ │ ├── AI API 调用 │ │
│ │ ├── 响应解析与数据映射 │ │
│ │ └── 降级策略 │ │
│ └───────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────┤
│ Model 层 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ NoteData │ │
│ │ ├── excerpts: string(书摘文本) │ │
│ │ ├── style: string(风格类型) │ │
│ │ ├── golden_lines: string[](金句/重点) │ │
│ │ ├── core_ideas: string[](核心观点) │ │
│ │ ├── action_items: string[](行动清单) │ │
│ │ └── reflection: string(个人思考) │ │
│ └───────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
2.2 Model 层:数据模型设计
export class NoteData {
excerpts: string = ''
style: string = ''
golden_lines: string[] = []
core_ideas: string[] = []
action_items: string[] = []
reflection: string = ''
constructor() {
this.excerpts = ''
this.style = ''
this.golden_lines = []
this.core_ideas = []
this.action_items = []
this.reflection = ''
}
}
字段设计分析:
| 字段 | 类型 | 说明 |
|---|---|---|
excerpts | string | 输入的书摘文本内容 |
style | string | 笔记风格类型 |
golden_lines | string[] | 金句/重点内容列表 |
core_ideas | string[] | 核心观点列表 |
action_items | string[] | 可执行的行动清单 |
reflection | string | 个人思考与感悟 |
2.3 Service 层:业务逻辑设计
import { NoteData } from './读书笔记自动生成Model'
export class NoteService {
private model: NoteData
constructor() {
this.model = new NoteData()
}
generateData(input: Record<string, Object>): NoteData {
let result: NoteData = new NoteData()
let excerpts: string = input['excerpts'] as string
let style: string = input['style'] as string
let prompt: string = this.buildPrompt(excerpts, style)
let response: string = this.callAI(prompt)
result = this.parseResponse(response, result)
return result
}
private buildPrompt(excerpts: string, style: string): string {
return `你是一位阅读笔记专家,精通各种笔记方法...
书摘内容:${excerpts}
笔记风格:${style}
请输出 JSON 格式的读书笔记...`
}
}
2.4 Page 层:UI 组件设计
@Entry
@Component
struct NotePage {
@State inputData: Record<string, Object> = {}
@State resultData: NoteData | null = null
@State showResult: boolean = false
private service: NoteService = new NoteService()
build() {
Column() {
Row() {
Text('← 返回').onClick(() => { router.back() })
Blank()
Text('读书笔记自动生成')
Blank()
Text('')
}
Scroll() {
Column() {
Text('书摘文本')
TextInput({ placeholder: '请输入书摘文本' })
.onChange((val: string) => { this.inputData['excerpts'] = val })
Text('风格类型')
TextInput({ placeholder: '请输入风格类型' })
.onChange((val: string) => { this.inputData['style'] = val })
Button('AI 生成').onClick(() => {
this.resultData = this.service.generateData(this.inputData)
this.showResult = true
})
if (this.showResult && this.resultData !== null) {
Text('生成结果')
Text('读书笔记')
}
}
}
}
}
}
三、AI 提示词工程原理
3.1 读书笔记提示词设计
3.1.1 角色设定
你是一位阅读笔记专家,精通康奈尔笔记法、思维导图法、卡片笔记法和PQ4R阅读法。你擅长从文本中提取核心观点、金句和可执行的行动建议,帮助读者高效理解和内化知识。
3.1.2 笔记风格说明
笔记风格:{style}
各风格说明:
- 精简版:提取最核心的观点和金句,适合快速回顾
- 详细版:完整的笔记结构,包含观点、论据、案例和思考
- 行动版:侧重于可执行的行动清单和实践建议
3.1.3 输出结构指导
请按照以下结构生成笔记:
1. 金句摘录:书中最有价值的 3-5 条金句
2. 核心观点:2-4 个最重要的核心观点
3. 行动清单:3-5 条可立即执行的行动建议
4. 个人思考:对书摘内容的深度思考和评价
3.2 完整 Prompt 示例
buildPrompt(excerpts: string, style: string): string {
return `你是一位阅读笔记专家,精通各种笔记方法。
请根据以下书摘内容,生成结构化的读书笔记:
书摘内容:
${excerpts}
笔记风格:${style}
- 精简版:提取核心,适合快速回顾
- 详细版:完整结构,适合深入学习
- 行动版:侧重行动,适合实践转化
请严格按照以下 JSON 格式输出:
{
"golden_lines": [
"金句1:具体的金句内容",
"金句2:具体的金句内容"
],
"core_ideas": [
"核心观点1:观点的详细解释",
"核心观点2:观点的详细解释"
],
"action_items": [
"行动1:可执行的具体行动",
"行动2:可执行的具体行动"
],
"reflection": "对书摘内容的深度思考、评价和个人感悟"
}
要求:
1. 金句摘录至少3条,每条都是原文中的精华语句
2. 核心观点至少2个,每个观点要包含解释
3. 行动清单至少3条,要具体、可执行
4. 个人思考要有深度,体现批判性思维
5. 根据笔记风格调整详细程度和侧重点`
}
3.3 响应解析
parseResponse(response: string, result: NoteData): NoteData {
try {
let parsed: Object = JSON.parse(response)
if (Array.isArray(parsed['golden_lines'])) {
result.golden_lines = parsed['golden_lines'] as string[]
}
if (Array.isArray(parsed['core_ideas'])) {
result.core_ideas = parsed['core_ideas'] as string[]
}
if (Array.isArray(parsed['action_items'])) {
result.action_items = parsed['action_items'] as string[]
}
if (typeof parsed['reflection'] === 'string') {
result.reflection = parsed['reflection'] as string
}
} catch (e) {
result.reflection = 'AI 服务暂时不可用,请稍后重试'
}
return result
}
四、核心功能实现详解
4.1 输入区域实现
Text('书摘文本')
.fontSize(14)
.fontWeight(FontWeight.Bold)
.fontColor($r('app.color.text_primary'))
.margin({ top: 12, bottom: 4 })
TextInput({ placeholder: '请输入书摘文本' })
.fontSize(14)
.height(44)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.padding({ left: 12, right: 12 })
.onChange((val: string) => { this.inputData['excerpts'] = val })
Text('风格类型')
.fontSize(14)
.fontWeight(FontWeight.Bold)
.fontColor($r('app.color.text_primary'))
.margin({ top: 12, bottom: 4 })
TextInput({ placeholder: '请输入风格类型' })
.fontSize(14)
.height(44)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.padding({ left: 12, right: 12 })
.onChange((val: string) => { this.inputData['style'] = val })
4.2 结果展示区域
if (this.showResult && this.resultData !== null) {
// 金句摘录
Text('金句摘录')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.margin({ top: 16, bottom: 8 })
ForEach(this.resultData.golden_lines, (line: string, index: number) => {
Column() {
Text(`"${line}"`)
.fontSize(14)
.fontColor($r('app.color.text_primary'))
.fontStyle(FontStyle.Italic)
.lineHeight(22)
.backgroundColor('#FFFBEB')
.padding(12)
.borderRadius(8)
.width('100%')
.border({ width: 1, color: '#FDE68A' })
}
.width('100%')
.margin({ bottom: 8 })
}, (line: string, index: number) => index.toString())
// 核心观点
Text('核心观点')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.margin({ top: 16, bottom: 8 })
ForEach(this.resultData.core_ideas, (idea: string, index: number) => {
Row() {
Circle()
.width(8)
.height(8)
.fill('#3B82F6')
.margin({ right: 8, top: 4 })
Text(idea)
.fontSize(14)
.fontColor($r('app.color.text_primary'))
.lineHeight(22)
}
.width('100%')
.backgroundColor('#FFFFFF')
.padding(12)
.borderRadius(8)
.margin({ bottom: 8 })
}, (idea: string, index: number) => index.toString())
// 行动清单
Text('行动清单')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.margin({ top: 16, bottom: 8 })
ForEach(this.resultData.action_items, (item: string, index: number) => {
Row() {
Text(`${index + 1}.`)
.fontSize(14)
.fontColor('#22C55E')
.fontWeight(FontWeight.Bold)
.margin({ right: 8 })
Text(item)
.fontSize(14)
.fontColor($r('app.color.text_primary'))
}
.width('100%')
.margin({ bottom: 6 })
}, (item: string, index: number) => index.toString())
// 个人思考
Text('个人思考')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.margin({ top: 16, bottom: 8 })
Text(this.resultData.reflection)
.fontSize(14)
.fontColor($r('app.color.text_primary'))
.lineHeight(22)
.backgroundColor('#FFFFFF')
.padding(12)
.borderRadius(8)
.width('100%')
}
4.3 完整数据流
用户输入:书摘文本 = "习惯是自我提高的复利...", 风格类型 = "精简版"
↓
inputData = { excerpts: "习惯是自我提高的复利...", style: "精简版" }
↓
点击 "AI 生成"
↓
service.generateData(inputData)
↓
构建 Prompt → 调用 AI → 解析响应
↓
返回 NoteData 实例
↓
resultData 更新 → showResult = true
↓
UI 渲染:金句摘录、核心观点、行动清单、个人思考
五、用户体验优化
5.1 页面布局
┌──────────────────────────────────┐
│ ← 返回 读书笔记自动生成 │
├──────────────────────────────────┤
│ 输入信息 │
│ ┌──────────────────────┐ │
│ │ 书摘文本 │ │
│ │ [习惯是自我提高的复利]│ │
│ │ 风格类型 │ │
│ │ [精简版] │ │
│ └──────────────────────┘ │
│ ┌──────────────────────┐ │
│ │ AI 生成 │ │
│ └──────────────────────┘ │
│ 金句摘录 │
│ ┌──────────────────────┐ │
│ │ "习惯是自我提高的... │ │
│ └──────────────────────┘ │
│ 核心观点 │
│ ● 习惯的复利效应是指... │
│ ● 微小的改变积累会... │
│ 行动清单 │
│ 1. 每天坚持一个小习惯 │
│ 2. 记录习惯的完成情况 │
│ 个人思考 │
│ 这本书让我认识到... │
└──────────────────────────────────┘
5.2 交互优化
5.2.1 金句样式
金句使用斜体、黄色背景和边框,突出显示,模拟真实书中的金句标记效果。
5.2.2 颜色编码
- 蓝色:核心观点标记
- 绿色:行动清单编号
- 黄色:金句背景
5.3 资源管理
.fontColor($r('app.color.text_primary'))
.fontColor($r('app.color.text_secondary'))
.backgroundColor('#F8FAFC')
.backgroundColor('#FFFFFF')
.backgroundColor('#FFFBEB') // 金句背景
六、性能优化与最佳实践
6.1 ArkTS 约束适配
6.1.1 字体样式
// 正确:使用 ArkTS 支持的字体样式
.fontStyle(FontStyle.Italic)
6.1.2 数组遍历
// 正确:使用 ForEach 遍历
ForEach(resultData.golden_lines, (line: string, index: number) => {
Text(line)
}, (line: string, index: number) => index.toString())
6.2 性能优化
6.2.1 条件渲染
if (this.showResult && this.resultData !== null) {
// 结果渲染
}
6.3 错误处理
generateData(input: Record<string, Object>): NoteData {
try {
if (!input['excerpts']) {
throw new Error('书摘文本不能为空')
}
return this.parseResponse(this.callAI(this.buildPrompt(...)), new NoteData())
} catch (e) {
let result: NoteData = new NoteData()
result.reflection = '请确保书摘文本已填写后重试'
return result
}
}
6.4 代码组织
读书笔记自动生成/
├── 读书笔记自动生成Model.ets # 数据模型
├── 读书笔记自动生成Service.ets # 业务逻辑
└── 读书笔记自动生成Page.ets # 页面组件
七、总结与展望
7.1 项目成果
- 实现了基于 AI 的读书笔记自动生成
- 包含金句摘录、核心观点、行动清单、个人思考多维度输出
- 支持多种笔记风格,满足不同使用场景
- Model-Service-Page 架构确保代码清晰可维护
7.2 技术经验
- 笔记风格的提示词设计需要精确的风格描述
- 金句样式使用斜体和背景色突出显示
- 多维度输出版块设计提升笔记的实用性
7.3 未来展望
- 支持思维导图生成,可视化展示知识结构
- 接入 OCR 识别,支持拍照提取书摘
- 构建个人笔记知识库,支持跨笔记检索和关联
本文通过读书笔记自动生成 AI 应用的完整开发实践,详细阐述了 HarmonyOS + ArkTS + AI 的技术栈应用。从笔记风格提示词工程到多维度结果展示,全面展示了鸿蒙平台上智慧阅读工具开发的全流程。
更多推荐



所有评论(0)