每天刷文章、看视频、收藏资料,一天下来似乎很充实,但到了月底回头一看,真正能调用的知识少得可怜。这不是个例,而是大多数人在信息输入阶段都会踩的坑。本文要分享的,是一套用 AI 配合 Obsidian 搭建的智能学习产出工作流,核心思路是:把 Obsidian 当作本地知识库和操作界面,把 AI 当作加工引擎,让每条收集到的资料都能自动完成摘要、提炼、延伸和归档,最终变成每天可执行的行动。
1. 为什么要用 AI + Obsidian 搭学习产出工作流
1.1 学习输入与产出之间的断裂
大多数人记笔记的方式可以概括为“复制粘贴”三个阶段:看到一篇好文章,复制链接;保存到收藏夹,复制标题;心情好的时候,再粘贴到笔记软件里。但收藏不等于学会,复制不等于理解。真正的问题在于,输入环节和产出环节之间缺少了一个“加工”的步骤。
什么叫做加工?就是读完一段内容之后,能够用自己的话概括核心观点,能够提炼出和自己工作相关的行动项,能够提出进一步的问题,并把这些内容放到一个未来能找到的地方。没有这个加工步骤,笔记就只是信息堆,而不是知识资产。长期下来,知识库越堆越大,能调用的却越来越少,这就是很多人每年买课、每年记笔记、却没有看到明显成长的根本原因。
1.2 AI 与 Obsidian 组合能补齐什么
Obsidian 是一个基于本地 Markdown 文件的笔记工具,它没有把笔记锁在某个数据库里,所有内容都是纯文本,方便检索、备份和程序化处理。这是它和其他笔记软件最大的不同:笔记天生就是“可编程”的,你完全可以用脚本去读写每一篇笔记。
而 AI 大模型擅长的事情,恰恰是阅读长文本、概括要点、提取结构、生成追问。这两者结合起来,就正好补上了加工环节的缺口。AI 负责把一篇杂乱的文章变成结构化的摘要、知识点和行动建议,Obsidian 负责把这些结果保存、关联和沉淀下来。换句话说,AI 是加工引擎,Obsidian 是知识仓库,两者之间用 Markdown 文件作为唯一的数据交换格式,既简单又稳定。
1.3 什么情况下值得建这套工作流
如果你只是偶尔记录几条灵感,那这套工作流确实有点重,直接用系统自带备忘录就够了。但如果你每周会阅读大量公众号文章、技术文档、课程笔记,或者经常需要把学习内容转化为周报、分享稿、项目方案,那么这套工作流的价值就会非常明显。
它适合的人群大致有三类:第一类是需要持续输入新知识的内容创作者,比如技术博主、产品经理、运营;第二类是经常要输出方案或总结的职场人;第三类是想要把读书、听课、刷文章变成系统知识体系的学习者。判断标准其实很简单:如果你每天花在“收集资料”上的时间超过 30 分钟,就已经值得把这套自动化工作流建起来了。
2. 环境准备与工具选型
2.1 基础环境清单
这套工作流需要的环境并不复杂,核心只有三样东西。
- Obsidian 客户端:Windows、macOS、Linux 都有官方客户端,直接到官网下载即可。安装过程不需要额外配置,创建一个 Vault(知识库目录)就能开始使用。如果你之前已经建过 Vault,也可以把后续的目录结构直接加进去。
- Python 3.9 及以上:用来写 AI 加工脚本。Obsidian 本身不依赖 Python,但通过脚本读写 Markdown 文件、调用大模型接口,Python 是成本最低的方案。Windows 用户在安装 Python 时记得勾选“Add Python to PATH”,否则命令行可能找不到 python 命令。
- 一个大模型接口:可以是 OpenAI 兼容接口,也可以是本地模型运行时。具体选型方案见下一小节。
版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。Obsidian 的插件版本更新非常频繁,社区插件的安装路径和名称可能会随版本变化,遇到不一致时以你当前版本的实际界面为准。
2.2 AI 服务接入的三种方式
第一种是 OpenAI 兼容接口。现在很多大模型服务商都提供与 OpenAI Chat Completions 格式一致的接口,只需修改 base_url 和 model 名称就能切换。这种方式的优点是接入简单、效果稳定,缺点是需要网络请求,并且按 token 计费。对于每天几十篇笔记的加工量,成本通常非常低,但具体费用要根据实际使用量估算。
第二种是本地模型。用 Ollama 这类工具可以在本地运行 Qwen、Llama 等开源小模型。优点是数据不出本机、免费、离线可用,缺点是效果和响应速度取决于机器配置,一般消费级电脑跑中小尺寸模型可以接受,但生成质量会比大模型服务差一些。如果你对数据隐私要求很高,可以考虑这种方式。
第三种是工作流平台。像 Dify、Coze 这类平台可以把 AI 能力封装成可视化工作流,再对外提供 API。适合需要多步判断、多工具调用的场景,比如先摘要再分类再生成行动项。缺点是上手成本略高,适合有额外自动化需求的同学。本文的示例脚本走第一种方式,但代码结构上只依赖标准的 HTTP 接口,改成其他两种方式也不复杂。
2.3 插件清单与作用
为了不让工作流变得复杂,我们只选择四个插件,它们分别负责模板、捕获、查询和剪藏。
| 插件 | 安装位置 | 作用 |
|---|---|---|
| Templater | Obsidian 社区插件市场 | 模板引擎,生成日记、周报和笔记模板 |
| QuickAdd | Obsidian 社区插件市场 | 快捷捕获入口,把任意内容快速放入 Inbox |
| Dataview | Obsidian 社区插件市场 | 按 Frontmatter 元数据查询和聚合笔记 |
| Web Clipper | 浏览器插件商店 | 一键把网页内容剪藏到指定目录 |
这四个插件都是 Obsidian 生态里非常成熟的老牌插件,使用范围广、资料多。安装方法是在 Obsidian 的“设置”中找到“第三方插件”,关闭“安全模式”后搜索插件名即可。如果下载插件速度较慢,可以尝试使用镜像源,或者去 GitHub Releases 手动下载插件压缩包,再解压放到 Vault 目录下的.obsidian/plugins文件夹中。
3. 工作流核心原理拆解
3.1 三层架构:收集、加工、产出
在动手配置之前,先把工作流的整体架构讲清楚。这套体系可以拆成三层。
第一层是收集层。所有外部输入都先进入一个统一的收件箱目录 Inbox,不做任何整理。这样做的目的是降低记录成本:你不需要在记录的瞬间思考“这条笔记该放哪里”,只需要确保它进入 Inbox 即可。记在 Inbox 里的内容可以是一段摘录、一个灵感、一个会议要点,甚至可以只是一条链接。
第二层是加工层。脚本定时扫描 Inbox,对未处理的笔记调用 AI 接口,生成核心观点、可执行知识点、延伸思考和建议归档分类,并把结果追加到原笔记末尾,同时打上已处理标记。这一步替代了过去“人工读一遍、概括一遍、归类一遍”的工作。
第三层是产出层。经过加工后,笔记不再只是原文摘录,而是包含摘要和行动建议的知识卡片。你可以通过 Dataview 查询本周处理了哪些笔记,也可以直接把 AI 生成的行动项复制到每日计划里。所谓学习产出,指的就是这些能落地的行动项和以后能随时调用的知识卡片。
收集层(Inbox) -> 加工层(AI 脚本 + 大模型接口) -> 产出层(知识卡片 / 行动项)3.2 用 YAML Frontmatter 统一笔记元数据
要让脚本和 Dataview 能自动识别笔记状态,必须在每篇笔记的头部写入统一的元数据,也就是 YAML Frontmatter。它是一段放在 Markdown 文件最顶部的键值对,左右两侧用三个短横线包裹。
--- 日期: 2025-01-15 来源: 公众号文章 状态: 待整理 tags: [inbox, 学习方法] ---把元数据设计成统一结构,最大的好处是机器可读。当脚本读到“状态: 待整理”时,就知道这是一篇尚未加工的笔记;处理完成后再把状态改成“已加工”,Dataview 查询时就能快速过滤。这里有一个容易忽略的细节:YAML Frontmatter 必须放在文件的第一行,前面不能有任何空行或空格,否则 Obsidian 无法正确解析。
3.3 AI 的角色边界:初稿交给模型,终稿留给自己
很多人在使用 AI 辅助学习时容易走入两个极端:要么完全不相信 AI 生成的内容,要么全盘接受 AI 的输出。正确的做法是明确人机协作的边界。
AI 适合做的是结构化加工:概括、提炼、生成延伸问题、判断分类。这些任务对错误容忍度相对较高,即使某个表述不准确,你也能在阅读时快速发现。AI 不适合做的是价值判断和事实核验:比如“这个观点对不对”“这个数据是否真实”,这些问题必须由你来判断。
所以在设计工作流时,我建议把 AI 的输出定位为“第一版草稿”,而不是“最终答案”。脚本生成的摘要和行动项,应该以独立区块追加在原文后面,不覆盖原文,也不自动移动到最终目录。等你人工审核过后,再决定是保留、修改还是删除。
4. 完整实战:从零搭一套可运行的智能学习产出工作流
下面进入实操环节。整个流程分为五个步骤:创建目录结构、编写模板、编写脚本、运行验证、配置自动执行。
4.1 创建 Vault 目录结构
在你的 Obsidian Vault 根目录下创建以下目录结构。命名方式参考了 PARA 方法和 Inbox 收件箱思想,既简洁又容易扩展。
MyVault/ ├── 00-Inbox/ # 所有外部输入先进这里 ├── 10-Sources/ # 文章、视频、书籍等原始资料 ├── 20-Areas/ # 长期关注的领域 ├── 30-Projects/ # 有明确目标和截止时间的项目 ├── 40-Archive/ # 归档区 ├── 50-Templates/ # 模板文件 └── scripts/ # Python 脚本和日志目录建好之后,在“设置”里把 Obsidian 的默认新笔记位置设置为00-Inbox,这样通过 Obsidian 新建的笔记也会自动进入收件箱,不会散落在根目录。
4.2 编写日记模板和快捷捕获入口
在50-Templates目录下新建一个日记模板.md,内容如下。这个模板用 Templater 语法自动填充日期、星期、目标等字段。
--- 日期: {{date:YYYY-MM-DD}} 星期: {{date:dddd}} 今日目标: 状态: 待整理 tags: [daily, inbox] --- ## 今日行动清单 - [ ] ## 今日收集 - 阅读摘录: - 灵感碎片: - 会议要点: ## 今日思考 ## 今日产出然后在 Obsidian 的命令面板中运行 Templater 的“Create new note from template”,选择这个模板,就能生成当天的日记。如果你希望每天自动生成日记,可以配合 Periodic Notes 插件,这里先不做扩展。
接下来配置快捷捕获入口。打开 QuickAdd 设置,新建一个 Capture 动作,名称可以叫“捕获”。在 Capture 格式中填入手写模板,并把新文件位置设置到00-Inbox目录。
--- 来源: {{VALUE}} 日期: {{DATE:YYYY-MM-DD}} 状态: 待整理 tags: [inbox, captured] --- # {{VALUE}}QuickAdd 的 Capture 模式支持两个占位符:{{VALUE}}表示你输入的内容,{{DATE:YYYY-MM-DD}}表示当前日期。配置完成后,给这个动作绑定一个快捷键,比如 Ctrl+Shift+X。之后无论你在哪里看到值得保存的内容,按一下快捷键,输入一句话,Obsidian 就会自动把这条内容写入 Inbox。
4.3 编写 AI 加工脚本
这是整套工作流的核心。脚本的作用是扫描00-Inbox下的 Markdown 文件,对未处理的笔记调用大模型接口,生成结构化分析结果,并追加到笔记末尾。下面是一个完整可运行的 Python 脚本,请保存到scripts/ai_processor.py。
# 文件路径:MyVault/scripts/ai_processor.py """ AI 笔记加工脚本 功能:扫描 00-Inbox 目录下的未处理笔记,调用大模型 API 生成摘要、行动项和延伸问题,并回写到原笔记末尾。 用法:python3 scripts/ai_processor.py """ import os import sys import datetime from pathlib import Path import requests # ---- 配置区 ---- VAULT_ROOT = Path.home() / "Documents" / "MyVault" INBOX_DIR = VAULT_ROOT / "00-Inbox" PROCESSED_TAG = "ai_processed" API_KEY = os.environ.get("LLM_API_KEY", "") API_URL = os.environ.get("LLM_API_URL", "https://api.openai.com/v1/chat/completions") MODEL = os.environ.get("LLM_MODEL", "gpt-4o-mini") MAX_NOTE_LENGTH = 6000 # 截断长度,防止上下文超限 def call_llm(user_prompt: str, system_prompt: str = "你是一名严谨的学习教练,擅长把笔记提炼成可执行的知识。") -> str: """调用 OpenAI 兼容的 Chat Completions 接口""" if not API_KEY: raise RuntimeError("未设置 LLM_API_KEY 环境变量") headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json", } payload = { "model": MODEL, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ], "temperature": 0.3, } resp = requests.post(API_URL, headers=headers, json=payload, timeout=120) resp.raise_for_status() data = resp.json() return data["choices"][0]["message"]["content"].strip() def build_prompt(note_content: str) -> str: """构造处理一篇笔记的提示词""" return f"""请阅读下面这篇学习笔记,完成以下任务: 1. 用三句话概括核心观点; 2. 提炼 3 个可以立即实践的知识点; 3. 提出 2 个值得进一步思考的问题; 4. 判断这篇笔记应该归档到哪个分类(10-Sources / 20-Areas / 30-Projects / 40-Archive)。 请用 Markdown 格式输出,结构如下: ## 核心观点 ## 可执行知识点 ## 延伸思考 ## 建议归档 原文: {note_content} """ def process_note(file_path: Path) -> bool: """处理单篇笔记,返回是否处理成功""" content = file_path.read_text(encoding="utf-8") # 跳过已经处理过的文件,避免重复调用 API if PROCESSED_TAG in content: print(f"[跳过] {file_path.name} 已处理过") return False print(f"[处理] {file_path.name} ...") prompt = build_prompt(content[:MAX_NOTE_LENGTH]) try: result = call_llm(prompt) except Exception as exc: print(f"[失败] {file_path.name}: {exc}") return False now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") block = f""" --- ## AI 分析 {result} > 生成时间:{now} > 生成方式:ai_processor.py {PROCESSED_TAG}: true """ # 追加到文件末尾,保留原文 file_path.write_text(content.rstrip() + block, encoding="utf-8") print(f"[完成] {file_path.name}") return True def main(): if not INBOX_DIR.exists(): print(f"目录不存在: {INBOX_DIR}") sys.exit(1) notes = sorted(INBOX_DIR.glob("*.md")) if not notes: print("00-Inbox 目录下没有 Markdown 文件") return success_count = 0 for note in notes: if process_note(note): success_count += 1 print(f"处理完成:成功 {success_count} 篇,共扫描 {len(notes)} 篇") if __name__ == "__main__": main()脚本主要包含四个部分。
配置区定义了 Vault 路径、Inbox 目录、API 地址和模型名称。这里的 API Key 通过环境变量读取,而不是硬编码在脚本里,目的是避免密钥泄露到笔记库或版本仓库中。API_URL默认指向 OpenAI 兼容地址,如果你使用其他服务商,只需要改成对应的接口地址即可。
call_llm函数封装了请求逻辑。它把系统提示词和用户提示词一起发送给模型,temperature设置为 0.3,让输出尽量稳定、贴近原文内容,少一些发散。超时时间设置为 120