你的编码代理打开一个文档页,只想回答一个问题。它拿到的是导航栏、侧边栏、页脚、隐藏菜单、脚本和标记。答案就埋在里面某处,而你要为这全部内容付费——付在token上,付在上下文窗口里,付在延迟上。
在PyPI的NumPy页面上,项目描述大约是2,000个token。而整页按常规方式转成Markdown,是92,348个token。多出来的绝大部分,是一份隐藏的清单,列着每个版本里的每个文件,还带着哈希值——这些东西你在浏览器里根本看不见。
leantext做的事,就是在这些噪音抵达代理之前把它们删掉,然后检查有没有重要内容被一起删掉,最后告诉你省下了多少。
用法很直接:给它一个URL或一个文件,Markdown从标准输出出来。以Stripe的创建客户接口文档为例,加上--report参数后,报告显示:原始HTML从521,378降到1,194,省下100%;常规方式转出的整页Markdown从3,958降到1,194,省下70%。代理最终拿到的,是请求、响应、每个参数及其类型、以及返回值,别的什么都没有。
它处理网页、PDF(文本版和扫描版)、截图(先走OCR,视觉模型只作为兜底)以及Office文件。
这里有个容易被忽略的口径问题:节省比例是对比"整页按常规方式转成Markdown"算的,不是对比原始HTML——因为那才是代理原本会拿到的东西。token计数用的是tiktoken。
作者还拿开发者每天都会打开的参考页面跑了一遍。每一行都是无损的:源文件里的所有代码块和表格都出现在输出里。像Python的pathlib参考页、或者一篇密集的研究论文这种几乎全是内容的页面,可删的东西本来就少,leantext会正确地不去动它们。
在Claude Code里做的端到端测试中,开启leantext后,代理把21个任务全部答对,21/21。
安装时对钩子选"是",重启Claude Code,然后继续干活。当代理读取网页、扫描版PDF或Office文件时,leantext会先做转换。每个决定都会带着原因记进日志,用tail -3 ~/.cache/leantext/hook.jsonl就能看。想关掉,随时设LEANTEXT_HOOK=off。
作者最在意的部分,是它"失败时放行"。省token很容易,只要你不介意把答案也一起省掉。所以每次转换之后,leantext会把输出的结构和源文件对比:代码块、表格、标题、有多少文本存活下来、页面标题还在不在。它还能识别机器人拦截页和只有JavaScript才能渲染的页面。一旦有哪里看着不对,或者节省比例低于15%,钩子就让开,代理去读原始页面。
日志里会留下这样的记录:leantext: extraction suspicious: code blocks: 83 in source, 14 in output。也就是说,最坏的情况跟没装leantext一样。
这道检查在上线前就回本了。作者第一次跑那张对比表时,Python的pathlib页面83个代码示例只完整留下了14个。Sphinx把示例放在API块里,提取器把它们拍平进了周围的正文。Node的文档则丢了123张版本历史表里的116张,那些表藏在折叠框里。两处都被标记出来了,所以不会有代理读到坏掉的版本。
修复办法是:提取之前,把每个代码块和数据表换成占位符。提取器仍然决定什么是主体内容(所以侧边栏里的代码照样被丢掉),之后这些块带着语言标签原样放回去。Python那个页面现在83个示例全在,并且作为回归测试保留了下来。
整个流程分五步:
- 抓取。如果站点自己提供Markdown(Stripe、GitHub Docs、Docker文档都提供),就用它。
- 剥掉读者看不见的东西:隐藏元素、未选中的标签面板、关闭的对话框。
- 用trafilatura提取主体内容,代码和表格处于被保护状态。
- 把结果和源文件做对比检查。
- 测量转换前后的token数。
安装大约20秒(正常网络下),Mac上占39MB,不需要系统级依赖包:克隆仓库,进入目录跑./install.sh,安装器会问你要不要加Claude Code钩子。
最好的测试对象,是你读得最多的那些文档。加上--report跑一遍,如果哪里输出不对或者被标记了,带上URL去开个issue。标记会明确告诉你丢了什么,修起来很快。项目采用Apache-2.0协议。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.