结论先说:本周不要把整本 PDF 直接塞进 Skill。 先用 **第 1 天识别 PDF 类型,第 2—3 天完成文本提取或 OCR,第 4 天建立带来源的 Knowledge Base,第 5—7 天再封装 Agent Skill 并运行验收。只有内容短小、长期稳定、无需频繁检索时,才适合把资料直接写入 Skill。
这套“PDF → Knowledge → Skill”路线适合三类人:需要处理包含代码、表格和扫描页的编程 PDF 用户;正在比较全文入 Skill 与知识库检索方案的 Agent 开发者;计划批量维护多本专业资料的技术团队。
第 1 步:先判断 PDF 类型,再选择解析路线
不要一上来就 OCR,也不要默认所有 PDF 都能直接复制。第一轮检查要回答三个问题:
- 页面是否有真实文本层?
- 文本顺序是否符合正常阅读顺序?
- 代码、表格和图片是否承担了主要信息?
文本型 PDF 通常可以直接提取。使用保留块、单词坐标或字典结构的方式,比只导出一段纯文本更容易修复双栏、代码块和页眉页脚问题。PyMuPDF 官方文档说明,text、blocks、words、dict 和 rawdict 适合不同精度的提取需求;其中带坐标的块信息可用于重新判断阅读顺序。(pymupdf.readthedocs.io)
你可以把第一轮结果分成三档:
| PDF 类型 | 推荐入口 | 必须检查的风险 | 适合进入 Knowledge 的内容 |
|---|---|---|---|
| 文本型 PDF | 文本、块或字典提取 | 双栏顺序、页眉页脚、乱码、连字符 | 章节、段落、代码块、页码 |
| 扫描型 PDF | 仅对必要页面 OCR | 字符误识别、代码符号错误、表格错位 | OCR 文本、原页截图、页码 |
| 复杂版式 PDF | 布局识别与局部 OCR | 表格、图片代码、图注与正文脱节 | 结构化元素、版面关系、来源页 |
评分:第一轮解析方案怎么选
按“保留来源、代码可用性、后续维护”三项各评 1—5 分。文本提取适合文本层完整的书;OCR 适合扫描页面;布局识别更适合表格和图文混排,但需要更严格的人工抽查。
| 方案 | 文本保真 | 代码保真 | 版式处理 | 维护成本 | 总体建议 |
|---|---|---|---|---|---|
| 直接文本提取 | 5 | 4 | 2 | 5 | 文本型 PDF 首选 |
| 全文 OCR | 3 | 2 | 3 | 2 | 只在扫描内容占主导时使用 |
| 局部 OCR + 布局解析 | 4 | 3 | 5 | 3 | 复杂 PDF 的折中方案 |
| PDF 原文直接放 Skill | 2 | 3 | 1 | 1 | 只适合短小稳定资料 |
如果你需要在远程环境中准备解析工具、查看权限和文件处理方式,可以先参考 VPSSpark 帮助中心。不要把未经授权的 PDF 上传到第三方服务,也不要尝试绕过加密或版权保护。
第 2 步:文本型 PDF 保留页码、布局和代码边界
文本型 PDF 的难点不是“能不能提取”,而是提取后还能不能回到原页核对。
建议每个页面至少保留以下字段:
{
"book_title": "书名",
"edition": "版本或版次",
"chapter": "章节路径",
"page": 42,
"element_type": "paragraph",
"text": "正文内容",
"source_file": "原始文件名"
}
代码块不要和解释段落混成一段纯文本。至少要保存:
- 代码所在页码和章节;
- 使用的语言;
- 运行环境和版本;
- 前置依赖;
- 预期输出或验证方式;
- 代码是否为完整示例,还是片段。
PyMuPDF 的 blocks 可返回文本块坐标,words 可返回单词位置,dict 和 rawdict 可保留更细的结构信息。这样处理后,你可以单独检查代码缩进、标题层级和双栏顺序,而不是等 Agent 生成错误答案后再追查。(pymupdf.readthedocs.io)
常见污染包括页眉反复插入正文、页脚页码混入代码、断词符号破坏类名,以及字体编码导致的乱码。处理规则应写成可重复的清洗步骤,而不是手工改一次就结束。
第 3 步:扫描 PDF 只对必要页面执行 OCR
扫描版编程书不应无差别 OCR 全部页面。先用普通提取检查每页是否为空、字符数量是否异常,或者是否只有少量不可读字符。只有满足这些条件的页面,才进入 OCR 队列。
PyMuPDF 官方文档明确建议先判断页面是否确实需要 OCR。文档还指出,OCR 速度可能约比标准文本提取慢 1000 倍,因此应避免重复识别同一页面,并复用已经生成的文本结果。(pymupdf.readthedocs.io)
OCR 后要重点抽查代码页面:
- 检查
0、O、1、l、I等容易混淆的字符。 - 检查括号、引号、反斜杠、冒号和缩进。
- 检查行号是否被误认为代码。
- 检查双栏是否被交错拼接。
- 将 OCR 文本与原始页面图像并排保存。
如果 PDF 含有表格,不能只保存 OCR 后的线性文本。表头、行列关系和单位必须作为独立结构保存。Unstructured 的 PDF 分区支持 fast、hi_res、ocr_only 等策略;官方文档说明,表格抽取通常需要布局识别路径,而多栏页面的元素顺序仍需要人工验证。(docs.unstructured.io)
第 4 步:把代码、解释和版本条件绑定成知识单元
代码密集型编程书最容易出现一个错误:只把代码片段存进 Knowledge Base,却丢掉“这段代码为什么存在”。
一个合格的知识单元,不应只是:
for item in items:
process(item)
而应包含:
主题:批量处理列表
适用版本:Python 3.x
前置条件:items 已完成初始化,process 已定义
核心代码:……
预期结果:每个元素都会被处理
常见失败:空列表、异常未捕获、类型不匹配
来源:书名、章节、页码、版本
切分也不能只按固定字符数。应优先按章节、标题、概念、示例和任务边界切分;只有单个元素过长时,再进行二次切块。Unstructured 文档强调,先利用文档元素进行结构化,再在单个元素超过目标长度时做文本切分,通常比一开始机械分割更容易保持语义。(docs.unstructured.io)
LlamaIndex 的官方文档将 Document 和 Node 作为核心抽象。Node 可以代表来源文档的一段文本、图像或其他内容,并携带元数据与关系信息。你可以借鉴这种设计,把“章节关系、前置知识和原始来源”保留下来,而不是只建立一堆互不相关的向量片段。(docs.llamaindex.ai)
第 5 步:让 Knowledge Base 负责事实,让 Skill 负责动作
Knowledge Base 和 Skill 的边界,是整套方案的关键。
Knowledge Base 应保存:
- 编程概念和定义;
- 代码示例与解释;
- 适用语言、框架和版本;
- 依赖、限制与失败案例;
- 书名、章节、页码和来源文件;
- 不同书籍之间的冲突结论。
Agent Skill 应保存:
- 什么时候触发;
- 先检索哪些主题;
- 如何筛选来源;
- 是否需要调用代码执行工具;
- 如何检查结果;
- 遇到版本冲突时如何向你提问。
Agent Skills 规范要求技能目录至少包含 SKILL.md,并允许把脚本、引用资料和资源文件拆分保存。规范还建议利用渐进式加载:启动阶段只读取名称和描述,激活后再加载完整指令,需要时才读取引用资料。SKILL.md 的主体建议控制在 500 行以内,完整指令建议少于 5000 tokens;这些限制的目的,是避免每个任务都加载整本书。(agentskills.io)
一个面向编程书的 Skill 可以这样设计:
---
name: python-book-assistant
description: 根据已授权的 Python 编程资料回答问题、定位章节并验证代码。
compatibility: 需要 Python、项目依赖和隔离执行环境。
---
1. 判断用户任务属于概念解释、代码生成还是错误排查。
2. 从 Knowledge Base 检索相关章节,并优先保留版本匹配的来源。
3. 回答时给出书名、章节和页码。
4. 需要运行代码时,先创建隔离环境并限制文件、网络和进程权限。
5. 运行后检查输出、异常和依赖版本。
6. 如果来源冲突,列出差异,不自行隐藏冲突。
这里没有复制整本书,而是定义了检索、执行和验收流程。完整内容放在 references/ 或 Knowledge Base 中,Skill 只在任务需要时调用。
第 6 步:增加沙箱、权限和结果验收
只要 Skill 会运行书中的代码,就不能把“生成代码”和“直接执行代码”视为同一步。
最低限度的隔离要求包括:
- 单独的工作目录;
- 明确的依赖安装范围;
- 限制网络访问;
- 限制文件读写路径;
- 设置运行时长和进程数量;
- 保存命令、依赖版本和输出;
- 执行失败时返回原始错误,而不是让 Agent 自行编造结果。
你可以把验收分成三层:
✅ 文本验收:答案是否能回溯到书名、章节和页码。
✅ 结构验收:代码是否保留依赖、版本、输入和预期结果。
✅ 运行验收:在隔离环境中是否能完成最小示例,失败是否可解释。
如果你正在搭建长期运行的解析和执行环境,可以把文件上传、权限控制和实例管理拆开,先阅读 VPSSpark 的环境使用说明,再决定是本地运行、远程租赁还是采用其他托管方式。
第 7 步:用增量方式维护多本编程书
多本书不能简单合并成一个“超级 Skill”。更稳妥的做法是建立统一主题索引,但保留每条知识的来源差异。
例如“异步编程”这个主题,可以同时记录:
- 书籍 A:适用于某个旧版本运行时;
- 书籍 B:采用较新的 API;
- 书籍 C:只讨论概念,不提供完整可运行代码。
当新版本书籍进入系统时,不要重建全部内容。先识别受影响的章节、依赖和代码示例,再增量更新相关知识单元,并重新测试引用这些单元的 Skill。
建议为每个知识单元保存版本状态:
source_id
book_title
edition
chapter
page
language
framework
runtime_version
updated_at
status
其中 status 可以区分“已核对”“待复核”“版本冲突”和“不可运行”。这比单纯依赖向量相似度更适合技术资料,因为相似内容不代表适用版本相同。
常见问题
完整书稿适合直接写入 Skill 吗?
通常不应该。完整 PDF 体积大、检索边界不清,版本更新时还会迫使你重写 Skill。更好的方式是把 PDF 解析为带来源的 Knowledge Base,再让 Skill 规定检索顺序、引用格式和执行检查。短小且长期稳定的规范资料,才适合直接放入 Skill 的参考目录。
扫描页面中的代码怎样提取才可靠?
先判断页面是否存在文本层,只对扫描页或异常页 OCR。代码页必须保留原始页面,并人工抽查缩进、标点、大小写和行号。OCR 结果还要经过语法检查和最小运行验证,不能因为文本“看起来完整”就直接写入可执行 Skill。
两层架构分别应该保存哪些内容?
Knowledge Base 负责保存事实、代码、版本条件和来源,解决“应该检索什么”。Skill 负责触发、检索、工具调用和结果验收,解决“应该怎样完成任务”。两层分离后,书籍更新主要影响知识层,流程变化主要影响 Skill 层。
多本资料怎样避免维护成一团?
先按主题建立索引,再把每条知识绑定到书名、章节、页码和版本。不同书籍出现冲突时保留差异,并在 Skill 中定义冲突处理规则。新增版本后,只重建受影响的知识单元,再运行对应任务的回归测试。
把当前方案和 Mac 方案放在一起比较时,直接在本地电脑上处理多本 PDF,常见问题是环境依赖不一致、OCR 与布局模型安装麻烦、代码验证容易占用日常开发机资源;临时使用普通云主机又可能遇到图形化工具、文件权限和隔离执行配置不顺手。若你需要批量处理合法 PDF、临时搭建解析环境,或运行书中代码做回归验证,租赁 VPSSpark 的 Mac 环境通常更适合先完成测试,再决定是否长期自购设备。若任务涉及长期稳定重负载、物理接口或严格本地合规要求,自购 Mac 或本地部署反而更合理。
为你的 AI Agent 准备一台稳定的远程 Mac
在 VPSSpark 租用 Mac mini M4 云端主机,集中完成 PDF 解析、知识库构建与 Skill 测试。
1Gbps 独享带宽与独享 IPv4,配合浏览器 VNC 远程桌面,让开发、调试和部署更顺畅。