关于 deep-reader
deep-reader 是一项用于分阶段阅读书籍和论文的技能,适合需要深入理解长篇材料并保留可追溯笔记的研究者。它将结构浏览、逐章分析和基于笔记的综合分开,并提供概览与学习两种模式。
主要功能
- 01概览与学习两种阅读模式
- 02按章节生成分析笔记
- 03记录页码以追溯出处
- 04生成结构图与论证综合
- 05机械核验引文和页码
适用场景
- 01为研究问题筛选相关章节
- 02整理长篇书籍或论文的读书笔记
- 03基于已有笔记回答后续问题
- 04核对综合结论中的引文
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tronghieu/ agent-skills --skill deep-reader安装后在 Claude Code 中输入/deep-reader确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdREADME.vi.mdREADME.zh.mdreferences/genre-strategies.mdnote-templates.mdpaper-mode.mdscripts/build-diagram.shextract-structure.shprepare-text.shread-pages.shsearch-book.shself-test.shsplit-chapters.shverify-quotes.sh详细介绍
Deep Reader
像细致的人类研究者一样阅读长篇书籍和论文:先略读以了解结构,再逐章深入阅读并随时做笔记,最后只依据笔记进行综合总结,而不是依据原文。此方法源自 Adler 的 How to Read a Book、SQ3R 的复述步骤,以及 Keshav 针对论文提出的三遍阅读法。
为什么要多遍阅读,为什么要做笔记
大模型的注意力会随着上下文变长而分散,也容易遗忘大型提示词中间的内容(“中间遗失”)。把一本 500 页的书全部载入同一个上下文,再就此提问,会导致讨论到第 12 章时,回答悄然忘记第 3 章的内容。
解决办法和人类研究者采用的方法一样:不要试图把整本书同时留在工作记忆中。分遍阅读——先了解结构,再逐章阅读内容——并随读随把所学整理到笔记文件中。笔记会成为持久记忆;只有在主动阅读某一章或核实某条具体论断时,才需要重新查看书籍原文。页码是坐标系统,可让每条论断都能追溯到来源,无论是在本次会话还是之后的会话中。
两种模式
- overview — 仅进行 Adler 式检视阅读:绘制全书结构图,并根据读者的目的,对最相关的章节进行目标导向的总结。速度快,不做逐章笔记。
- study — 完整流程:阅读目的 → 检视阅读结构图 → 逐章分析笔记并通过复述核验 → 按层级综合总结,回答 Adler 的四个问题 → 机械式引文核验。
用户选择一种模式(或你根据 mode_hint 和用户陈述的目的提出建议——见步骤 1)。
工作区布局
整个流程生成的所有内容都存放在工作区目录中。默认情况下,该目录与源文件位于同一父目录下,因此可在不同会话间保留:
<slug>-notes/
├── source.txt # full text with [[page N]] markers — the coordinate system
├── chapters.tsv # confirmed structure: chNN<TAB>from<TAB>to<TAB>title
├── chapters/ # per-chapter files cut by split-chapters.sh
│ └── ch01-<slug>.txt
├── map.md # inspectional pass output
├── terms.md # key-terms ledger, cross-chapter
├── notes/
│ └── ch01-<slug>.md # one analytical note per chapter (papers: sec01-<slug>.md)
└── synthesis.md # final synthesis + verification log
之后的会话无需重新阅读整本书,就能回答后续问题;实现这一点的是此工作区,而不是 SKILL.md 脚本(见下文“根据现有笔记作答”)。
脚本一览
全部七个脚本都位于此技能下的 scripts/ 目录中。你可以在技能目录下运行 bash ./scripts/<name>.sh ...,也可以在 claude.ai 上运行 bash /mnt/skills/user/deep-reader/scripts/<name>.sh ...——两种形式调用的是同一脚本,根据运行环境任选其一。
| 脚本 | 参数 | 用途 |
|---|---|---|
prepare-text.sh | <input-file> [workspace-dir] | 将源文件转换为带页码的 source.txt,并创建工作区 |
extract-structure.sh | <source.txt> | 提取启发式大纲初稿(只是起始猜测,并非准确事实) |
read-pages.sh | <source.txt> <from> [to] | 打印单页或页码范围,保留 [[page N]] 标记 |
search-book.sh | <source.txt> <pattern> [context-lines] | 搜索整本书,并输出带页码标注的结果 |
split-chapters.sh | <source.txt> <chapters.tsv> | 将已确认的章节拆分为独立文件 |
build-diagram.sh | <workspace-dir> [--append] | 根据结构生成 Mermaid 思维导图 |
verify-quotes.sh | <workspace-dir> | 检查伪造的引文和错误的页码引用 |
步骤 0 — 准备
找到源文件,然后转换并分页:
bash ./scripts/prepare-text.sh path/to/book.pdf
# or on claude.ai:
bash /mnt/skills/user/deep-reader/scripts/prepare-text.sh path/to/book.pdf
此操作具有幂等性——在已有 source.txt 的工作区中重新运行时,会报告现有统计信息,而不会再次转换,因此每次在同一本书的工作区中开始会话时调用都是安全的。
阅读它输出的 JSON。pages 和 est_tokens 会告诉你这本书的规模;mode_hint 会给出初步建议(小型/中型/大型);如果 synthetic_pages 为 true(EPUB/DOCX/TXT/MD 源文件没有真实页码),请记住,笔记中的页码引用仍指向 source.txt 自身的分页——可以核实,只不过不是实体书读者看到的印刷页码。
继续之前,先判断以下两种情况:
- 这本书已有笔记工作区(检查
<slug>-notes/notes/中是否有文件)——不要重新开始整个流程,直接跳到下文的“根据现有笔记回答”。 - 退出码为 2(缺少
pdftotext/pandoc)——改用 Read 工具分批直接阅读 PDF/EPUB。采用这种备用方式时,无法使用verify-quotes.sh进行机械检查;请更频繁地手动重读引用内容作为补偿。 - **脚本运行异常?**运行
bash ./scripts/self-test.sh——它可以区分环境问题(缺少/损坏的依赖项)和使用问题。
步骤 1 — 阅读目的
如果用户没有说明阅读这本书的目的,请问一个问题:“你希望从这本书中获得什么?”目的并非形式上的问题——它决定哪些章节需要深入阅读、哪些可以略读,也是评估步骤 4 综合结果的标准。
了解目的后,结合 mode_hint 和阅读目的提出一种模式(例如,为了一个具体问题而读一本 40k-token 的书,即使从技术上说可以读完,也可以采用概览模式;为了撰写文献综述而读一本 200k-token 的书,则无论篇幅大小都需要采用研读模式)。让用户确认或选择其他模式。
如果源文件是论文、学位论文或综述,而不是书籍,请现在阅读 references/paper-mode.md——它会说明如何将 Keshav 的三遍阅读法应用于此流程,并告诉你何时值得投入整套工作区机制的额外开销,以及何时应在对话中直接完成第 1–2 遍阅读。
步骤 2 — 检视性阅读(两种模式都要进行)
生成一个初步提纲,然后对照原书确认:
bash ./scripts/extract-structure.sh <workspace>/source.txt
将其输出视为有噪声的初步猜测,而非事实依据——请对照目录进行交叉核查。然后:
- 使用
read-pages.sh阅读目录、序言/引言、结论/最后一章,以及索引(如有)。 - 略读抽取的 2–3 章的首段和末段。
- 使用 references/note-templates.md 中的模板编写
map.md。 - 填写完
map.md的分类字段后,在开始分析性阅读之前,先阅读 references/genre-strategies.md 中对应的章节——实用类书籍、想象类文学、历史、科学与数学、哲学,以及教科书/参考书都需要采用不同的阅读方式;提前应用这些策略成本很低,等笔记写完后再补则代价很高。
确认结构后,将其持久保存并拆分成多个部分:
# id from to title — one line per chapter, tab-separated
printf 'ch01\t9\t34\tThe Activity of Reading\n' > <workspace>/chapters.tsv
bash ./scripts/split-chapters.sh <workspace>/source.txt <workspace>/chapters.tsv
bash ./scripts/build-diagram.sh <workspace> --append
split-chapters.sh 会为每章创建一个独立文件——这对分析性阅读很有用;如果要分派给子 Agent,则必不可少。build-diagram.sh --append 会在 map.md 的 ## Structure diagram 标题下添加一份 Mermaid mindmap,可以重复运行而不会重复添加该部分。
概览模式到此结束:只对与阅读目的最相关的 2–4 章进行深入略读(开篇、结尾、关键章节),在 map.md 中补充一份以目标为导向的摘要,呈现给用户,然后结束。不写逐章笔记,不做综合,也不进行核验。
研读模式继续执行步骤 3。
步骤 3 — 分析阶段(研读模式)
按 chapters.tsv 中的顺序逐章处理。如果一本书由许多微章节(每章 1–10 页)组成,不要为每个微章节都写一份笔记——而是按作者自己的部分/章节划分进行归组。目标是每个连贯的论证单元对应一份笔记,而不是每个标题对应一份笔记;一本有 67 章的书,完全可能合并为 16 份按部分划分的笔记。对于每个最终确定的单元:
- 阅读章节——内容来自
chapters/chNN-*.txt;如果跳过了拆分步骤,则使用read-pages.sh/Read 工具分批阅读。 - 按照 references/note-templates.md 中的模板,编写
notes/chNN-<slug>.md:说明本章回答的问题、关键术语(也将每个术语同步录入跨章节的terms.md术语表)、核心命题、论证(前提 → 结论)、所提供的证据、带有(p. N)页码的引文、与其他章节的矛盾或关联,以及未解问题。 - 复述(SQ3R 的步骤):草拟笔记后,重新略读本章,逐一核对每项命题和引文是否符合原文,然后再继续。趁章节内容还记忆犹新,立即修正笔记——不要等到综合整理时再改。笔记通过核对后,就让本章退出工作记忆;从此以后,笔记就是记忆。
分工选项:如果有可用的子 Agent,且 mode_hint 将本书标记为大型图书,你可以派遣子 Agent 代替顺序逐章处理。按批次向每个子 Agent 分配章节——平衡每批的词数,而不是严格按每人一章分配——并提供各自批次的页码范围、阅读目的、笔记模板路径和脚本路径。要求每个子 Agent 在最终消息中返回其 terms.md 条目,而不是直接写入该文件,这样你(协调者)就能集中合并所有内容到 terms.md——多个并行子 Agent 直接写入同一文件会产生竞态。map.md、合并后的 terms.md 和步骤 4 的综合整理仍由你负责——不要委派这些工作。顺序阅读是默认方式,且适用于各种环境;即使子 Agent 无法并行运行,分工也依然有益,因为它能隔离上下文——每个批次都会获得一个全新的上下文窗口,而不只是提升速度。
步骤 4 — 综合整理
现在阅读笔记——不要读书。撰写 synthesis.md,回答 Adler 提出的四个问题,每项论断都要附上页码引用:
- 这本书整体上讲什么?
- 书中具体说了什么,又是如何阐述的?
- 这些内容全部或部分属实吗?
- 这有什么意义?——应结合用户明确提出的阅读目的来具体回答,而不是泛泛而谈。
除了回答这四个问题,还要手动编写一份 Mermaid graph,绘制概念与论证图,展示关键术语和命题如何共同导向各项结论,并跨章节建立联系。该图应根据 terms.md 和章节笔记构建。这是一项需要判断的分析工作,并非机械操作:它是论证层面的图,与步骤 2 中 build-diagram.sh 绘制的结构思维导图相对应;任何脚本都无法生成它,因为这需要判断各个观点之间的实际依存关系。
步骤 5 — 核验
先运行机械检查:
bash ./scripts/verify-quotes.sh <workspace>
对于每一行 FAIL 或 NEAR,使用 read-pages.sh 重新打开引用页码,并修正引文文本或页码,然后重新运行,直到退出码为 0。此检查能发现虚构引文和页码偏差,但只能检查引文——无法检查转述内容。
因此,最后还要手动核验:挑选 synthesis.md 中最关键的 5–10 项转述论断,通过针对性重读所引用的页面来逐一核验。按照模板,在 synthesis.md 底部的简短核验日志中,将每项标记为 ✓ verified。
根据现有笔记作答
在后续会话中,或完成综合后仍在当前会话时,不要重新阅读整本书来回答问题。先搜索工作区——用 grep 搜索 terms.md 和 notes/——并根据其中的内容作答。只有当笔记未涵盖相关细节时,才沿着笔记中的页码锚点,使用 read-pages.sh 或 search-book.sh 查阅 source.txt。工作区的意义就在于,后续的一个问题不该让你从头到尾重读一遍。
关键判断
Adler 对“这是真的吗”这一问题的礼仪要求是:在能够公允地重述作者的观点之前,不要作出判断——这正是第 3 步中 Recite 检查的作用。然后,要明确区分以下三种结论:
- “作者在此处错了”——需要有引用页码的理由支持。
- “作者的论述不完整”——这是缺漏,不是错误。
- “我无法核实这一点”——如实说明,不要猜测。
没有引用页码的理由支撑的分歧不是批评,而是观点——不要把它说成前者。
主题式阅读
对于横跨多本书或论文的问题,每部作品都单独运行一次流程——每部作品都有自己的工作区和 synthesis.md。然后根据这些 synthesis.md 文件撰写比较综合:指出作品之间的共识与冲突,并为共同主题采用中立的术语,不偏袒任何一位作者的用语。
沟通
使用用户提问时所用的语言。交付内容是综合结果(或在概览模式下,目标导向的摘要),应直接放在对话中——工作区文件是值得提及的持久副产品,但不能代替在聊天中作答。