1. 为什么我把 Obsidian 改造成 LLM Wiki 而不是继续堆笔记
先说结论:Obsidian 本身是个很好的本地知识库工具,但它的默认用法是「人写、人链、人回顾」。当你的收藏夹里躺着几百篇没消化的文章时,靠手动整理基本等于放弃。Karpathy 提出的 LLM Wiki 方法,核心是把知识管理从「临时检索」变成「持续编译」——在原文和问答之间加一层由大模型维护的结构化 wiki,每次新增资料都自动更新主题页、实体页、总结页,还会标注新旧观点的冲突。
这套思路落地到 Obsidian,我把它拆成四层骨架:00_schema放规则和迁移报告,01_raw只放原文真源,02_wiki放结构化知识页面,03_ops放脚本、模板和自动化。历史文章一个字没改,全部迁到01_raw。真正让它「活」起来的关键,是在03_ops层补一个增量同步脚本,每 30 分钟扫描raw里的新稿,补齐到wiki层,把实体、概念、主题、综述、巡检串起来跑完。
但这里有个现实问题:Codex 和 Claude Code 各自要配一套 API Key、Base URL、Model ID,切换工具时改配置改到烦。我试过用 TaoToken 统一 Key 和 API 通道,一个 Key 同时喂给 Codex 和 Claude Code,配置只写一次,后面所有笔记处理脚本都复用同一套环境变量。这篇就把这套配置、Obsidian 插件设置、以及两个工具分别处理笔记的验证动作完整写出来,你可以直接跟着做。
适合谁:已经在用 Obsidian、收藏了一堆文章但没消化、想用 Codex 或 Claude Code 做自动化知识编译的人。不需要你会写复杂脚本,但需要你愿意花半小时把目录骨架和 Key 配好。
2. TaoToken 统一 Key 接入 Codex 与 Claude Code 的前置准备
在动 Obsidian 之前,先把 API 通道打通。这一步做不好,后面所有自动化脚本都会卡在 401 或连接失败上。
TaoToken 的作用是提供一个统一的 API 入口,让你不用为每个工具单独申请和管理 Key。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api (这个不加 UTM 参数,直接用于配置)。
你需要准备的东西:
第一,一个 TaoToken 账号,登录后在控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,进去之后找 API Keys 页面,新建一个 Key,复制出来存好。这个 Key 就是后面 Codex 和 Claude Code 共用的凭证。
第二,确认你要用的模型 ID。TaoToken 支持多种模型,Codex 和 Claude Code 各自偏好的模型不同。你可以在模型对话页面先试一下哪个模型对你的笔记摘要任务效果更好,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。试的时候直接输入一段笔记内容,让它做摘要和实体抽取,看输出质量。
第三,本地环境。Obsidian 装好,Codex CLI 和 Claude Code CLI 都装好。如果你还没装 Claude Code,可以参考接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里的说明。Codex 的安装方式类似,装完后需要配置auth.json。
这里有个关键点:Codex 和 Claude Code 的配置格式不一样。Codex 用auth.json存凭证,Claude Code 用环境变量或 settings 文件。TaoToken 的统一 Key 意味着你只需要记一个 Key,但两个工具各自的配置文件还是要分别写。下面一节我把两套配置都给你,直接复制改 Key 就行。
另外提醒一句:不要把 Key 硬编码在脚本里提交到 Git。用环境变量或者本地.env文件,.env加进.gitignore。我踩过的坑就是早期把 Key 写进同步脚本,结果推代码时差点泄露,后来全部改成读环境变量。
3. 可复制的 TaoToken 配置片段与 Obsidian 目录骨架
这一节是核心,配置写对了后面就顺了。
3.1 Codex 的 auth.json 配置
Codex 读取的配置文件在~/.codex/auth.json(Windows 是%USERPROFILE%\.codex\auth.json)。内容格式如下:
{ "OPENAI_API_KEY": "你的TaoToken Key", "OPENAI_BASE_URL": "https://taotoken.net/api", "model": "你选定的模型ID" }三件套齐了:Base URL 是https://taotoken.net/api,Key 是你从控制台复制的,Model ID 是你在模型对话里试好的那个。保存后 Codex 启动时会自动读取。
3.2 Claude Code 的 settings 配置
Claude Code 用环境变量或者~/.claude/settings.json。推荐用 settings 文件,格式如下:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的TaoToken Key", "ANTHROPIC_MODEL": "你选定的模型ID" } }同样三件套:Base URL、Key、Model ID。注意 Claude Code 的环境变量名是ANTHROPIC_前缀,不是OPENAI_,别搞混。
如果你用 CC Switch 管理多个配置,可以在 CC Switch 里新建一个 profile,把上面这三项填进去,切换时一键生效。Cline MCP 也是类似逻辑,在 MCP 配置里填 Base URL 和 Key。
3.3 Obsidian 目录骨架
在 Obsidian 库根目录下建四个文件夹:
00_schema/ 01_raw/ 02_wiki/ 03_ops/00_schema里放一个rules.md,写清楚命名规范、目录规则、质量标准。比如「实体页命名用entity-实体名.md,主题页用topic-主题名.md,综述页用synthesis-综述名.md」。这个文件是给 LLM 看的规则层,每次处理笔记时把它作为 system prompt 的一部分传进去。
01_raw放原文,从 Obsidian Web Clipper 剪藏的文章直接丢这里。文件名保持原始标题,不要改。
02_wiki放 LLM 生成的结构化页面。你不需要手动维护这个目录,脚本会写。
03_ops放脚本和模板。核心脚本是sync.py,逻辑是:扫描01_raw里新增的.md文件,对每个文件调用 Codex 或 Claude Code 做摘要和实体抽取,把结果写入02_wiki对应的主题页和实体页,最后更新索引。
3.4 增量同步脚本的关键片段
sync.py的核心逻辑不复杂,用 Python 写:
import os import subprocess import json from pathlib import Path RAW_DIR = Path("01_raw") WIKI_DIR = Path("02_wiki") SCHEMA_FILE = Path("00_schema/rules.md") def process_note(note_path): content = note_path.read_text(encoding="utf-8") rules = SCHEMA_FILE.read_text(encoding="utf-8") prompt = f"{rules}\n\n请对以下笔记做摘要、抽取实体和概念、生成双向链接建议:\n\n{content}" result = subprocess.run( ["claude", "-p", prompt], capture_output=True, text=True ) return result.stdout for note in RAW_DIR.glob("*.md"): wiki_content = process_note(note) out_path = WIKI_DIR / f"topic-{note.stem}.md" out_path.write_text(wiki_content, encoding="utf-8") print(f"processed: {note.name}")这个脚本用claudeCLI 处理笔记,你也可以换成codex命令。关键是它读00_schema/rules.md作为规则,保证每次生成的 wiki 页面格式一致。
配好之后,用 cron 或 Windows 任务计划每 30 分钟跑一次。Obsidian 里装一个Obsidian Git插件做版本管理,防止脚本写坏文件。
4. 验证请求:用 Codex 和 Claude Code 分别处理笔记并检查结果
配置写完不算完,得验证真的能跑通。这一节给你两个具体的验证动作。
4.1 用 Claude Code 处理一篇笔记
先手动跑一次,确认 API 通道没问题。在终端里进入 Obsidian 库根目录,执行:
claude -p "读取 01_raw/ 下最新的一篇 md 文件,按照 00_schema/rules.md 的规则,生成摘要、实体列表、双向链接建议,输出为 markdown"如果配置正确,你会看到 Claude Code 返回一段结构化的 markdown,包含摘要、实体、链接建议。如果报 401,说明 Key 或 Base URL 有问题,回去检查~/.claude/settings.json。如果报local proxy failed,检查你的网络环境是否能访问https://taotoken.net/api。
4.2 用 Codex 处理同一篇笔记
codex "读取 01_raw/ 下最新的一篇 md 文件,按照 00_schema/rules.md 的规则,生成摘要、实体列表、双向链接建议,输出为 markdown"Codex 的输出格式可能和 Claude Code 略有不同,但核心内容应该一致。如果 Codex 报reading choices错误,通常是auth.json里的 model 字段没填对,回去确认模型 ID。
4.3 检查 wiki 层生成结果
跑完之后,打开02_wiki目录,应该看到新生成的topic-xxx.md文件。打开检查三件事:
第一,摘要是否准确。如果摘要跑偏了,说明rules.md里的规则不够明确,补充「摘要不超过 200 字,必须包含原文核心论点」这类约束。
第二,实体抽取是否合理。实体应该是人名、工具名、概念名,不是普通词汇。如果抽出来一堆无意义的词,在规则里加「只抽取专有名词和技术术语」。
第三,双向链接建议是否指向已有页面。如果建议的链接在02_wiki里不存在,脚本应该自动创建占位页,或者标记为待创建。
4.4 验证知识图谱生长
Obsidian 的图谱视图是检验这套系统是否「活」起来的最直观方式。打开图谱,你应该看到02_wiki里的页面之间出现连线,而且随着每次同步,连线越来越多。如果图谱里全是孤立的点,说明双向链接没生成成功,回去检查脚本里的链接生成逻辑。
我实测下来,跑通之后最明显的变化是:以前搜一个概念,只能搜到原文;现在搜同一个概念,能搜到 wiki 层里多个相关主题页和实体页,而且每个页面都标注了来源原文。这就是 LLM Wiki 说的「持续编译」——知识不是躺在那里,而是被不断重组和关联。
5. 本篇常见错误排查:401、local proxy failed、reading choices、OAuth
这一节把你会遇到的报错集中列出来,对照解决。
401 Unauthorized
最常见。原因通常是 Key 填错、Key 过期、或者 Base URL 写成了https://taotoken.net而不是https://taotoken.net/api。检查auth.json和settings.json里的 Key 和 URL。注意 Key 不要有多余空格。
local proxy failed
这个报错通常出现在 Claude Code 里,意思是它尝试走本地代理但失败了。检查你的环境变量里有没有残留的HTTP_PROXY或HTTPS_PROXY设置。如果有,清掉再试。另外确认ANTHROPIC_BASE_URL是https://taotoken.net/api,不是别的地址。
reading choices 错误
Codex 特有。通常是auth.json里的 model 字段填了一个不存在的模型 ID。回去模型对话页面确认你选的模型 ID 拼写正确。另外检查 JSON 格式有没有多逗号或少引号。
OAuth 相关报错
Claude Code 有时会尝试走 OAuth 流程而不是 API Key。如果你看到 OAuth 报错,说明它没读到ANTHROPIC_API_KEY。检查settings.json里的env字段是否正确嵌套,或者直接在终端export ANTHROPIC_API_KEY=你的Key再试。
脚本跑完 wiki 层是空的
检查sync.py里的路径。Obsidian 库根目录和脚本执行目录可能不一致。用绝对路径或者os.chdir切到库根目录。另外确认01_raw里确实有.md文件,且文件编码是 UTF-8。
双向链接不生成
检查rules.md里有没有明确要求生成双向链接。LLM 不会自动做这件事,你必须在 prompt 里写清楚「为每个实体和概念生成[[链接]]格式的双向链接建议」。
图谱里全是孤立点
说明 wiki 页面之间的链接没有互相指向。在脚本里加一步:生成新页面后,扫描已有页面,如果新页面里的实体在已有页面中出现过,就在已有页面里补一条反向链接。
排障的核心思路是:先确认 API 通道通(用模型对话页面测),再确认 CLI 配置对(手动跑一次),最后确认脚本逻辑对(检查输出文件)。三步都过了,系统就能稳定跑。
6. 让知识系统持续生长:从手动整理到自动编译的日常动作
配置和排障都搞定之后,日常使用其实很简单。
每天的动作:用 Obsidian Web Clipper 剪藏一篇文章,直接丢进01_raw。后面脚本每 30 分钟跑一次,自动把新素材编译进02_wiki的索引和关联。你只需要去02_wiki看 topic 和 synthesis 页面,直接开始写作和思考。
我现在每天打开 Obsidian,先看图谱视图有没有新连线,再看02_wiki里有没有新生成的综述页。如果有,点进去读一遍,把 LLM 的归纳和我自己的判断对照,觉得对的就保留,觉得偏的就手动改。这个过程本身就是一次知识消化。
如果你今天就想开始,最快的改造方式:用你本地的 Claude Code 或 Codex,把 Karpathy 那篇文章和这篇一起丢给 AI,让它参考着对本地 Obsidian 目录做改造。操作时尽量保留原来知识库的结构,分批次先把最近最常看的目录迁到01_raw,把流程跑通后再迁剩下的。
长期编码和 Agent 场景的话,可以考虑 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,适合需要持续跑自动化脚本的情况。如果只是验证模型效果,用模型对话页面就够了。
这套东西不是银弹。如果丢进去的原文本身很散,或者长期不做巡检,系统会越来越大但不一定越来越准。它是一个持续维护的工作台,不是一次性搭完就完事的工程。但只要你保持每周花十分钟看一眼 wiki 层的生成质量,及时调整rules.md里的规则,它会越用越顺手。
最后说一个实用技巧:在00_schema/rules.md里加一条「每次生成 wiki 页面时,如果发现新资料和已有页面观点冲突,在页面顶部用> 冲突提示标注出来」。这样你回顾时能一眼看到知识演进的过程,而不是被一堆看似一致的结论淹没。这个细节是我用了两个月之后才加上的,加了之后知识库的「成长感」明显强了很多。