
1. 笔记库越写越乱问题到底出在哪Obsidian 用满一年之后几乎所有人都会撞上同一堵墙文件夹里躺着几百篇笔记双链像蜘蛛网一样四处延伸标签越加越多却越来越不敢点开。你想找三个月前写的那篇关于「向量检索」的笔记记得它链过「RAG」也打过#检索标签可图谱视图一打开密密麻麻的节点糊成一团根本看不出哪块是核心、哪块是孤岛。这不是你记性差而是 Obsidian 原生图谱只呈现「链接关系」不呈现「语义结构」。它告诉你 A 链到 B却不告诉你 A 和 B 到底在讲同一件事还是只是顺手提了一嘴。当笔记量超过两三百篇图谱就从「知识地图」退化成「毛线团」。我试过手动整理给每篇笔记补 frontmatter、重命名标签、拆分子文件夹。坚持了两周就放弃了因为整理速度永远追不上记录速度。真正有效的思路是让 AI 读一遍笔记内容按语义聚类再输出成一张结构清晰的 JSON Canvas 逻辑图——Obsidian 原生支持.canvas文件打开就是可拖拽的思维导图。这篇要交付的就是这条链路用 opencode 作为 AI 工具入口通过 TaoToken 统一 Key 接入 Skills 能力把凌乱笔记自动整理成 JSON Canvas。全程可复制配置骨架和验证动作都会给全。适合已经有一堆笔记、想一次性做次「深度 SPA」的 Obsidian 用户也适合想搞懂 Skills 和 MCP 区别的开发者。2. 为什么用 Skills 而不是 MCP以及 TaoToken 的角色先说清楚一个常见困惑有了 MCP为什么还要 SkillsMCP 是「工具扩展」——它让 AI 能调用外部函数比如查数据库、发请求、读文件。它解决的是「AI 能做什么」。Skills 是「知识包」——它教会 AI 如何更好地执行某类任务包含提示词、模板、示例和约束。它解决的是「AI 怎么做才对」。打个比方MCP 是给 AI 装了一双手Skills 是给这双手配了一本操作手册。你要让 AI 生成符合 Obsidian 规范的 JSON Canvas光有写文件的能力不够还得知道 canvas 的节点格式、边格式、分组规则——这些正是json-canvas这个 Skill 封装的内容。Obsidian CEO kepano 开源的三大 Skills 正好覆盖了这次任务Skill 名称作用本次是否用到json-canvas创建和编辑.canvas文件生成画布、思维导图、流程图核心使用obsidian-bases创建和编辑.base文件表格/卡片视图、过滤器、公式可选扩展obsidian-markdown创建和编辑 Obsidian 风味 Markdown支持 wikilinks、callouts、属性、标签辅助整理那 TaoToken 在这里干什么opencode 本身支持接入多家模型但如果你想让笔记整理这种批量任务稳定跑、不排队、不被免费额度卡住就需要一个统一的 API 通道。TaoToken 提供的就是这个一个 Key 走通多家模型接口兼容主流格式配置一次就能在 opencode 里长期用。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。换句话说Skills 负责「怎么整理」opencode 负责「执行整理」TaoToken 负责「让执行稳定且可控」。3. 前置准备opencode 安装与 Skills 落位3.1 安装 opencodemacOS 用户直接brew install anomalyco/tap/opencode其他系统用官方脚本curl -fsSL https://opencode.ai/install | bash装完在终端输入opencode --version能出版本号就说明成功。3.2 把 Skills 放进项目先拿到 kepano 的 Skills 仓库三个目录分别是json-canvas、obsidian-bases、obsidian-markdown。把它们整体放到你 Obsidian 仓库根目录下的.opencode/skills/里。如果你还没有.opencode目录先进入仓库跑一次 opencode它会自动生成cd /你的Obsidian仓库路径 opencode退出后目录就出现了。macOS 下.opencode是隐藏的按Command Shift .显示点开头的文件。Windows 用户同理找到仓库根目录手动建.opencode/skills/即可。最终结构应该是你的仓库/ ├── .opencode/ │ └── skills/ │ ├── json-canvas/ │ │ └── SKILL.md │ ├── obsidian-bases/ │ │ └── SKILL.md │ └── obsidian-markdown/ │ └── SKILL.md ├── 笔记A.md └── 笔记B.md3.3 配置 TaoToken 接入参数opencode 的模型配置写在项目根目录的opencode.json或全局配置里。下面是一份可直接复制的骨架把你的TaoTokenKey换成你在控制台创建的 Key{ $schema: https://opencode.ai/config.json, provider: { taotoken: { npm: ai-sdk/openai-compatible, name: TaoToken, options: { baseURL: https://taotoken.net/api, apiKey: 你的TaoTokenKey }, models: { claude-sonnet-4-5: { name: Claude Sonnet 4.5 }, gpt-4.1: { name: GPT-4.1 } } } }, model: taotoken/claude-sonnet-4-5 }Key 的创建入口在控制台的 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建后复制一次粘贴进上面的apiKey字段。注意baseURL必须写https://taotoken.net/api不要带任何查询参数否则部分客户端会拼接出错误路径。配置保存后在 opencode 里输入/models应该能看到taotoken/claude-sonnet-4-5出现在列表里。选中它后续所有请求就走 TaoToken 通道了。4. 验证 Skills 是否被正确加载配置完别急着整理笔记先做一次最小验证确认 opencode 真的扫描到了 Skills。在仓库目录下启动 opencodecd /你的Obsidian仓库路径 opencode然后在输入框直接问我有那些 Skills如果配置正确opencode 会列出json-canvas、obsidian-bases、obsidian-markdown三个技能并说明各自的用途。这一步很关键——如果它只回「没有找到 Skills」说明目录层级放错了回去检查.opencode/skills/下是不是直接就是三个技能文件夹而不是多套了一层。确认加载成功后opencode 会在后续任务里自动判断该调用哪个 Skill你不需要手动指定。比如你说「把这几篇笔记整理成画布」它会自己检索到json-canvas并按其规范生成文件。5. 实战从凌乱笔记到 JSON Canvas 逻辑图5.1 准备待整理的笔记选一个语义相关的笔记子集比如所有带#RAG标签的笔记或者某个文件夹下的 10 到 20 篇。数量别太多第一次跑建议控制在 20 篇以内方便你核对结果。5.2 下达整理指令在 opencode 输入框里写清楚任务边界比如读取当前仓库中所有带 #RAG 标签的 Markdown 笔记 按主题语义聚类生成一个 JSON Canvas 文件 文件名 rag-map.canvas放在仓库根目录。 每个聚类用一个 group 节点表示笔记作为 file 节点 聚类之间如果有明显关联用 edge 连起来并标注关系。这里的关键是「按主题语义聚类」——这正是 Skills 发挥作用的地方。json-canvas会告诉模型 canvas 的合法节点类型text、file、link、group和边格式避免生成 Obsidian 打不开的非法 JSON。5.3 检查生成结果跑完后仓库根目录会出现rag-map.canvas。用文本编辑器打开结构大致是这样{ nodes: [ { id: group-1, type: group, label: 检索策略, x: -400, y: -200, width: 600, height: 400 }, { id: note-1, type: file, file: 向量检索入门.md, x: -350, y: -150, width: 300, height: 200 } ], edges: [ { id: edge-1, fromNode: note-1, toNode: note-2, label: 前置知识 } ] }5.4 在 Obsidian 中打开回到 Obsidian如果文件列表里看不到.canvas文件去「设置 → 核心插件」里把「Canvas」打开。然后双击rag-map.canvas你就能看到一张按语义分组的逻辑图同一主题的笔记聚在一个框里跨主题的关联用带标签的线连起来。到这一步原本糊成一团的图谱就变成了一张能看懂的结构图。你可以手动拖动节点微调位置Obsidian 会自动保存回 canvas 文件。6. 本篇常见错排查报错一opencode 说找不到 Skills。九成是目录层级问题。正确路径是.opencode/skills/json-canvas/SKILL.md如果你放成了.opencode/skills/json-canvas/json-canvas/SKILL.md就多套了一层。删掉多余那层即可。报错二模型请求 401 或 403。检查opencode.json里的apiKey是否完整复制有没有多余空格。如果 Key 没问题确认baseURL写的是https://taotoken.net/api末尾不要加斜杠。报错三生成的 canvas 文件 Obsidian 打不开。多半是 JSON 格式非法比如节点缺少id或type字段。让 opencode 重新生成时加一句「严格遵循 json-canvas Skill 的 schema生成后用 JSON 解析器自检一遍」。报错四模型不调用 Skill直接凭记忆写。在指令里显式提一句「使用 json-canvas Skill 的规范来生成」能显著提高命中率。Skills 是知识包模型需要被提示才会去读。报错五整理结果聚类混乱。通常是笔记本身语义太散或者一次喂了太多不相关的内容。缩小范围先按标签或文件夹圈定一个主题再跑一次。7. 把这条链路固定下来跑通一次之后你可以把常用指令存成 opencode 的模板下次换一批笔记直接复用。如果后续要长期做笔记整理、批量生成 canvas、甚至让 Agent 自动维护知识库建议把模型通道固定到 Coding Plan避免每次临时找 Keyhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想先手动试几个模型对比整理效果可以直接在模型对话页切换https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入细节和参数说明都在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后给一个我踩过的坑第一次跑的时候我贪心把整个仓库 300 多篇笔记全丢进去结果模型上下文爆了生成的 canvas 只有前几十篇。后来改成按标签分批每批 15 篇左右质量稳定很多。笔记整理这事宁可小步快跑别想一口吃成胖子。