book-to-skill 这个名词最近在上下文工程相关的讨论里出现得挺多,核心思路一句话就能说清:把一本书或一份长文档,拆成一组可以在需要时单独加载的“技能单元”,而不是让 AI 每次处理都把整本书塞进上下文。很多文章用“一本书省 51 倍上下文”来概括这个效果,我对这个具体数字持保留态度,但方向是成立的。
它解决的问题很实在。AI 编程助手、本地大模型、长文档问答这类场景,上下文窗口再大,也经不住整本书往里灌。灌进去之后不止是 token 开销变大,还会出现“上下文过大”报错、早期内容被自动压缩、回答逐渐跑偏。适合看这篇文章的人有三类:想把技术书变成 AI 可查询知识库的内容开发者、被长文档处理反复折磨的使用者,以及想理解“上下文工程”到底在做什么的人。
下面按实际落地的顺序拆:先看它和普通塞文档的差别,再给转换流程,讨论质量验证、适用边界和工程化细节,最后集中说坑。
1. 先理解 book-to-skill 改了什么
1.1 直接把整本书塞进上下文的问题
传统做法很直接:把书转成文本,拼到 prompt 里。看起来简单,实际会有四个问题。
第一是窗口占用。一本书按常见规模估算,从几万到几十万 token 都很正常。把这个量级的文本放进 prompt,本地模型直接触发显存压力,在线 API 则意味着每次请求都要按完整 token 计费。
第二是信息权重下降。模型处理超长文本时,注意力会被分散,中间章节的内容经常被遗忘,后面回答问题时容易只记住开头和结尾。
第三是不稳定。有的会话工具在上下文接近上限时会反复做自动总结,但如果原始内容本身就是几十万 token,压缩之后仍然可能超限,最终报错。
第四是复用性差。同样是这本书,换一个场景又要重新处理一遍。每次都是全量重新加载,没有沉淀出可复用的东西。
1.2 技能化的做法:先看总览,再取细节
book-to-skill 的结构可以分成三层。
顶层是一个很小的索引文件,说明这本书有哪些技能、每个技能的职责是什么。中间层是每个技能的元数据,包括技能名称、功能描述、触发示例、来源章节。底层才是技能本体,也就是某个任务真正需要的章节内容、参数表、代码示例。
AI 处理问题时,先读取顶层索引,判断当前问题属于哪个技能,再加载对应的底层内容。这样每次实际进入上下文的,只有“索引 + 当前任务相关的一小块内容”,而不是整本书。
00-index.json # 顶层:全书技能总览 skills/network.json # 中间层:技能元数据 skills/network.md # 底层:技能本体用一个数据库索引来类比:全量注入等于把整张表加载到内存,技能化等于先走索引,再取需要的行。数据量越大,这种做法的优势越明显。
1.3 “省 51 倍”的来源和条件
省 token 的本质不是靠压缩算法,而是大部分内容根本没有进入上下文。假设一本书有 20 万 token,某个问题只涉及其中 2000 token 的内容,只要命中最接近的章节,消耗就从 20 万变成几千,差距确实能达到几十倍。
但这个倍数有条件。第一,书的体量要足够大,一本 30 页的小册子按需加载和全量加载差距有限。第二,任务必须集中在少数章节,如果每个问题都要跨全书查找,按需加载的优势会明显缩小。第三,技能命中要准,如果索引描述写得不好,AI 每次都觉得自己需要加载多个技能,省下的额度会被重新消耗掉。
我的判断是:这类倍数可以作为宣传点理解,但不要拿它当验收指标。真正应该看的是同一批问题下,每次调用消耗了多少 token、回答质量有没有下降、命中率是否稳定。
2. 把一本书转成技能集的完整流程
2.1 输入准备:先统一格式
转换的第一步不是拆分,而是解决输入格式。
不同来源的材料质量差别很大。Markdown、HTML、EPUB、PDF 转出来的文本结构不一定一致。我一般会先把所有输入统一转成 Markdown 或纯文本,再做后续处理。原因是后续的章节识别、标题判断、代码块保留都依赖格式稳定。
需要注意几个点:
- PDF 转文本时,目录和代码块经常错乱,转完要人工抽查。
- 扫描版 PDF 缺少文本层,要先做 OCR,OCR 质量决定后面能不能用。
- HTML 转 Markdown 时,导航、页脚、广告等无关内容要清理掉。
- 原书的目录信息尽量保留,它是最可靠的章节边界依据。
这一阶段的目标不是得到完美文本,而是得到一个“结构可识别、噪音可控”的中间格式。
2.2 技能拆分:按任务切,不按章节切
拆分粒度是整个流程里最关键的一步。
常见的错误是按章节机械拆分:第一章一个技能,第二章一个技能。这种做法的毛病在于章节和问题并不是一一对应的。读者问“怎么让容器之间通信”,答案可能分散在第八章和第十三章。
更合理的方式是按任务拆。我会先列一个问题清单,模拟真实用户会问什么,再根据这些问题反推技能边界。以一本 Docker 书为例,拆出来可能是:
- 环境安装与版本选择
- 镜像构建与仓库管理
- 容器生命周期操作
- 网络配置与端口映射
- 数据卷与持久化
- 日志查看和故障排查
每个技能包含三块内容:一段清晰的职责描述、一组典型触发问题、正文内容。正文可以从书里抽取,不需要把整章搬过去,那些与任务无关的铺垫、重复示例、历史背景可以去掉。
2.3 生成技能元数据
技能元数据决定了 AI 能不能在正确时机加载正确内容。格式用 Markdown 或 JSON 都行,关键是要包含五个字段:技能 ID、技能名称、职责描述、触发示例、内容文件路径。
{ "skill_id": "docker-network", "name": "网络配置与端口映射", "description": "处理容器端口映射、跨容器通信、自定义网络和 DNS 相关问题", "trigger_examples": [ "端口不通", "容器之间访问不了", "ping 不通另一个容器", "如何配置 bridge 网络" ], "source_chapters": ["第 8 章", "第 12.3 节"], "content_file": "skills/docker-network.md" }description 要具体。不要写“本书相关内容”这种空话,而要写清楚这个技能解决什么类型的问题。trigger_examples 尽量收集用户真实问法,而不是书里的标题词。AI 判断技能命中时,这两项信息往往比正文还重要。
顶层索引文件可以很简单,就是一个技能列表:
{ "book_title": "Docker 入门到实践", "skills": [ "docker-install", "docker-image", "docker-container", "docker-network", "docker-volume", "docker-log" ] }2.4 先跑小样本再全量
书很大时,不要一次性转完。我建议先抽 2 到 3 个章节,手动或半自动地做一次完整转换,然后用测试问题验证。验证通过再跑全量。
小样本阶段要看三件事:技能描述是否能被准确识别、加载技能后回答质量是否达到预期、没有命中的问题能不能被正确引导到其他技能或直接拒答。这个阶段发现的问题,比全量转换后返工要便宜得多。
3. 上下文省下来后,质量怎么验证
3.1 用固定问题集做对比
任何“省了多少”的说法,都要落在同一组测试问题上才有意义。
准备 20 到 30 个问题,覆盖书中不同章节,既要有直接查询型问题,也要有跨章节的组合型问题。然后用两种方式各跑一遍:全文注入和技能化按需加载。
记录三个指标:回答完整率、回答准确率、单次调用 token 消耗。回答质量可以用人工评分,哪怕只是“准确 / 部分准确 / 错误”三档,也比凭感觉判断靠谱。
3.2 token 统计和性能指标怎么算
单次调用的 token 数,可以从调用日志里统计请求和响应的总 token。按需加载方案还要额外记录索引消耗和技能命中率,因为索引本身也有成本。
性能不能只看 token。还要看响应时间、首次输出延迟、任务成功率。技能化方案如果命中链路复杂,每次都要先读索引再读技能文件,响应时间可能比全文注入更长,这一点在交互式场景里会很明显。
给一个稳妥的验收思路:先不追求“最少 token”,而是追求“token 显著下降的前提下,回答质量不下降”。质量保住了,再逐步优化 token。
3.3 命中率不高时的排查顺序
如果技能化之后经常回答不到点子上,按以下顺序排查。
- 先看问题是不是被正确路由到了技能。查日志里实际加载了哪个技能文件。
- 再看技能命中的是不是正确技能。如果常加载错误技能,问题出在 description 和 trigger_examples 不够具体。
- 然后看技能内容够不够。若技能正确但回答缺关键信息,多半是拆分时把相关上下文删掉了。
- 最后看输入问题是不是不适合技能化。开放式、跨全书问题本来就不该走这条路。
这个顺序能帮你把问题从“工具不行”定位到“路由不行、内容不行、还是场景不行”。
4. 什么资料适合转技能,什么不适合
4.1 适合转技能的几类资料
结构化明显、任务边界清晰的资料最适合。
操作手册和教程是首选。这类资料每个章节解决一个具体问题,“怎么安装”“怎么配置”“怎么排错”天然适合技能化。API 文档和接口参考也不错,查询型问题多,技能命中率高。代码库说明可以按模块拆分,每个模块对应一个技能。技术规范和参数表同样适合,因为它们本来就可以按条目查询。
这类资料有一个共同点:用户问的问题和书里的章节存在稳定对应关系。对应关系越稳定,技能化越有效。
4.2 不适合转技能的几类资料
反过来,有几类资料不建议硬转。
需要全局理解的材料不适合。例如一本讲系统设计思想的书,观点分散在全书各处,每个技能只加载一小块,反而会让 AI 失去整体视角。结构模糊的扫描版 PDF 也不合适,OCR 之后章节都未必能对齐,强行拆分只会产出错误技能。还有一类是开放式问答场景,问题类似“你怎么评价这本书”,这种任务根本没有稳定命中的技能单元,硬转不如全文注入或 RAG。
4.3 和 RAG、自动总结的边界
book-to-skill 经常被拿来和 RAG、提示词压缩对比,三者的定位不同。
| 方案 | 触发时机 | 核心成本 | 适合场景 |
|---|---|---|---|
| 全文注入 | 每次请求都全量加载 | token 高、噪声多 | 偶发查询、必须全局理解 |
| RAG | 向量检索召回文本块 | 检索质量依赖分块和嵌入 | 知识散落、问题不可预知 |
| 技能化 | 语义路由命中技能包 | 技能设计成本高、命中链路长 | 任务边界清晰、反复使用 |
| 自动总结 | 上下文超限时补救 | 信息损失不可逆 | 长会话兜底 |
RAG 是把文本切成小块,用向量检索召回相关块。技能化比 RAG 多了一层语义约束:每个块不再是孤立的文本,而是带着职责描述、触发示例、来源章节的技能包。RAG 更灵活,适合知识散落的情况;技能化更精准,适合任务边界清晰的情况。
自动总结是上下文已经满了再压缩,属于事后补救。技能化是在源头就决定“什么值得进上下文”,属于事前设计。两者可以配合,但不要混为一谈。如果一本书已经转成技能集,自动总结仍然可以作为兜底,但不再需要承担主要压缩任务。
5. 批量处理多本书时的工程化细节
5.1 目录结构要提前定好
当材料从一本书变成多本书时,目录结构就是第一件要定义的事。没有统一结构,后面脚本、日志、校验都会混乱。
我建议按“知识库 / 书籍 / 技能”三级组织:
knowledge-base/ 00-index.json books/ docker-book/ metadata.json skills/ install.md image.md network.md volume.md k8s-book/ metadata.json skills/ cluster.md workload.md顶层 00-index.json 汇总所有书籍的技能列表,AI 使用时先读这个文件,再按需进入具体书籍的技能文件。metadata.json 记录书籍名称、来源、版本号、转换时间、技能数量。
5.2 增量更新和版本管理
书籍内容会更新,技能集也要跟着更新。每本书最好维护独立的版本记录,改动技能文件时同步更新版本号。
用 git 管理整个知识库是成本最低的做法。技能文件的变化可以 diff,出问题可以回滚到上一版。更重要的是,每次更新都能看到“改了什么、影响哪些技能”,这比直接覆盖文件要安全得多。
5.3 失败重试和日志设计
批量转换时,我强烈建议不要一次性跑完所有书。执行顺序应该是:先跑 3 个文件,确认输出格式;再跑 20 个,确认稳定;最后全量。
日志至少记录四类信息:输入文件路径、拆分出的技能数、失败原因、输出文件列表。失败原因尤其重要,常见的有格式解析失败、章节识别失败、内容太短被误判为空文件。有了日志,批量任务失败时就能直接定位到具体输入,不用重新全量跑一遍。
6. 落地上最容易踩的坑
6.1 省了上下文,不代表省了开发成本
“省 51 倍上下文”说的是运行时的 token,不是开发工作量。把一本书拆成高质量技能集,需要做格式清洗、技能划分、元数据编写、测试问题验证,这些都要花时间和精力。
如果只是偶尔问几个问题,直接全文注入可能更划算。技能化更适合反复使用同一批资料的场景:同一本书要服务很多次问答、很多个任务,前期投入才值得。
6.2 技能粒度过粗或过细,调用都会乱
粒度太粗,一个技能包含太多内容,加载时省不下多少 token,又回到了全量注入的毛病。粒度太细,一个章节拆出十几个技能,AI 判断要加载好几个才能回答问题,命中链路变长,token 反而增加,响应也更慢。
我一般用“能不能独立解决一类问题”来判断粒度。如果一个技能能独立回答 80% 以上的同类问题,粒度就差不多了。判断不了时,宁可先粗一点,跑几轮测试再拆细。
6.3 模型和工具版本会改变行为
同一套技能集,在不同模型上的表现可能差异很大。有的模型能准确理解 description 并直接加载对应技能,有的模型会忽略触发示例,每次都把所有技能都返回。同一个对话工具在不同版本里,对技能文件的读取方式也可能变化。
所以技能设计时要尽量少依赖某个特定模型的“聪明程度”。description 写得越直白,触发示例覆盖越多,就越不依赖模型的额外推理。每次升级模型或工具前,先用固定测试问题集回归一遍。
6.4 能跑通不等于质量过关
最容易被忽略的一点是:技能化跑通很容易,输出稳定很难。
跑通只代表 AI 能读取索引、能加载技能文件、能生成回答。但回答是否完整、是否漏掉了关键前提、是否引用了错误章节,这些要靠问题集和人工抽查才能发现。我自己会保留一批历史测试问题,每次改动技能集都重跑一遍,防止“这次改好了 A,却弄坏了 B”。
回头再看“一本书省 51 倍上下文”这个说法,我的结论是:数字本身不必纠结,真正值得学习的是它背后的上下文工程思路——先决定什么值得进上下文,再决定怎么按需取用。如果你的使用场景是反复处理同一批长文档,技能化很值得试;如果只是偶尔问一次,全文注入也够用。落地时盯着三个指标就够了:命中率、token 消耗、回答质量。三个都稳,方案才算真正立住。