资源描述
一款面向知识工作者的智能双向同步工作流,利用LLM语义解析将Notion数据库自动转化为结构化Obsidian笔记,支持实体识别、关系抽取与Frontmatter知识图谱生成。适用于构建个人第二大脑、学术文献管理及团队知识沉淀场景,显著提升跨平台知识复用效率与语义连通性。
详细内容
# Notion → Obsidian Sync with Semantic Linking 工作流指南
## 工作流概述
本工作流实现 Notion 数据库到 Obsidian 的**语义增强型双向同步**:当 Notion 中条目更新时,通过本地/云脚本触发 LLM(如 Ollama + Llama3 或 OpenAI API)对内容进行实体识别与关系抽取,自动生成符合 Obsidian 语义约定的 Markdown 文件(含 `[[双向链接]]`、`#tag`、YAML Frontmatter 知识图谱字段),并支持反向编辑同步(需配合 Obsidian 插件如 *Notion Sync* 或 *Smart Connections*)。核心价值在于将静态笔记升级为动态知识网络。
## 分步骤操作说明
### 步骤 1:环境准备与依赖安装
- 安装 Python 3.9+、Node.js 18+;
- 安装 Obsidian v1.6.0+([官方发布页](https://github.com/obsidianmd/obsidian-releases/releases/tag/v1.6.0))并启用「Core Plugin: Templater」与「Community Plugin: Dataview」;
- 在 Notion 中创建启用 API 的 Integration,并赋予对应 Database 权限;
- 配置本地 LLM 环境(推荐 Ollama + `llama3:8b`)或设置 OpenAI API Key(`OPENAI_API_KEY` 环境变量)。
### 步骤 2:配置 Notion 数据源
- 获取目标 Database 的 `database_id`(URL 中 `?v=` 后的 ID 或通过 Notion API Explorer 查看);
- 在 Database 中添加 `Last Synced`(Date)与 `Obsidian UID`(Text)属性,用于幂等控制与双向映射;
- 建议为每条记录设置唯一 `Title` 字段作为后续笔记文件名基础。
### 步骤 3:部署同步脚本(Python 示例)
- 克隆开源同步器(如 [`notion-obsidian-sync`](https://github.com/kevintuhumury/notion-obsidian-sync) 或自建脚本);
- 修改 `config.py`:填入 Notion API Token、Database ID、Obsidian Vault 路径、LLM 模型类型(`ollama`/`openai`)及系统提示词(见下方语义提取模板);
- 系统提示词示例(保留英文关键词确保 LLM 理解):
```
You are a knowledge engineering assistant. Extract named entities (PERSON, ORG, CONCEPT, DATE) and semantic relations (e.g., "causes", "part-of", "related-to") from the input text. Output ONLY valid YAML with keys: entities: [...], relations: [{source: "X", target: "Y", type: "Z"}], summary: "<1-sentence summary>".
```
### 步骤 4:生成 Obsidian 笔记并注入语义结构
- 运行 `python sync.py --mode full` 首次全量同步:
- 为每条 Notion 记录生成 `.md` 文件(路径:`vault/Notion/{DatabaseName}/{Title}.md`);
- Frontmatter 包含:`uid`(Notion Page ID)、`notion_url`、`last_synced`、`entities`、`relations`;
- 正文自动插入 `[[Entity]]` 双向链接(基于 `entities` 列表);
- 添加 `#notion-sync` 标签及 `date:: {{date}}` Dataview 兼容字段。
### 步骤 5:启用增量监听与反向同步(可选进阶)
- 使用 `notion-sdk-python` 的 `Event API` 或轮询 `last_edited_time` 实现变更监听;
- 配置 Obsidian 插件 *Smart Connections* 或自定义 DataviewJS 查询,将 `relations` 中的 `target` 自动渲染为 `[[target]]` 并高亮关联路径;
- 反向同步需在 Obsidian 中编辑后调用 Notion API 更新对应 Page(建议仅同步 `Content` 和 `Tags` 字段,避免覆盖 Notion 原生属性)。
## 注意事项与最佳实践
- ✅ **安全第一**:Never commit API tokens to Git;使用 `.env` 文件加载敏感配置;
- ✅ **语义一致性**:LLM 提示词中明确定义实体类型(如 `CONCEPT` 指抽象概念,非泛指名词),避免歧义;
- ✅ **ID 映射健壮性**:优先使用 Notion Page ID(而非 Title)作为 Obsidian 文件 UID,防止重名冲突;
- ⚠️ **性能优化**:单次同步 >50 条记录时,启用 LLM 批处理(batch inference)并设置 `--rate-limit 60` 防止 API 拒绝;
- ⚠️ **Frontmatter 兼容性**:Obsidian v1.6.0+ 支持嵌套 YAML 数组,但 Dataview 当前不解析 `relations` 对象,请用 `dataviewjs` 手动渲染关系图。
## 常见问题提示
- **Q:同步后双向链接未渲染?** → 检查 Obsidian 设置中是否启用「自动链接」(Settings > Files & Links > Auto-link);确认文件名不含非法字符(如 `/`, `?`);
- **Q:LLM 返回格式错误导致解析失败?** → 在脚本中添加 `yaml.safe_load()` 异常捕获,并 fallback 到空 relations;调试时启用 `--debug` 输出原始 LLM 响应;
- **Q:Notion 页面更新后 Obsidian 未同步?** → 验证 `Last Synced` 属性是否被脚本正确写入;检查轮询间隔(默认 5 分钟)是否满足时效需求;
- **Q:如何排除特定字段不同步?** → 在 `config.py` 中配置 `excluded_properties = ["Created by", "Status"]`,避免元数据污染知识图谱。