抓取不等于语料库。抓取数十亿页面是一个基础设施问题,这在为AI和LLM训练收集网络数据中已有介绍。把这些页面转化为能改进模型的训练数据则是另一个问题,有其自身的阶段,最终数据集的质量大部分是在这些阶段中决定的。
本指南按顺序讲解这些阶段:决定收集什么、遵守选择退出机制、提取文本、过滤、去重、清除评估污染,以及记录结果。规模较小的通用抓取数据集流程,可参见如何通过网络抓取构建数据集。
从混合比例出发,而非从爬虫出发
在决定抓取什么之前,先决定模型需要什么。训练语料库是一种混合体:各语言、领域、格式和时间段所占的比例,以每类的token预算来表示。
这个目标决定了下游的一切。它告诉你应该从哪些地区收集数据、每个来源应分配多少抓取预算,以及某个域名何时已贡献足够多的数据。没有这个目标,抓取就会偏向那些最容易获取的内容,通常是大型、英语为主、被大量链接的网站,而模型也会继承这种失衡。这个抽样问题在你的住宅代理池是一个样本,而非整个互联网中有详细介绍。
抓取前沿队列
前沿队列是等待抓取的URL队列,你如何管理它决定了网络的哪些部分最终进入语料库。
种子。 从与混合目标匹配的来源开始:按语言和主题整理的域名列表、站点地图,以及来自高质量页面的链接。
优先级排序。 按预期价值对URL排序:来源的质量先验、相对于已有内容的新颖性,以及在时效性重要时的新鲜度。
规范化。 在排队前对URL进行规范化处理,去除跟踪参数、会话标识符和重复路径,以免同一页面因不同地址被多次抓取。
礼貌预算。 对每个主机而非仅全局层面限制并发数和请求速率。一个不断冲击小型网站的前沿队列既不负责任,也会适得其反,因为它会被封锁。具体机制见速率限制与请求节流。
重新抓取策略。 根据每个来源的更新频率以及混合目标所需的新鲜内容量,决定多久重新访问一次。
在抓取时遵守选择退出机制
选择退出信号必须在页面抓取时进行检查,并随页面一起记录,因为这些信号会随时间变化,你可能需要证明当时的状态。
- robots.txt,包括针对特定AI爬虫名称的规则。
- 页面级信号,例如robots meta标签和响应头。
- 机器可读的权利保留声明。 在欧盟,权利持有者可以以机器可读形式保留文本与数据挖掘权利,通用人工智能模型的提供者应当遵守这些保留声明,并记录其训练内容。
- 网站条款中禁止自动化收集或重用的规定。
将选择退出状态与每份文档一起存储,并保留在来源撤回许可后删除文档的能力。更宽泛的框架见面向AI数据收集的合乎伦理的住宅代理。
提取:从HTML到文本
原始HTML大部分并非内容。导航栏、页脚、Cookie提示条、相关文章小部件和广告的数量可能超过页面上的实际文本。
- 提取主要内容,舍弃样板内容。
- 保留承载意义的结构:标题、列表、表格和代码块。
- 处理渲染页面。 有些内容只有在JavaScript运行后才存在;参见何时需要网络抓取API。
- 按文档识别语言,对于混合语言页面则按段落识别,这样才能实际衡量混合目标。
保留原始响应以备重放。提取逻辑会不断改进,从存储的响应中重新提取远比重新抓取便宜。落地模式见将网络抓取API数据导入SQL。
质量过滤
抓取返回的内容大多不值得用于训练。过滤通常分层进行,先从成本最低的开始。
启发式过滤器去除明显的垃圾内容:极短的文档、被符号或数字主导的页面、多次重复的行、缺乏常见虚词的文本,以及主要由链接列表组成的页面。
基于模型的质量过滤器根据你想要更多的文本示例对文档打分。它们功能强大,但也蕴含了一种质量定义,因此需要检查它们系统性排除了哪些内容。
生成内容过滤的重要性逐年提升,详见如何在网络数据集中检测和过滤AI生成内容。
安全过滤器执行模型所需的任何内容政策。
对每种语言分别校准过滤器。针对英语调优的阈值,在某些语言上会删除过多内容,在另一些语言上又删除得太少。并按语言和域名衡量每个阶段删除了什么,这样就能发现某个过滤器正在悄悄删除整个地区的写作内容。
语料库规模的去重
重复文本在网络上无处不在:联合转载的文章、镜像网站、模板化页面以及在某个域名内反复出现的样板内容。如果不加处理,会使被复制得最多的内容被过度加权。
- 完全重复项通过对规范化文本进行哈希处理来去除。
- 近似重复项通过对分片文本使用MinHash和局部敏感哈希来发现,这种方法可以扩展到非常大的语料库。
- 域名内重复的段落,例如免责声明和签名,在段落层面被去除。
- 跨时间的重复项,即同一页面出现在多个抓取快照中,会被合并为一个版本。
个人数据
无论你是否愿意,网络抓取都会收集到个人数据:姓名、电子邮件地址、电话号码,有时还有身份证件号码。不要从登录后的页面收集数据,在处理过程中清除常见的标识符模式,并记录流程删除了哪些内容。法律层面的框架见住宅代理与GDPR合规。
去污染
如果你的评估基准出现在训练数据中,你的评估就不再能衡量任何东西。基准问题和答案会被复制到网络各处,因此污染是默认会发生的。
检查语料库与你计划使用的每个评估集之间的重叠,通常使用长n-gram匹配,并删除或标记匹配项。记录哪些基准被检查过,以便后续结果能被诚实地解读。
记录并版本化一切
训练语料库是数百个决策的产物,没有人能在不了解这些决策的情况下负责任地使用它。
- 逐文档溯源:来源URL、抓取时间、观察所用的观测点、选择退出状态,以及它通过了哪些过滤器版本。
- 数据集卡片,涵盖来源、时间范围、语言、过滤器及其版本、已知缺口和已知偏差。
- 可复现的流程,以便在来源撤回许可时能够重建或修改语料库版本。
记录每次观测发生的地点和时间的理由,详见观测点标准。
大规模的采集层
大规模采集需要分布式的、地理位置合适的出口节点,既是为了触达区域性来源,也是为了将每个主机的请求速率控制在合理范围内。使用Shifter网关时,市场在凭证中针对p.shifter.io:443设置,省略会话标识符会使每个请求轮换出口节点,这适合抓取大量独立页面的前沿队列:
customer-USERNAME-country-jp:PASSWORD
代理层为何对训练数据尤为重要,详见用于AI训练数据的住宅代理。
保持语料库诚信的指标
| 指标 | 它告诉你什么 |
|---|---|
| 按语言和域名统计的token数与目标对比 | 混合目标是否达成 |
| 各过滤阶段按语言的删除率 | 某个过滤器是否在某处过度删除 |
| 重复率 | 抓取内容中有多少是重复的 |
| 选择退出覆盖率 | 记录了选择退出检查的文档比例 |
| 每个基准的污染命中数 | 评估结果是否可信 |
常见问题
我们可以从公开的网络抓取数据开始,而不是自己抓取吗?
公开抓取数据是一个很好的起点。它们滞后于实时网络,并且存在覆盖缺口,因此大多数团队会针对对自己重要的语言和领域,补充有针对性的、更新鲜的采集。
质量过滤应该做到多激进?
要足够激进以去除垃圾内容,同时要足够谨慎地衡量它还删除了什么。在确定阈值之前,按语言和地区审计删除情况。
训练数据需要遵守robots.txt吗?
是的,包括针对AI的特定规则,并记录抓取时的状态。在一些司法管辖区,选择退出机制也正在成为一种法律预期。
这与接地数据(grounding data)有何不同?
训练数据塑造模型的权重。接地数据是在回答时获取并引用的。后者在用实时网络数据为LLM智能体提供接地支持中有介绍。
结论
大规模训练语料库是在抓取之后的各个阶段中构建起来的:决定收集什么的混合目标、保持礼貌的前沿队列、在抓取时检查并记录的选择退出机制、干净的提取、按语言校准的分层过滤、各个层面的去重、针对评估的去污染,以及能让任何人重建这些决策的文档记录。
从混合目标所需的地区收集数据,保留原始响应以备重放,并衡量每个阶段删除了什么。产品视角见面向AI和ML的住宅代理页面,费率见定价页面。