项目背景
很多人读书喜欢做笔记,但整理起来费时费力。手写一段话,要手动提炼重点,排版成好看的格式,还要归档。
我做了个小工具,把原始笔记丢进去,AI 自动帮你做三件事:提炼核心观点、总结关键金句、生成可复用的 Markdown 知识卡片。跑在 VPS 上,零人工干预。
技术选型
- Python 3.10+:主语言
- OpenAI / 兼容 API:调用 LLM 做文本分析(可用任何兼容 OpenAI 格式的 API,比如通义千问、智谱)
- pathlib + glob:文件读取
- rich:终端美化输出
全程不需要框架,一个脚本搞定。
实现步骤
第一步:安装依赖
pip install openai rich
第二步:创建配置
创建 .env 文件,填上你的 API Key 和基础 URL:
OPENAI_API_KEY=sk-xxxxxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
安装 python-dotenv 来读取配置:
pip install python-dotenv
第三步:写核心代码
创建 note_card_generator.py:
import os
import glob
from pathlib import Path
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL"),
)
PROMPT_TEMPLATE = """你是一个知识整理助手。请对以下读书笔记进行处理:
1. 提炼 3-5 个核心观点,每个观点不超过 30 字
2. 找出 1-2 句最有价值的原文金句
3. 给出一个一句话总结
4. 打上 3 个以内的标签
原始笔记:
{note}
请按以下 Markdown 格式输出:
# 📌 {book_name}
## 核心观点
- 观点一
- 观点二
- 观点三
## 金句
> 原文金句
## 一句话总结
一句话总结
## 标签
#标签1 #标签2
书名从笔记内容中自行判断。如果无法判断书名,用"未命名"代替。
"""
def generate_card(text: str, book_name: str = None) -> str:
"""调用 LLM 生成知识卡片"""
if book_name is None:
book_name = "未命名"
prompt = PROMPT_TEMPLATE.format(note=text, book_name=book_name)
response = client.chat.completions.create(
model=os.getenv("MODEL_NAME", "gpt-4o-mini"),
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
)
return response.choices[0].message.content.strip()
def save_card(card_text: str, book_name: str, output_dir: str = "cards"):
"""保存知识卡片到文件"""
Path(output_dir).mkdir(exist_ok=True)
safe_name = "".join(c if c.isalnum() else "_" for c in book_name)
filename = f"{output_dir}/{safe_name}.md"
with open(filename, "w", encoding="utf-8") as f:
f.write(card_text)
return filename
def batch_process(notes_dir: str = "notes", output_dir: str = "cards"):
"""批量处理目录下的所有笔记文件"""
note_files = glob.glob(f"{notes_dir}/*.md") + glob.glob(f"{notes_dir}/*.txt")
if not note_files:
print(f"在 {notes_dir} 目录下没有找到笔记文件")
return
for filepath in note_files:
with open(filepath, "r", encoding="utf-8") as f:
content = f.read().strip()
if not content:
continue
book_name = Path(filepath).stem
print(f"📖 处理: {book_name}...")
card = generate_card(content, book_name)
saved_path = save_card(card, book_name, output_dir)
print(f"✅ 卡片已保存: {saved_path}\n")
if __name__ == "__main__":
batch_process()
第四步:准备笔记文件
在 notes/ 目录下放你的读书笔记,文件名即书名:
mkdir -p notes
创建 notes/设计心理学.md:
唐纳德在《设计心理学》中提到,好的设计应该让用户无需说明书就能知道怎么用。
他把"可见性"列为第一个原则。按钮应该长得就像按钮,开关应该让人一眼看出是开还是关。
书中举了一个经典的门锁例子:门把手的形状暗示了你应该拉还是推,
如果门把手是拉杆样式,但实际需要推才能打开,这就是设计的失败。
唐纳德还提出了"反馈"的重要性。每一步操作都应该有即时反馈,
让用户知道自己做对了还是做错了。比如微波炉启动时有声音,洗衣机结束时有提示音。
核心思想:以用户为中心的设计,而不是以技术为中心。
第五步:运行
python note_card_generator.py
输出效果:
📖 处理: 设计心理学...
✅ 卡片已保存: cards/设计心理学.md
生成的 cards/设计心理学.md 内容示例:
# 📌 设计心理学
## 核心观点
- 好的设计让用户无需说明书就能使用
- 可见性是设计的第一原则
- 操作必须有即时反馈
- 设计应以用户为中心
## 金句
> 如果门把手是拉杆样式,但实际需要推才能打开,这就是设计的失败。
## 一句话总结
设计要让产品功能自然可见,操作反馈即时明确,真正以用户认知习惯为导向。
## 标签
#设计原则 #用户体验 #人机交互
运行效果
跑完脚本后,你在 cards/ 目录就能看到整理好的知识卡片。每张卡片结构统一,方便后续导入 Obsidian 或 Notion 做知识管理。
你可以加更多笔记文件,一次性批量处理:
# 放 10 篇笔记到 notes/ 目录
cp book_notes/*.md notes/
# 一次全部生成
python note_card_generator.py
优化方向
- 增加查重功能:对比已有卡片,避免重复记录相似内容
- 对接 Obsidian Vault:直接写入指定 vault 目录
- 添加图片支持:配合 AI 图像模型生成每本书的封面
- Web 界面:用 Streamlit 搭一个上传笔记、预览卡片的简单页面
- 支持多模型:加入本地模型(如 Ollama)作为免费替代方案
- 定时任务:用 cron 每天早上自动处理前一天添加的笔记
这个工具最值钱的地方在于,它把"记录→整理→输出"三个环节串起来了。你只需要专注写笔记,剩下的交给 AI。
试试把你的读书笔记丢进去,看看 AI 整理出的卡片和你自己的整理有什么差异?