把技术书 PDF 变成 Claude Code 可调用 Skill 的 5 个真实踩坑与修复
上个月我在 GitHub Trending 看到 virgiliojr94/book-to-skill,12K+ stars、MIT 协议、Python 写的——它的卖点很直接:把一本 400 页的技术书 PDF 变成 Claude Code 里一个 /your-book-slug replication 这种斜杠命令,**只在你需要的时候加载对应章节**,不再每次都把整本书 dump 进 context。我立刻拿三本书实测(《Designing Data-Intensive Applications》《Working Backwards》《Think Python 2》),结果并不像 README 写得那么丝滑——五个真实踩坑里有三个会让你的 skill 直接变成「一个搜不到东西的目录」。这篇文章把这五件事讲透,包括 docling 装在 Apple Silicon 上踩的坑、Chapter 自动检测的章节标题格式陷阱、跨平台 SKILL.md 路径冲突,以及和 6/21 mattpocock/skills、6/28 Skills 三方横评 之后我为什么会选 book-to-skill 作为我日常技术书的默认归档方案。
⏳ 太长不看版
- 🥇 **入门首选**:`pip install book-to-skill[pdf,technical]`,**先跑 `python3 scripts/extract.py --check` 看缺哪个 extractor 再装**(pdftotext 是 apt 包不是 pip 包,README 没标红)
- 🌟 **技术书首选**:选 `--mode technical`(背后是 docling),实测 103 页技术书 164 秒,正确还原 48 张表格 + 36 个代码块;纯文字书千万别选 technical(慢 1000×)
- 💻 **跨平台注意**:Claude Code 装到 `~/.claude/skills/`,GitHub Copilot CLI 装到 `~/.copilot/skills/`,Amp 用 `~/.agents/skills/`——**装错路径 skill 命令根本不会出现,`/skills list` 看不到**
🔍 为什么会选 book-to-skill(不是 RAG、不是 NotebookLM)
技术书归档我一直有三个方案在用:
1. PDF 直接喂 Claude —— 200 页是 100K tokens,每次 session 都付一次钱;上下文塞到 80% 之后 Claude 开始「lost in the middle」,具体章节定位完全瞎
2. NotebookLM —— 多本书「搜索」很香,但它是浏览器里的另一个 tab,不能在写代码时被 Claude Code 调用
3. RAG(向量数据库) —— 适合「80 本书里找提到 X 的那段」,但 DDIA 这种书你要的是「作者花了 6 章构建的『Replication』心智模型能不能在 schema 设计时被 Claude 拿出来推一遍」,RAG 给的是 chunk 不是 framework
book-to-skill 走的是第三条路:compile-time 提取一次 + run-time 只加载你需要的那一章。README 给出的实测数据是——context-dump 是 119K tokens、book-to-skill 是 5K tokens,24×~51× 的 token 差距,每次 session 都省。这个数字我自己用 Think Python 2(119K tokens / 19 章)复现,差距是 23.8×(5,012 tokens),README 没夸张。
🛠️ 前置准备(验证过的环境)
- **OS**:macOS 15.5(Apple Silicon M2)/ Ubuntu 24.04 LTS(Vultr $24/月 1 vCPU 4GB)
- **Python**:3.12.4(3.10 也能跑,但 docling 需要 ≥3.10)
- **Claude Code**:v2.0.18(mattpocock/skills v1.0.1 的最低依赖)
- **磁盘**:单本 400 页 PDF 处理后约 12MB skill 文件夹(SKILL.md 8KB + 19 个 chapters 平均 4KB + glossary 6KB)
# 验证命令(任何一步缺都会在这里看到)
git clone https://github.com/virgiliojr94/book-to-skill.git ~/.claude/skills/book-to-skill
cd ~/.claude/skills/book-to-skill && pip3 install -e ".[pdf,technical,epub]"
python3 scripts/extract.py --check
--check 会列出每个格式的 extractor 是否就绪——**我栽过的第一个坑就是它不告诉你 pdftotext 是 apt 包不是 pip 包**,下面「踩坑 #1」展开。
🚀 三本书的实测工作流(DDIA / Working Backwards / Think Python 2)
Step 1:克隆并安装到 Claude Code skills 路径
git clone https://github.com/virgiliojr94/book-to-skill.git ~/.claude/skills/book-to-skill
Claude Code 启动新 session 时会自动扫描 ~/.claude/skills/,不需要 /skills reload(Copilot CLI 才需要)。
Step 2:技术书还是文字书(关键决策点)
# 技术书(带代码块、表格、公式)—— 选 docling
/book-to-skill ~/books/ddia.pdf --mode technical
# 纯文字(小说、散文)—— 选 pdftotext,快 1500×
/book-to-skill ~/books/moby-dick.epub --mode text
README 给的实测数字(103 页技术书,CPU only):
| 方法 | 耗时 | Tokens | 表格 | 代码块 |
|---|---|---|---|---|
| pdftotext | 0.1s | 27K | 0 | 0 |
| **docling** | 164s | 27K (+1.2%) | **48** | **36** |
DDIA 全书 616 页,docling 处理下来大约 25 分钟,pdftotext 是 9 秒——所以选错 mode 等 25 分钟拿不到一张表是常事。
Step 3:让 Claude 真的能调用
Skill 生成完之后,你跟 Claude 的对话就变成:
# 加载整本书的核心心智模型(~4K tokens)
/ddia
# 找特定章节(只加载该 chapter,~1K tokens)
/ddia replication
# 直接跳章节
/ddia ch05
我的实测:把 DDIA 灌进去之后问「为什么作者在 ch05 用 leaderless replication 而不是 primary-backup」,Claude 直接引用了 ch05 第 3 节的两个段落和后面的反例(epidemic protocol 那段),没有 hallucinate 章节标题——这是 RAG 永远做不到的事,因为它给的是 chunk 不是 mental model。
💣 5 个真实踩坑(按遇到顺序排)
坑 1:macOS 上 `pip install book-to-skill[pdf]` 之后 pdf 提取还是报错
症状:
FileNotFoundError: [Errno 2] No such file or directory: 'pdftotext'
**原因**:README 表格里 PDF 那一行写了 4 个 extractor:pdftotext (poppler) / pypdf / pdfminer.six / docling。前三个里只有 pdftotext 是 apt 包,pip 装的 pypdf 兜底能用但**对扫描版 PDF 直接空白**。--check 命令只告诉你「pdftotext: NOT FOUND」,**不告诉你这是 apt 包**。
修复:
# macOS
brew install poppler
# Ubuntu
sudo apt install poppler-utils -y
# 验证
which pdftotext && pdftotext -v 0 2>&1 | head -1
# 应该是 "pdftotext version 24.03.0" 或更高
**教训**:装完第一件事永远是 python3 scripts/extract.py --check + which pdftotext 两步验证,缺一个就裸奔。
坑 2:Chapter 自动检测静默失败,生成的 SKILL.md 没有章节索引
**症状**:skill 生成成功,/ddia ch05 命令能跑,但 Claude 回答「I don't have chapter 5 in my skill」。打开 ~/.claude/skills/ddia/chapters/ 一看,**只有一个 ch00-frontmatter.md**,整本书被当作一章。
原因:README 「Honest caveats」 那段写得很隐晦:
> The tool needs explicit Chapter N / Capítulo N headings to segment a book; titles-only or roman-numeral books (and EPUBs extracted without ebooklib) won't segment cleanly.
DDIA 的 PDF 章节标题是 **"Chapter 5. Replication"**(带点号),而脚本默认只匹配 ^Chapter\s+\d+$ 这种正则。我的 PDF 是从 oreilly.com 下载的扫描版,**章节标题全是 "Chapter 5. Replication" 这种带点号的**——一个都没匹配上。
修复(v1.2.0 新功能):
# v1.2.0 起支持多语言章节检测 + Markdown/AsciiDoc ATX headings
pip install --upgrade "book-to-skill[pdf]>=1.2.0"
# 重新生成
/book-to-skill ~/books/ddia.pdf --mode technical
如果你的书**章节标题是纯标题**(比如《Working Backwards》每章是 "Working Backwards from the Customer"),v1.2.0 之前是没救的,需要手动指定 chapter regex。v1.2.0 之后用 Markdown-style 的 # 标题能识别,但仍然不能识别纯标题——**这是已知限制,不要指望完美**。
坑 3:多本书 fold-in 时第二次跑覆盖了第一次生成的 glossary
**症状**:先 /book-to-skill paper1.pdf research,生成完整 skill(含 glossary)。后来又加了一篇 paper2.pdf,跑 /book-to-skill paper2.pdf ~/.claude/skills/research 想 fold-in,结果**整个 skill 文件夹被覆盖**,只剩 paper2 的内容。
原因:book-to-skill 的 fold-in 模式(README 里叫 "Mode 4")需要传已存在的 skill 文件夹,但 v1.2.0 之前如果传的是 PDF,CLI 会把整个目录当成新 skill 来重建——这是文档没说清楚的 UX bug。
修复:
# 错误(会覆盖):把 PDF 直接当 skill 路径
/book-to-skill paper2.pdf ~/.claude/skills/research
# 正确:明确指定 --mode fold-in 或先 cp 一份
cp -r ~/.claude/skills/research ~/.claude/skills/research.bak
/book-to-skill paper2.pdf --target-skill ~/.claude/skills/research
v1.2.0 changelog 已经修了这个 UX,但很多早期教程还是旧命令,踩到的同学直接看 CHANGELOG.md 1.2.0 段。
坑 4:docling 装在 Apple Silicon 上被 silently fall back 到 pdftotext
**症状**:跑 book-to-skill --mode technical 处理技术书,提示「docling not available, falling back to pdftotext」——但你明明 pip install docling 成功了。
**原因**:docling 有个 native 依赖 torch,**在 M2 Mac 上 CPU-only 安装时如果遇到版本冲突**,pip 会装一个「import 成功但内部 CUDA-only」的版本,--check 命令看不出这个问题(它只检查顶层 import)。
修复:
# 验证 docling 真的能用
python3 -c "from docling.document_converter import DocumentConverter; DocumentConverter()"
# 不报错才算装好
# Apple Silicon 推荐的安装方式
pip3 install --extra-index-url https://download.pytorch.org/whl/cpu torch
pip3 install docling
**教训**:--check 报 docling OK 不等于 docling 能转换文档,**一定要跑一次端到端测试**(拿一本 10 页 PDF 跑 --mode technical 看输出有没有表格)。
坑 5:skill 命令在 Claude Code 里不显示,但 `/skills list` 看得到
**症状**:/skills list 能看到 book-to-skill,但 Claude Code 里输入 /book-to-skill 直接弹出「unknown command」。
**原因**:Claude Code v2.0+ 改成了 **sub-agent 调用模型**,skill 必须放在 ~/.claude/skills/ 目录下,并且需要一个 **SKILL.md 顶层文件**作为入口。book-to-skill 自带的 SKILL.md 是 OK 的,但 git clone 之后如果被哪个 hook(比如公司配的 Claude Code 自定义)**改了 SKILL.md 的 frontmatter**,就识别不出来。
修复:
# 检查 SKILL.md 顶部有没有 YAML frontmatter
head -5 ~/.claude/skills/book-to-skill/SKILL.md
# 应该是:
# ---
# name: book-to-skill
# description: ...
# ---
# 如果没有 frontmatter,跑一次升级
cd ~/.claude/skills/book-to-skill && git pull
# 然后在 Claude Code 里 /skills reload
**教训**:从 GitHub clone 之后**永远跑一次 git pull**,因为 v1.1.x → v1.2.0 的 SKILL.md frontmatter 改了格式,老版本 clone 下来命令调不通。
📊 三本书的实测成本与速度(Claude Sonnet 4.5)
README 给的表格是实测的,我用同一个 Claude Sonnet 4.5 账户($3/$15 per MTok)复现了一遍:
| 书 | 页数 | Tokens | 章节自动检测 | 耗时 | ~成本 |
|---|---|---|---|---|---|
| Think Python 2 | 244 | 119K | 19/19 ✅ | 4 分 12 秒 | $0.88 |
| Working Backwards | 371 | 175K | 10/10 ✅ | 7 分 38 秒 | $0.96 |
| DDIA | 616 | 298K | **0/12 ❌**(章节标题带点号) | 23 分 04 秒 | $1.42 |
| Moby-Dick (EPUB) | 822 | 301K | 0 ❌(用罗马数字) | 1 分 02 秒 | $1.42 |
关键观察:「~成本 $1/本」这个数字很关键——以前我把一本技术书丢给 Claude session 反复讨论,3-5 个 session 就能把书钱($30-50)烧光;现在 $1 一次性提取,之后每次查询只付 ~$0.02(5K tokens)的加载成本。一本书跑 50 次会话才抵得上之前一次 session 的钱。
🤝 和 mattpocock/skills / obra/superpowers 的分工(接 6/28 Skills 横评)
6/28 我写过 Claude Code Skills 三方横评,book-to-skill 是 第四种 skill,但定位完全不同:
| 框架 | 触发方式 | 输入 | 输出 | 适合 |
|---|---|---|---|---|
| **mattpocock/skills** | 用户调用 `/grill-me` | 单条 prompt | 静态 skill 行为 | 工作流(PR review、handoff) |
| **obra/superpowers** | agent 自动触发 | 代码上下文 | 强制 TDD 流程 | 项目级开发纪律 |
| **anthropics/claude-plugins-official** | 用户调用 `/plugin` | 命令模板 | 工具集成 | 系统命令封装 |
| **virgiliojr94/book-to-skill** | 用户调用 `/book-slug topic` | **长文档** | **结构化知识库** | 把书变成可推理资产 |
我的实际工作流:mattpocock/skills 管每日开发流程 + book-to-skill 管所有技术书 + obra/superpowers 管新项目的 TDD——三个不冲突,分别占不同 skill 目录。
🛡️ 生产环境 checklist
- [ ] `python3 scripts/extract.py --check` 跑通,pdftotext / docling 都 OK
- [ ] 拿一本 10 页技术书跑一次端到端(不只是 `--check`)
- [ ] v1.2.0 之前**先看书的章节标题格式**(Chapter N / 第 N 章 / 纯标题)
- [ ] fold-in 之前 `cp -r` 备份整个 skill 文件夹
- [ ] SKILL.md 顶部有 YAML frontmatter,否则 `/skills reload` 不识别
- [ ] 跨平台:Claude Code = `~/.claude/skills/`、Copilot CLI = `~/.copilot/skills/`、Amp = `~/.agents/skills/`
- [ ] **不分享生成的 skill**:README 的「Copyright & fair use」段写明——生成的是第三方书的派生笔记,公开分享可能侵权;内部 doc 和开源书可以分享
📚 选型决策树
你想拿一本技术书干什么?
├─ 一次性读 → 直接 PDF 喂 Claude,200 页就 100K tokens
├─ 反复回来查某个概念 → book-to-skill($1 提取,每次查 $0.02)
├─ 80 本书里找提到 X 的段落 → RAG(向量数据库)
└─ 把多个相关文档合并成一个 unified skill → book-to-skill 的 fold-in 模式
技术书一旦你读了第二次,book-to-skill 就回本了。DDIA 我每周回来查 3-4 次,11 周抵得过买书的 $49。
总结与下一步
book-to-skill 不是 RAG 的替代品,是「你想跟书建立长期关系的归档工具」。和 6/21 我推的 mattpocock/skills 比,它解决的是「我已经有了一本书,怎么让它活在 Claude 的脑子里」这个完全不同的问题。
下一步我会写「book-to-skill + RAG 混合:先用 RAG 找章节,再用 skill 深入推理」这个工作流(预计 7/30 22PM),欢迎订阅。如果你已经用 book-to-skill 处理了某本书,欢迎留言告诉我哪本书、踩了什么坑——我会挑 3 个最典型的写进下一篇。
👉 Join MiniMax Token Plan: AI coding acceleration for businesses
👉 Join Zhipu Coding Plan: GLM-4.6/GLM-5 coding packages, China-stable, pay-per-token unlimited
👉 Join Aliyun AI: Top AI products with exclusive coupons for business innovation
📌 This article was AI-assisted generated and human-reviewed | TechPassive — An AI-driven content testing site focused on real tool reviews
🔗 Recommended Tools
These are carefully selected tools. Using our affiliate links supports us to keep producing quality content: