AI自动化Anki卡片制作:基于大语言模型的智能学习工具实战
1. 项目概述:当Anki遇上AI,一个效率革命的开端
如果你和我一样,是个重度Anki用户,同时又对AI工具保持高度敏感,那么你肯定也经历过那种“灵光一现”却又“无从下手”的纠结时刻。Anki,这个基于间隔重复原理的记忆神器,其核心价值在于将知识转化为一张张可复习的卡片。但制作卡片的过程,尤其是面对海量文本、复杂概念或者想快速构建一个知识体系时,那种手动输入、整理、格式化的繁琐,常常让人望而却步,成为坚持使用Anki的最大阻力。而另一边,以ChatGPT为代表的大语言模型(LLM)展现出了惊人的文本理解、总结和生成能力。一个很自然的想法就冒出来了:能不能让AI来帮我做Anki卡片?把枯燥的“搬运工”工作交给机器,我把宝贵的时间用在更核心的思考、理解和复习上?
thiswillbeyourgithub/AnkiAIUtils这个项目,正是瞄准了这个精准的痛点。它不是一个庞大的、面面俱到的Anki套件,而是一套聚焦于“AI辅助制卡”的实用工具集(Utilities)。它的核心使命非常明确:充当用户、AI(特别是OpenAI的API)与Anki之间的高效桥梁,将各种格式的原始信息(文本、网页、PDF,甚至是你的思维碎片),通过AI的理解与加工,自动化、批量化地转换成高质量、可直接导入Anki的卡片。简单来说,它让你用几句指令或一个文件,就能生成几十上百张结构清晰、重点突出的复习卡片。
这个项目适合谁?首先是所有Anki的中高级用户,尤其是学生、研究者、语言学习者、备考各类证书的专业人士,你们有系统化构建知识库的刚需。其次是任何对“AI+效率工具”组合感兴趣的实践者,这个项目提供了一个绝佳的、可落地的观察窗口。最后,它甚至适合有一定Python基础的开发者,作为一个理解如何将LLM API与具体应用(Anki)深度集成的优秀范例。
2. 核心设计思路:模块化与管道化的工作流
初次接触这个项目,你可能会被仓库里几个独立的Python脚本搞得有点懵:anki_ai_utils.py,cloze_processor.py,pdf_to_anki.py... 它们之间是什么关系?该用哪个?其实,这正是项目设计上的一个巧妙之处:模块化与管道化。开发者没有做一个大而全的“黑箱”应用,而是把制卡流程拆解成几个可独立运行、也可串联协作的环节,把控制权交给了用户。
2.1 核心模块功能解析
我们来拆解一下这几个核心工具,理解它们各自在流水线上的位置:
anki_ai_utils.py:通用文本处理器与制卡引擎这是项目的心脏。它不关心你的输入从哪里来(可以是直接粘贴的文本,也可以是其他脚本处理后的结果),只专注于一件事:接收一段文本,调用AI API,根据你的指令将其转换成Anki卡片。它的核心工作流是:- 文本预处理:清理多余的空白字符、处理特殊的换行符等,为AI提供一个“干净”的输入。
- Prompt工程:这是灵魂所在。脚本内置了(或允许你自定义)一套给AI的“制卡指令”。这套指令会明确告诉AI:请将输入文本转换成Q&A形式的Anki卡片,问题要抓住核心概念,答案要简洁准确,并输出为特定的格式(如制表符分隔的TSV)。
- 调用API与解析:将预处理后的文本和制卡指令组合成完整的请求,发送给OpenAI API(通常是
gpt-3.5-turbo或gpt-4),然后解析AI返回的结构化文本,提取出问题和答案对。 - 输出格式化:将解析出的卡片数据保存为
.txt或.tsv文件,这个文件可以直接通过Anki的“导入”功能,变成牌组里的新卡片。
注意:这个脚本的通用性很强,但“垃圾进,垃圾出”(Garbage In, Garbage Out)的原则在这里依然适用。你喂给AI的原始文本质量越高、结构越清晰,它产出的卡片质量就越好。
cloze_processor.py:填空题(Cloze)卡片的专项优化工具Anki有一种强大的卡片类型叫“填空题”(Cloze Deletion),它允许你在一个句子中隐藏多个关键词,复习时逐个回忆。手动制作这种卡片很麻烦。cloze_processor.py就是为解决这个问题而生。- 工作原理:你可以给它一段文本(比如一个定义完整的段落),它通过调用AI,智能地识别出文本中的关键概念、术语或重要信息点。
- AI的决策:AI不仅会找出关键词,还会判断哪些词适合被隐藏(通常是核心名词、关键数据、重要结论),并自动用Anki认可的
{{c1::关键词}}语法标记出来。 - 输出:生成一个已经包含Cloze语法的笔记,导入Anki后会自动生成一张或多张填空卡片。这特别适合背诵定义、概念列表、流程步骤等。
pdf_to_anki.py:从PDF文档到知识卡片的端到端解决方案这是我认为实用性最高的模块之一。我们大量的学习资料都是PDF格式的(电子书、论文、讲义)。这个脚本旨在实现“PDF直通Anki”。- 文本提取:它首先会利用像
PyPDF2或pdfplumber这样的库,从PDF中提取出纯文本。这一步的准确性至关重要,复杂的排版、图表、公式可能会带来挑战。 - 智能分块:直接提取的整章文本可能太长,超出AI上下文窗口,也不利于生成聚焦的卡片。因此,脚本通常包含一个“分块”逻辑,按段落、章节或固定长度将文本分割成更小的片段。
- 调用制卡引擎:将每个文本块传递给类似
anki_ai_utils的核心逻辑,进行批量制卡。 - 整合输出:最终将所有文本块生成的卡片合并成一个文件。这样,你只需要指定一个PDF文件,就能获得与之对应的整套Anki卡片初稿。
- 文本提取:它首先会利用像
2.2 方案选型背后的考量
为什么选择这样的设计,而不是做一个带图形界面的整合应用?
- 灵活性优先:命令行脚本的形式,赋予了用户最大的灵活性。你可以轻松地将这些脚本嵌入到你自己的自动化流程中,比如结合文件监控工具,实现“新增PDF自动生成卡片”。你也可以只使用其中某一个功能,比如只用
cloze_processor来处理特定文本。 - 透明与可调试:每一步输入输出都是清晰的文本文件。如果AI生成的卡片不理想,你可以很容易地检查是原始文本的问题,还是Prompt指令需要优化,或者是API返回的结果解析出错。这种透明性对于调整和优化至关重要。
- 降低依赖与复杂度:一个完整的GUI应用需要处理界面、打包、跨平台兼容性等一系列复杂问题。而独立的Python脚本,依赖清晰(主要就是
openai库和PDF解析库),更容易部署和维护,也方便社区贡献代码。 - 鼓励“管道”思维:这种设计教会用户一种高效的工作流思维。你可以把
pdf_to_anki.py看作一个粗加工车间,把anki_ai_utils.py看作精加工车间,把cloze_processor.py看作特种车间。根据你的原材料(输入)和最终产品(卡片类型)需求,组合使用这些车间。
3. 从零开始实战:环境配置与首次运行
理论说得再多,不如亲手跑一遍。我们以最核心的anki_ai_utils.py为例,走通从环境准备到成功制卡的全过程。假设你已经在电脑上安装了Python(3.7以上版本)。
3.1 第一步:获取项目代码与安装依赖
首先,你需要把工具的代码拿到本地。由于项目名是thiswillbeyourgithub/AnkiAIUtils,这通常意味着它是一个GitHub仓库。你可以通过Git克隆,或者直接下载ZIP包。
# 使用Git克隆(推荐) git clone https://github.com/thiswillbeyourgithub/AnkiAIUtils.git cd AnkiAIUtils # 或者,直接下载并解压ZIP包进入项目目录后,你会发现一个requirements.txt文件。这个文件列出了项目运行所需的所有Python库。使用pip一键安装是最佳实践。
pip install -r requirements.txt实操心得:强烈建议在安装前,先创建一个独立的Python虚拟环境(venv)。这可以避免项目依赖与你系统全局的Python包发生冲突。命令很简单:
python -m venv venv,然后激活它(Windows:venv\Scripts\activate, Mac/Linux:source venv/bin/activate),再执行上面的pip安装命令。
安装完成后,核心依赖openai库应该就位了。你可以打开Python解释器输入import openai测试一下,不报错即可。
3.2 第二步:配置你的OpenAI API密钥
所有AI功能都依赖于OpenAI的API,所以你需要一个有效的API密钥。如果你还没有,需要去OpenAI平台注册并获取。
安全警告:API密钥是你的私有财产,绝对不要直接硬编码在脚本里,更不要上传到任何公开仓库。
项目通常会设计一个安全的方式来读取密钥。常见做法有两种:
- 环境变量:这是最推荐的方式。在终端中设置:
Python脚本中可以通过# 在Linux/Mac的终端或Windows的PowerShell中 export OPENAI_API_KEY='你的-sk-开头的密钥'os.environ.get('OPENAI_API_KEY')来读取。 - 配置文件:脚本可能会要求你在同目录下创建一个
.env文件或config.json文件,将密钥写在里面,脚本运行时读取。务必确保将这个配置文件添加到.gitignore中,防止误提交。
你需要查看anki_ai_utils.py的开头部分,看它具体是如何读取密钥的,并按照它的方式配置好。通常代码中会有类似这样的片段:
import openai import os openai.api_key = os.getenv("OPENAI_API_KEY") if not openai.api_key: print("错误:未找到OPENAI_API_KEY环境变量") exit(1)3.3 第三步:准备你的输入文本与首次运行
现在,让我们用一段简单的文本来测试。创建一个名为input.txt的文本文件,内容可以是任何你想学习的内容,比如:
光合作用是植物、藻类和某些细菌利用光能,将二氧化碳和水转化为有机物(主要是葡萄糖),并释放氧气的过程。其总反应式可表示为:6CO2 + 6H2O + 光能 → C6H12O6 + 6O2。这个过程发生在叶绿体中,主要分为光反应和暗反应两个阶段。接下来,在终端中运行脚本。通常的调用方式是:
python anki_ai_utils.py --input input.txt --output output_cards.txt或者,如果脚本设计为直接读取文件内容,也可能是:
python anki_ai_utils.py input.txt你需要查看脚本的帮助信息来确定具体参数:
python anki_ai_utils.py --help运行后,脚本会:
- 读取
input.txt。 - 将内容连同内置的Prompt发送给OpenAI API。
- 等待AI返回。
- 将解析后的卡片写入
output_cards.txt。
打开output_cards.txt,你可能会看到类似这样的内容(TSV格式):
什么是光合作用? 光合作用是植物、藻类和某些细菌利用光能,将二氧化碳和水转化为有机物并释放氧气的过程。 光合作用的总反应式是什么? 6CO2 + 6H2O + 光能 → C6H12O6 + 6O2。 光合作用发生在细胞的哪个部位? 叶绿体。 光合作用主要分为哪两个阶段? 光反应和暗反应。3.4 第四步:导入Anki
最后一步,打开Anki桌面版。
- 点击主界面顶部的“文件” -> “导入”。
- 选择你生成的
output_cards.txt文件。 - 在导入对话框中,确保“字段分隔符”选择“制表符”(因为脚本输出通常是TSV)。
- 映射字段:通常第一列是“正面”(问题),第二列是“背面”(答案)。确保Anki的字段映射正确。
- 选择要导入到的牌组,点击“导入”。
如果一切顺利,你的牌组里就会立刻新增这4张卡片。点击学习,AI辅助制作的卡片就开始为你服务了。
4. 核心环节深度解析:Prompt工程与质量调优
脚本跑通只是第一步,生成卡片的质量才是关键。而质量的核心,几乎完全取决于你如何与AI沟通——也就是Prompt工程。anki_ai_utils.py脚本内部一定有一个预设的Prompt模板,理解并学会修改它,是你从“能用”到“好用”的必经之路。
4.1 解构默认的制卡Prompt
让我们设想一个典型的、有效的Anki制卡Prompt可能长什么样:
你是一个专业的助教,擅长将复杂的知识转化为简洁、有效的抽认卡(Flashcards)。请将以下用三重引号括起来的学习材料,转换成一系列问答对形式的Anki卡片。 要求: 1. 每张卡片必须包含一个清晰、具体的问题和一个准确、简洁的答案。 2. 问题应直接针对材料中的核心事实、概念、定义、过程或关系。 3. 答案应基于材料,尽可能使用原文中的关键术语,但可以稍作精简。 4. 优先为重要的、容易遗忘的信息点制卡。 5. 输出格式:严格使用制表符(Tab)分隔问题和答案。每行一张卡片。不要添加任何额外的标题、编号或说明。 学习材料: """ {这里插入用户输入的文本} """这个Prompt做了几件关键事:
- 设定角色:让AI进入“助教”角色,明确其任务是制作“抽认卡”。
- 定义输出格式:明确要求是“问答对”,并用“制表符分隔”和“每行一张卡”严格约束输出结构,便于程序解析。
- 提出质量要求:指示AI关注“核心事实”、“关键术语”、“重要信息”,这能引导AI避免生成过于琐碎或边缘的卡片。
- 划定范围:明确只处理“三重引号内”的材料,防止AI胡编乱造。
4.2 根据你的需求定制Prompt
默认Prompt可能不适合所有场景。你需要学会调整。以下是一些常见场景的调优思路:
场景一:生成填空题(Cloze)如果你主要使用cloze_processor.py,或者想用主脚本直接生成Cloze卡片,Prompt需要大变样:
你是一个教育内容专家。请分析以下文本,识别出最关键的概念和术语(通常是名词、核心动词、关键数据)。对于每个识别出的关键点,用`{{c1::关键点}}`的格式将其在原文中标记出来。你的输出应该是完整的、已标记好的文本,不要解释,不要添加其他内容。 文本: {用户输入}这样,AI的输出就是一段嵌入了Cloze语法的文本,直接导入Anki即可。
场景二:生成选择题Anki通过插件可以支持选择题。你可以让AI生成题干和选项:
将以下材料转化为多项选择题。输出格式为:问题[制表符]A. 选项1[制表符]B. 选项2[制表符]C. 选项3[制表符]D. 选项4[制表符]正确答案:X 确保每个问题基于一个明确的知识点,错误选项(干扰项)应具有迷惑性但明显错误。 材料: {用户输入}然后你需要用其他脚本或手动处理,将这种格式转换成Anki兼容的卡片类型(可能需要用到Anki的“自定义笔记类型”功能)。
场景三:控制卡片深度与广度如果AI生成的卡片太浅(全是事实记忆)或太深(过于抽象),可以调整Prompt:
- 想要更深入的、联系性的卡片:在要求中加入“请设计一些需要对比、分析或应用概念的问题,例如‘X与Y的机制有何异同?’、‘在Z情境下如何应用A原理?’”。
- 想要更基础、更零散的记忆点:在要求中加入“请为材料中出现的每一个重要术语、日期、人名、公式单独生成一张定义卡”。
4.3 模型选择与参数微调
除了Prompt,调用API时的参数也影响结果。
- 模型选择:
gpt-3.5-turbo速度快、成本低,对于大多数定义清晰、结构良好的文本制卡任务完全够用。gpt-4理解能力更强,在处理非常晦涩、复杂或需要高度概括的材料时表现更好,但成本高、速度慢。建议从gpt-3.5-turbo开始。 - 温度(temperature):这个参数控制输出的随机性。范围在0到2之间。对于制卡这种需要稳定、准确输出的任务,强烈建议设置为0或一个很低的值(如0.1)。这样能保证每次对同一段文本生成的卡片都基本一致,避免出现“天马行空”的答案。
- 最大令牌数(max_tokens):限制AI回复的长度。对于制卡任务,可以根据你预估的卡片数量来设置。例如,如果你输入了500字的文本,期望生成10张卡片,每张卡片问答共100字,那么可以设置为1000左右。设置过低会导致回答被截断。
在脚本中,这些参数通常可以在调用openai.ChatCompletion.create函数的地方找到并修改。例如:
response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": final_prompt}], temperature=0.1, # 低温度保证稳定性 max_tokens=1500 # 根据输入长度调整 )5. 高级应用与集成:打造个性化学习流水线
当你熟练使用基本功能后,就可以尝试将这些工具组合起来,甚至与其他脚本结合,打造一个完全自动化的、个性化的学习资料处理流水线。
5.1 组合使用脚本:一个PDF到多种卡片的例子
假设你有一本PDF格式的教科书《生物学导论》第三章。你的目标是既要有普通的问答卡,也要有关键术语的填空卡。
你可以设计这样一个流程:
使用
pdf_to_anki.py生成基础问答卡:python pdf_to_anki.py --input biology_chapter3.pdf --output qa_cards.txt这会得到一套覆盖章节内容的问答卡片。
从同一PDF提取关键术语列表:你可以先写一个简单的脚本,或者手动整理出本章的所有关键术语(如“光合作用”、“叶绿体”、“光反应”、“暗反应”、“卡尔文循环”等),每个术语占一行,保存为
terms.txt。使用
cloze_processor.py或自定义Prompt生成填空卡:将terms.txt作为输入,使用一个专门生成定义的Prompt,或者直接让AI为每个术语生成一个包含该术语的句子并自动添加Cloze标记。# 假设有一个脚本能根据术语列表生成定义句 python generate_definitions.py terms.txt > definition_sentences.txt # 然后处理成填空卡 python cloze_processor.py --input definition_sentences.txt --output cloze_cards.txt合并与导入:将
qa_cards.txt和cloze_cards.txt合并,或者分别导入Anki的不同子牌组。
5.2 与外部工具集成:浏览器插件与剪藏
手动保存文本再运行脚本还是有点麻烦。我们可以结合浏览器插件,实现“一键制卡”。
思路:利用浏览器的“剪藏”功能或插件(如简悦、Raindrop.io等),将网页文章保存为Markdown或纯文本文件,并保存到某个指定文件夹。然后,写一个简单的文件夹监控脚本(可以用Python的watchdog库实现),当这个文件夹出现新文件时,自动触发anki_ai_utils.py进行处理,并将生成的卡片文件移动到另一个“待导入Anki”的文件夹。
这样,你的工作流就变成了:网上看到一篇好文章 -> 点击浏览器插件“保存” -> 片刻之后,对应的Anki卡片文件就已经准备好了。你只需要每天或每周打开Anki批量导入一次即可。
5.3 构建本地知识库与增量更新
对于长期学习的领域(比如编程、医学),你可能会不断往同一个主题牌组里添加新卡片。为了避免重复和冲突,可以建立更精细的管理体系:
- 源文件管理:为每个学习主题建立一个文件夹,里面存放原始的PDF、文本文件,并以日期或版本号命名(如
2023-10-27_生物学_细胞呼吸.pdf)。 - 卡片输出管理:脚本输出的卡片文件也按主题和日期存放。
- 导入前检查:在导入Anki前,用一个简单的脚本对比新生成的卡片和牌组中已有的卡片(可以通过导出牌组内容实现),去除重复的问题。
- 标签自动化:在给AI的Prompt中,可以加入“请为每张卡片添加一个‘#生物学’的标签”这样的指令。这样生成的卡片自带标签,方便在Anki中分类筛选。
6. 常见问题、排查技巧与避坑指南
在实际使用中,你肯定会遇到各种问题。下面是我在大量使用过程中总结的“血泪经验”。
6.1 API调用失败与网络问题
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
报错openai.error.AuthenticationError | API密钥错误或未设置 | 1. 检查环境变量名是否正确(OPENAI_API_KEY)。2. 在终端输入 echo $OPENAI_API_KEY(Linux/Mac)或echo %OPENAI_API_KEY%(Windows CMD)查看是否输出密钥(注意安全)。3. 确保密钥有效且未过期。 |
报错openai.error.RateLimitError | 达到API调用频率或额度限制 | 1. 免费用户有每分钟和每月的调用限制,付费用户也可能有速率限制。 2.解决方案:在脚本中添加重试逻辑和延迟( time.sleep)。对于批量处理大量文件,在每处理一个文件或一定数量请求后暂停几秒。 |
报错openai.error.APIConnectionError或超时 | 网络连接不稳定,或OpenAI服务暂时不可用 | 1. 检查本地网络。 2. 增加请求超时时间( timeout参数)。3. 实现简单的重试机制(如最多重试3次)。 |
| 脚本卡住无响应 | 输入文本过长,超出模型上下文窗口 | GPT-3.5-Turbo和GPT-4都有上下文长度限制(如4K、8K、16K、128K tokens)。如果输入文本太长,API请求会失败或无法返回完整结果。必须对长文本进行分块处理。pdf_to_anki.py应该已经做了,但如果你自己处理长文本,需要手动分割。 |
6.2 卡片生成质量不佳
| 问题表现 | 根因分析 | 优化策略 |
|---|---|---|
| 卡片过于琐碎 | AI把每个句子甚至短语都变成了一张卡。 | 强化Prompt:在指令中明确“请只针对核心概念和重要事实生成卡片,忽略次要细节和举例说明”。可以举例说明什么是“核心概念”。 |
| 卡片问题模糊或答案冗长 | AI没有理解制卡的精髓(简洁、主动回忆)。 | 提供范例:在Prompt中给出一两个完美的卡片例子。“例如:问题:‘光合作用的定义是什么?’ 答案:‘植物利用光能将二氧化碳和水转化为有机物并释放氧气的过程。’” AI的模仿能力很强。 |
| 生成卡片数量太少 | AI可能觉得材料里没多少“重要”信息。 | 1.调整Prompt语气:使用“请尽可能多地生成有价值的问答对”。 2.分而治之:将长文本分成更小的、主题集中的块,分别处理,每个块都能激发AI生成几张卡片。 |
| 答案包含原文没有的信息(幻觉) | AI有时会“自由发挥”,补充一些它“认为”正确但原文没有的信息。 | 1.严厉约束:在Prompt中强调“答案必须严格基于提供的文本,不要添加任何文本之外的信息或推论”。 2.使用低温度值:确保 temperature=0或接近0。3.事后审核:对于重要材料,生成的卡片必须经过人工快速审核,这是目前无法完全避免的步骤。 |
6.3 Anki导入相关错误
| 问题 | 原因 | 解决 |
|---|---|---|
| 导入时提示“字段数量不匹配” | 生成的文本文件格式不对,不是标准的制表符分隔。 | 1. 用文本编辑器(如VS Code、Notepad++)打开输出文件,查看分隔符。确保是Tab,而不是多个空格或逗号。 2. 检查AI的输出是否包含了额外的空行或说明文字。在脚本的解析部分加强清洗逻辑,只保留“问题[Tab]答案”格式的行。 |
| 导入后卡片乱码或格式错乱 | 文本编码问题,或者卡片内容包含了Anki不支持的HTML/特殊字符。 | 1. 确保脚本以UTF-8编码读写文件。 2. 在Prompt中要求AI“不要使用任何Markdown、HTML格式”。 3. 在脚本中对AI返回的内容做简单的字符转义或过滤。 |
| 卡片全部导入到默认牌组 | 没有在导入时指定牌组,或者脚本没有在文件内容中添加牌组信息。 | Anki导入时可以选择目标牌组。更自动化的方式是,在生成卡片文件的第一行添加Anki能识别的牌组标记,例如“#deck:生物学::细胞学”。这需要你了解Anki文本导入的完整格式。 |
6.4 成本控制与效率优化
使用AI API是计费的(除非你用免费的额度)。在大量处理时,成本需要关注。
- 估算成本:OpenAI API按输入和输出的总token数计费。你可以粗略估算:一个中文字约等于1-2个token。处理一段1000字的文本,加上Prompt,输入可能1200 tokens。如果生成10张卡片共500字,输出约500 tokens。总消耗约1700 tokens。GPT-3.5-Turbo每百万tokens成本很低,但积少成多。在脚本运行时打印出消耗的token数是个好习惯。
- 预处理降本:在将文本发送给AI前,先进行人工或简单的自动预处理。删除所有无关内容:广告、版权声明、页眉页脚、重复的参考文献。只保留核心正文。这能显著减少输入的token数,从而省钱并提高AI处理焦点。
- 批量处理与缓存:如果你有大量PDF要处理,最好写一个批处理脚本,顺序运行,并处理好可能的错误中断。对于已经处理过的、内容未变的文件,可以跳过处理,通过记录文件哈希值来实现简单的缓存机制。
- 模型选择:在质量可接受的前提下,始终优先使用
gpt-3.5-turbo,而不是gpt-4,前者成本是后者的几十分之一。
最后,也是最重要的心得:AI是强大的助手,但不是完美的替身。AnkiAIUtils这类工具最大的价值,是帮你完成从“原始材料”到“卡片草稿”的80%的机械性工作。剩下的20%,尤其是卡片的准确性核对、逻辑梳理、以及建立卡片之间的知识联系,必须由你自己来完成。把AI生成的卡片当作第一版草稿,花几分钟快速浏览、修正、润色,甚至合并、拆分,这个“人机协同”的过程,本身就是一个极好的主动学习机会,能让你对知识的记忆更加深刻。
