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 = ''
  }
}

字段设计分析

字段类型说明
excerptsstring输入的书摘文本内容
stylestring笔记风格类型
golden_linesstring[]金句/重点内容列表
core_ideasstring[]核心观点列表
action_itemsstring[]可执行的行动清单
reflectionstring个人思考与感悟

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 项目成果

  1. 实现了基于 AI 的读书笔记自动生成
  2. 包含金句摘录、核心观点、行动清单、个人思考多维度输出
  3. 支持多种笔记风格,满足不同使用场景
  4. Model-Service-Page 架构确保代码清晰可维护

7.2 技术经验

  • 笔记风格的提示词设计需要精确的风格描述
  • 金句样式使用斜体和背景色突出显示
  • 多维度输出版块设计提升笔记的实用性

7.3 未来展望

  • 支持思维导图生成,可视化展示知识结构
  • 接入 OCR 识别,支持拍照提取书摘
  • 构建个人笔记知识库,支持跨笔记检索和关联

本文通过读书笔记自动生成 AI 应用的完整开发实践,详细阐述了 HarmonyOS + ArkTS + AI 的技术栈应用。从笔记风格提示词工程到多维度结果展示,全面展示了鸿蒙平台上智慧阅读工具开发的全流程。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐