skills/paper-deep-reader/SKILL.md
精读文献。快速泛读请用paper-quick-read。
npx skillsauth add jaimeparker/stable-jarvis paper-deep-readerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
定位:本 skill 实现深度论文精读——main agent 全局理解 + 6 个 subagent 并行分析 + Zotero/Obsidian 知识库横向对比 + Obsidian vault 结构化输出。如需快速泛读(单轮摘要),请使用
paper-quick-read。
semantic_search + Obsidian search_notes + 可选 embedding 语义搜索[[wikilinks]] + frontmatter所有 API key 统一在 stable-jarvis/.env 中管理:
cp .env.example .env # 然后编辑 .env 填入真实 key
stable_jarvis 包统一加载 .env 配置。
| 变量 | 说明 |
|------|------|
| EMBEDDING_PROVIDER | embedding 提供商(qwen/openai/local) |
| EMBEDDING_MODEL | embedding 模型名 |
其他依赖:
zotero-mcp 已启动obsidian MCP 已配置本 skill 的 Python 脚本位于 scripts/ 子目录(相对于 skill 安装目录)。执行时请 cd 到 skill 目录或以绝对路径调用。
本 skill 使用可扩展的领域专用 prompt 体系。Prompt 文件位于 prompts/ 目录:
prompts/
├── categories.toml # 领域注册表(名称、描述、关键词、persona)
├── default/ # 通用学术 prompt(兜底,4 tasks)
│ ├── system.md # 系统提示(persona + 写作要求)
│ ├── task-1.md # 研究问题与背景
│ ├── task-2.md # 核心方法与框架
│ ├── task-3.md # 实证分析与相关工作
│ ├── task-4.md # 局限性与批判性评价
│ └── report-template.md # 报告结构建议
├── ai-ml/ # AI/机器学习专用 prompt(5 tasks)
│ ├── task-1.md # 研究问题与动机
│ ├── task-2.md # 方法与算法设计
│ ├── task-3.md # 相关工作与KB交叉分析
│ ├── task-4.md # 实验与消融分析
│ ├── task-5.md # 局限性与个人启发
│ └── ... (system.md + report-template.md)
└── rl/ # RL/强化学习专用 prompt(6 tasks)
├── task-1.md # Introduction & Related Work
├── task-2.md # Algorithm & Architecture(含Mermaid)
├── task-3.md # Formula Derivation & Theorems
├── task-4.md # Literature Cross-Analysis(KB注入)
├── task-5.md # Experiments & Results
├── task-6.md # Weaknesses & Inspiration
└── ... (system.md + report-template.md)
添加新领域:在 categories.toml 中注册,然后在 prompts/ 下创建同名目录,放入 system.md、task-N.md(数量自定)、report-template.md 即可。无需修改任何代码。
严格按以下阶段顺序执行。
通过 Zotero MCP 定位论文并获取必要信息。
步骤:
zotero-mcp 的 search_library 找到论文item_key(父条目)、PDF attachment keyget_item_details 获取完整元数据(标题、作者、abstract、published date、arxiv ID)temp/deep-reader/meta.json:
item_key — Zotero 父条目 keyattachment_key — PDF attachment keytitle — 论文标题abstract — 摘要authors — 作者列表published — 发表日期arxiv_id — arXiv IDcategories — 领域分类根据阶段 1 获取的论文标题和摘要,匹配合适的领域专用 prompt。
步骤:
prompts/categories.toml,了解所有可用领域(名称、描述、关键词)ai-ml),记录为 PROMPT_SETPROMPT_SET=default无需脚本——直接根据 categories.toml 中的描述和关键词判断即可。
判断策略:
提取脚本(默认输出 Markdown,保留标题、LaTeX 公式、表格等结构信息):
python scripts/extract_pdf_text.py --pdf <pdf_path> --output temp/deep-reader/paper.md
如需纯文本:
python scripts/extract_pdf_text.py --pdf <pdf_path> --output temp/deep-reader/paper.txt --plain
长论文处理:主 agent 自行分块摘要后派发 subagent,无需外部脚本。
两路独立搜索,不做去重/过滤/截断——subagent 有能力自行判断相关性。中间文件放 temp/deep-reader/。
4a — Zotero 语义检索
调用 zotero-mcp 的 semantic_search,query = {title}\n{abstract},topK=10,minScore=0.3。
格式化为 {title, text(abstract), published, source="zotero"},保存为 temp/deep-reader/zotero_kb.json。
4b — Obsidian 语义搜索
直接复用 obsidian-semantic-search skill 的向量库(共享 temp/obsidian/embeddings.json)。
索引管理遵循 obsidian-semantic-search SKILL.md 的判断逻辑:
# 检查索引状态
python skills/obsidian-semantic-search/scripts/build_index.py --stats
# 按需增量更新或 --force 重建
python skills/obsidian-semantic-search/scripts/build_index.py
搜索:
python skills/obsidian-semantic-search/scripts/search.py \
"{title}\n{abstract}" --top-k 10 > temp/deep-reader/obsidian_kb.json
格式化为 {title, text, path, source="obsidian-embed"}。
两路结果直接交给 Phase 5,由文献交叉分析 subagent 自行判断哪些论文真正相关、标题相似的做去重——不做预过滤或预截断。
在撰写 global-understanding.md 之前,主 agent 必须基于 Phase 4 的 KB 搜索结果,系统性地搜索 Obsidian vault 中与论文相关的笔记,整理候选分析方向供用户选择。
4.5a — 搜索知识库中的相关笔记
search_notes 逐个搜索,找出 vault 中已有的笔记4.5b — 呈现候选方向供用户选择
方向列表格式:每个方向包含「主题名称」「涉及的知识库笔记」「建议的对比角度/问题」。按方法级粒度组织,每个方向是一个具体的方法论对比点。
使用 AskUserQuestion 呈现(multiSelect: true):
4.5c — 将选择结果写入 global-understanding.md
用户选择的方向写入 global-understanding.md 的「重点分析方向」部分。未选中的方向可以简要提及但不做重点展开。
无需外部脚本。Main agent 驱动整个分析流程。
前置条件:temp/deep-reader/ 下已准备好论文全文(.md 或 .txt)、meta.json、zotero_kb.json、obsidian_kb.json。
若论文过长(超过约 24,000 字符),主 agent 自行分块摘要后再派发——无需外部脚本。
5a — Main agent 形成全局认知
Main agent 读取以下内容,形成对论文的整体理解:
zotero_kb.json 和 obsidian_kb.json)prompts/{PROMPT_SET}/ 下所有 task-*.md 作为 subagent 任务参考模板prompts/{PROMPT_SET}/report-template.md 了解最终报告结构Main agent 识别论文特定的关注点——亮点、弱点、需要重点验证的声明、与 KB 论文的关键差异等。
5a 必须产出:写入 temp/deep-reader/global-understanding.md,作为所有 subagent 的共享前置阅读材料。内容必须包含:
| 内容 | 说明 | |------|------| | 论文概要 | 一句话贡献 + 核心方法 + 主要结果 | | 复杂度评估 | 简单(单点创新,如 BPPO)/ 中等(2-3 个组件)/ 复杂(系统级论文,如 LWD) | | 重点分析方向 | 3-5 个最值得深挖的点(引导各 task 聚焦) | | 技术继承关系 | 每个核心组件的明确前驱工作(如 "扩散+PG: DPPO / OPE-gated 迭代: Uni-O4 / Consistency 蒸馏: Song et al. 2023")。此条目专门防止 subagent 将方法归属张冠李戴 | | Task 边界表 | 每个 task 的独占内容范围 + 禁止涉及的内容(防止跨 task 重叠)+ 篇幅预算(按复杂度:简单 50-70 行 / 中等 80-120 行 / 复杂 120-180 行) | | 跨 task 注意事项 | 已知可能重叠的区域(如 "DIVL 的核心机制由 Task 2 负责架构描述、Task 3 负责公式推导,两者不得交叉展开") |
5a 额外产出:写入 temp/deep-reader/note-mapping.md,作为所有 subagent 的共享 wikilink 参考表。格式:
| 方法/论文名 | Obsidian 笔记路径 | Wikilink | 一句话贡献(核心差异锚点) | 备注 |
|------------|-----------------|----------|--------------------------|------|
| IQL | IQL Summary 中文版 | [[IQL Summary 中文版|IQL]] | 隐式 Q-Learning:expectile regression 避免 OOD action 查询 | 价值函数对比 |
| DPPO | Diffusion Policy Policy Optimization | [[Diffusion Policy Policy Optimization|DPPO]] | 首次将 policy gradient 应用于扩散去噪过程 | PPO-on-diffusion 起源 |
| Uni-O4 | Uni-O4 Summary | [[Uni-O4 Unifying Online and Offline Deep Reinforcement Learning|Uni-O4]] | OPE-gated PPO 统一离线/在线 RL(高斯策略,非扩散) | 迭代改进框架 |
它明确每个前驱工作具体做了什么,防止 subagent 因方法名相似或作者相同而混淆归属。
主 agent 不需要穷举——subagent 后续可以自己通过 Obsidian search 补充。此文件确保报告中涉及的论文/方法在 vault 中有笔记时使用 [[wikilink]] 而非纯文本引用。
5b — Main agent 定制 subagent 任务
task-*.md 文件的数量决定了 subagent 数量(rl=6, ai-ml=5, default=4)。每个 task 定义一个 subagent 的职责范围。
5b-1:划分 task 边界。 在编写指令之前,主 agent 必须对照 report-template.md 的章节结构,明确划分每个 task 的独占内容范围、禁止涉及的内容、以及篇幅预算。这些边界写入 global-understanding.md 的 Task 边界表。此步骤是防止跨 task 冗余的关键——没有边界,每个 subagent 会趋向于写一篇完整报告。
针对每个 task-N.md,main agent 编写定制指令,包含:
| 要素 | 说明 |
|------|------|
| Task 目标 | 参考 task-N.md 的分析框架和输出要求,尽量按照要求 |
| 论文特定关注点 | 如 "重点审查 pre-sampling phase 消融实验是否支撑方法声称" |
| 相关论文段落 | 与该 task 最相关的论文章节或关键段落 |
| KB context | 仅文献交叉分析 task 注入(如 rl task-4、ai-ml task-3)。将 zotero_kb.json 和 obsidian_kb.json 的全部内容交给 subagent,由 subagent 自行判断相关性和去重 |
| 输出格式 | Markdown,参考 task-N.md 的最低字数要求。所有数学公式必须使用 LaTeX 格式:行内公式用 $...$,独立公式用 $$...$$,不得使用 ( ) 或 [ ]。要求 subagent 使用 ## 作为最高层级标题(不使用 #),并明确告知其产出将嵌入报告模板的哪个章节位置(如 "你的产出将嵌入 ## 1. 研究问题与动机 下"),以便 subagent 理解自身内容在整体报告中的定位 |
| 嵌入位置 | 告知 subagent 其产出将被嵌入报告模板的哪个章节(如 ## 1. 研究问题与动机、### 2.1 算法与架构)。这帮助 subagent 理解内容定位,也为主 agent 后续组装时的标题降级提供依据 |
| 篇幅预算 | 根据 5a 的复杂度评估,为当前 task 分配预期行数范围(简单 50-70 / 中等 80-120 / 复杂 120-180)。同时告知 subagent 哪些主题由其他 task 负责,不得越界 |
| Obsidian 参考 | 告知 subagent 读取 note-mapping.md 获取已有 wikilink 映射。subagent 有权使用 Obsidian MCP 的 search_notes 工具自行查找 vault 中是否有对应笔记。报告中凡 vault 有笔记的方法/论文,使用 [[wikilink]] 替代纯文本引用 |
task-N.md 是模板参考——main agent 应根据具体论文调整指令,不要原文照抄。例如:若论文消融实验薄弱,应在实验分析 task 的指令中明确要求 subagent 指出这一点。
5c — 并行 spawn subagent
使用 Agent 工具并行 spawn 所有 subagent(数量 = task-*.md 文件数)。所有 subagent:
temp/deep-reader/global-understanding.md,了解:(a) 论文全局判断,(b) 自己的 task 边界和禁止范围,(c) 篇幅预算。global-understanding.md 已写入且内容完整(包含所有 task 的边界表)。search_notes, read_note 等),可以在分析过程中主动查找和链接知识库笔记。5d — 第一次组装(纯拼接 + 重整标题层级)
Main agent 收集全部 task-subagent 的原始产出后,按 report-template.md 的结构进行组装:
步骤 1:重整标题层级。 Subagent 产出的标题层级可能与报告模板不匹配(如使用 # 顶级标题、层级跳跃、嵌套深度不当等)。主 agent 必须逐节审查各 subagent 产出的标题,将其调整到与嵌入位置匹配的正确层级:
report-template.md,明确每个 task 产出嵌入的父级标题级别(如 ## 1. 研究问题与动机 → 父级为 h2;### 2.1 算法与架构 → 父级为 h3)# 顶级标题(与论文标题冲突);同级内容使用同级别标题;不出现层级跳跃步骤 2:章节顺序排列 + 移除废话。
report-template.md 的章节顺序排列report-v1.md5e — 事实核查(Fact-Check Subagent)
Spawn 1 个 fact-check subagent,专门对照论文原文核查所有 task-subagent 产出的准确性。
输入:论文原文 + 全部 task-subagent 原始产出 + 第一版组装报告
核心约束:极度依赖原文——每个判断必须有原文具体引用(章节号或原文摘录),不允许凭记忆或常识判断。
输出格式——逐条差异报告,每条标注:
不做的事:
此 subagent 的指令直接写在 Phase 5e 中,不需要独立的 task-N.md 文件——它不是 per-category 的,职责固定。
5f — Main agent 审阅 + 修正循环(硬上限 3 轮)
Main agent 审阅 fact-check subagent 的核查报告:
若 ❌ + 🔶 数量较少(10 条以内且无重大事实错误)→ 直接进入 5g,主 agent 按核查报告修正报告。
若 ❌ + 🔶 较多或存在重大事实错误 → 将具体问题发回对应的 task-subagent,要求重新核查修正。修正后:
硬上限:3 轮(5e→5f→修正→5e→5f→修正→5e→5f→5g)。超过 3 轮后接受剩余问题,在报告末尾标注 "第 N 轮核查,剩余 X 条未解决"。
5g — Main agent 最终修正与写入
Main agent 根据事实核查结果对组装报告做最终修正:
outputs/deep-reader/{item_key}/report.md此流程确保报告的事实准确性由原文锚定,而非依赖 LLM 记忆。
报告模板(参见 reference/section-prompts.md 中的 REPORT_TEMPLATE)。
生成最终 Markdown:
[[wikilinks]]:
[[note_name]]报告路径:outputs/deep-reader/{item_key}/report.md。
写入 Obsidian:
使用 obsidian MCP 的 write_note,路径为 00 Inbox/{safe_title}.md。
报告内容来自 outputs/deep-reader/{item_key}/report.md。
⚠️ 关键约束:必须获取完整报告内容后传给 write_note,不手工重新组装报告文本——手工组装极易丢失 LaTeX $ 分隔符。
Frontmatter 格式:
---
tags:
- paper-analysis
- deep-reading
- {domain_tags}
authors: "{authors}"
published: "{published}"
zotero_key: "{item_key}"
kb_related:
- "[[related_paper_1]]"
- "[[related_paper_2]]"
---
如果用户请求上传:
item_keypython scripts/upload_to_zotero.py --report <report_path> --zotero-key {item_key} --tags deep-reading,auto-generated
如果用户计划基于本论文的局限性设计新的研究问题,主 agent 应生成结构化桥接文件,供 good-question skill 直接消费。
步骤:
从 Phase 5g 的最终报告(outputs/deep-reader/{item_key}/report.md)中提取以下结构化信息:
从 Phase 4 的 KB 搜索结果中提取相关论文列表(不去重、不截断——good-question 自行判断相关性):
zotero_kb.json 中的条目(title, abstract, item_key)obsidian_kb.json 中的条目(title, path, wikilink)写入 outputs/deep-reader/{item_key}/good-question-bridge.json:
{
"source_paper": {
"title": "{title}",
"item_key": "{item_key}",
"arxiv_id": "{arxiv_id}"
},
"stated_limitations": [
"具体局限描述 1",
"具体局限描述 2"
],
"implied_weaknesses": [
"隐含弱点描述 1",
"隐含弱点描述 2"
],
"future_directions": [
"未来方向描述 1",
"未来方向描述 2"
],
"personal_insights": [
"个人启发描述 1",
"个人启发描述 2"
],
"kb_context": {
"zotero_related": [
{"title": "...", "item_key": "...", "abstract": "..."}
],
"obsidian_related": [
{"title": "...", "path": "...", "wikilink": "..."}
]
}
}
已生成 good-question 桥接文件 outputs/deep-reader/{item_key}/good-question-bridge.json。运行 good-question skill 可直接消费此文件,基于论文局限性设计新的研究问题。注意:
所有配置可通过环境变量或 .env 文件设置:
| 变量 | 默认值 | 说明 |
|------|--------|------|
| EMBEDDING_PROVIDER | qwen | embedding 提供商:qwen/openai/local |
| EMBEDDING_MODEL | 自动 | 覆盖默认 embedding 模型 |
| OBSIDIAN_VAULT | 自动检测 | Obsidian vault 根路径 |
development
# Mao Semantic Search Search Mao Zedong Selected Works by conceptual meaning using vector embeddings. Builds a local embedding index over all 230 articles across 5 volumes, then performs cosine similarity search at query time. ## When to Use - User asks a thematic/conceptual question about Mao's works ("What did Mao say about guerrilla warfare?") - Keyword search over the .md files is insufficient - User wants to find passages related to a concept without knowing exact terminology - As a pre-
development
Use when a researcher is choosing, framing, refining, or stress-testing a research question, hypothesis, thesis topic, project idea, grant direction, paper angle, or stalled research direction.
data-ai
泛读:快速概览Zotero库中的文献,单轮LLM生成摘要级Markdown报告,并上传为Zotero Note。深度精读请用paper-deep-reader。
tools
# Obsidian Semantic Search Search Obsidian vault notes by conceptual meaning, not just keywords. Builds a local embedding index over all vault notes (per-section chunking), then performs cosine similarity search at query time. ## When to Use - User asks a fuzzy/conceptual question about their own notes ("What papers discuss exploration in RL?") - Keyword search (`mcp__obsidian__search_notes`) returns too many or too few results - User wants to find notes related to a concept without knowing e