资讯动态

Crawl4LLM 自定义扩展:手把手教你实现专属文档评分器

发布时间:2026/8/21 19:01:01 来源:尧图企业网站定制
Crawl4LLM 自定义扩展手把手教你实现专属文档评分器【免费下载链接】Crawl4LLMOfficial repository for Craw4LLM: Efficient Web Crawling for LLM Pretraining项目地址: https://gitcode.com/gh_mirrors/cr/Crawl4LLMCrawl4LLM 是一个面向 LLM 预训练的高效网页爬虫框架而文档评分器Document Rater正是决定它往哪爬、爬什么的核心组件。本文手把手教你通过自定义扩展实现属于自己的专属文档评分器让爬虫精准筛选高质量训练语料。整个过程只需理解 3 个步骤继承基类、实现打分逻辑、在配置文件中注册零基础也能快速上手。Crawl4LLM 是什么为什么文档评分器是爬虫的大脑 Crawl4LLM 出自论文《Crawl4LLM: Efficient Web Crawling for LLM Pretraining》目标是解决一个经典难题互联网上网页海量但适合做大模型预训练语料的高质量页面只是少数。传统爬虫用广度优先BFS或随机策略抓取效率很低。Crawl4LLM 的思路是边爬边打分每发现一批新网页先用文档评分器给它们打分再按分数决定下一步优先抓取谁。评分器就像爬虫的大脑直接决定了最终语料库的质量。整个核心流程是从种子文档如 seed.txt出发抓取第一批文档用评分器给每个文档打分写入优先级队列每轮从队列顶部弹出最高分的文档顺着它的外链继续扩展重复直到达到目标文档数量评分逻辑集中在 document_rater.py队列与调度逻辑在 crawler.py入口和配置解析在 crawl.py。内置 5 种文档评分器速览 上手自定义之前先看看框架自带的评分器理解评分器到底长什么样。它们全部继承自DocumentRater基类document_rater.py评分器类型标识打分依据需要文档正文RandomRaterrandom_score随机数❌DocumentLengthRaterlength文本长度✅InlinkCountRaterinlink_count入链数量❌FasttextRaterfasttext_scorefastText 模型预测✅EnsembleRaterensemble_score多个评分器加权求和❌从表格可以看出评分器的差异在于打分依据有的只依赖链接结构入链数有的需要读取正文长度、模型打分有的甚至可以随机作为基线对比。自定义扩展的本质就是定义你自己的打分依据。理解评分器核心机制打分、注解与排序 要实现自定义评分器必须先理解三个小概念1. 打分每个评分器接收一批Document对象返回同样数量、但带上了分数注解的Document。文档的字段定义在 corpus_interface.py。2. 注解分数以annotations字典的形式挂在文档上键是评分器名称值是分数。框架里用DocumentAnnotation管理corpus_interface.py多个评分器可以同时打分互不覆盖。3. 排序crawl.py中的DocumentAnnotation.set_compare_method(args.selection_method, args.order)crawl.py决定用哪个评分器的分数作为队列排序依据以及升序还是降序。这就是配置里的selection_method字段。评分器基类提供了_annotate_doc方法document_rater.py它自动帮你把分数写入注解还支持附加归一化后的分数。自定义评分器时你只需要实现__call__方法其余交给基类。手把手实现自定义文档评分器3 个步骤️下面以独特词比例评分器为例它计算文档中去重后的词数占总词数的比例比例越高说明内容越丰富、重复越低越适合做训练语料。这个例子足够简单又能完整体现自定义扩展的全部要点。第 1 步继承 DocumentRater 基类新建一个my_raters.py文件放在项目根目录即可写入以下代码from document_rater import DocumentRater from corpus_interface import Document class UniqueWordRatioRater(DocumentRater): # 类型标识配置文件中用这个字符串引用 _name unique_word_ratio # 打分需要读取正文 _require_doc_text True def __call__(self, docs: list[Document]) - list[Document]: results [] for doc in docs: words (doc.text or ).lower().split() ratio len(set(words)) / len(words) if words else 0.0 results.append(self._annotate_doc(doc, ratio)) return results关键点只有三个继承DocumentRater设置_name配置文件的type字段和_require_doc_text实现__call__输入文档列表、输出打过分注解的文档列表用self._annotate_doc(doc, score)把分数写进注解基类会自动处理一切第 2 步在配置文件中注册并启用评分器不是写出来就能用需要在 crawl.py 的initialize_quality_raters函数中注册让它能根据配置里的type字符串创建实例。在match type_:中加一个分支case unique_word_ratio: quality_raters.append(UniqueWordRatioRater(normalizernormalizer))然后在configs/目录下创建自己的 yaml 配置文件在rating_methods列表中加入新评分器cw22_root_path: path_to_clueweb22_a seed_docs_file: seed.txt output_dir: crawl_results/seed_10k_crawl_my_rater num_selected_docs_per_iter: 10000 num_workers: 16 max_num_docs: 20000000 selection_method: unique_word_ratio # 用自定义评分器决定抓取优先级 order: desc rating_methods: - type: length - type: unique_word_ratio # 我们的自定义评分器注意selection_method必须填unique_word_ratio这样爬虫的优先级队列才会按你的分数排序。第 3 步运行爬虫验证效果先按 README 准备好环境申请 ClueWeb22 数据集、Python 3.10 虚拟环境、安装依赖然后执行git clone https://gitcode.com/gh_mirrors/cr/Crawl4LLM cd Crawl4LLM python crawl.py crawl --config configs/你的配置文件.yaml爬虫运行后每个迭代选取的文档 id 会写入output_dir下的iter_*.docids.txt可以用 fetch_docs.py 拉取对应正文再送入 DCLM 框架做预训练评测。一个专属评分器就正式上线了进阶技巧分数归一化与集成评分 ⚡自定义评分器上线后你可能还会遇到两个常见需求分数尺度不统一和单一评分器不够稳。归一化不同评分器的分数范围差异巨大长度可能是几万独特词比例是 0~1。Crawl4LLM 内置了两种归一化器normalizer.pyZScoreNormalizerzscore和MinMaxNormalizerminmax。在配置中给评分器挂一个归一化器即可rating_methods: - type: unique_word_ratio normalizer: type: minmax min_score: 0.0 max_score: 1.0归一化后的分数会以{rater_name}_normalized为键额外存入注解方便与其他评分器对比或集成。集成评分EnsembleRater支持把多个评分器的分数按权重求和document_rater.py这是提升评分稳定性的经典做法rating_methods: - type: unique_word_ratio - type: length - type: ensemble_score rater_name: my_ensemble raters_and_weights: - rater_name: unique_word_ratio weight: 0.7 - rater_name: length weight: 0.3验证与调试用相关性图评估评分器 怎么知道自定义评分器靠不靠谱项目提供了一个非常好用的评估模式rate模式utils.py。它会读入种子文档用配置中所有评分器打分并生成一张评分器两两之间的 Spearman 相关性图保存为correlations.png。python crawl.py rate --config configs/你的配置文件.yaml这张图能帮你回答三个问题我的评分器和现有评分器高度相关吗如果和length相关度 0.9说明没带来新信息我的分数分布合理吗查看对角线上的分布直方图归一化效果如何normalized分数应大致落在同一尺度建议在正式大规模爬取前先用这个小数据集验证评分器行为避免跑几天才发现方向错了。常见问题与排查技巧 ❓Q1报错 Unknown rating method说明评分器没有在 crawl.py 的match分支里注册回去检查第 2 步。Q2自定义评分器不生效队列排序没变化检查 yaml 里selection_method是否等于评分器的_name且order方向是否正确desc降序、asc升序。Q3我的评分器需要读正文会不会拖慢爬虫会。_require_doc_text True会让爬虫为每个候选文档拉取正文crawler.py。建议评分器尽量轻量或用num_workers并行加速不需要正文的评分器如inlink_count则快得多。Q4能否中途更换评分器可以。爬虫支持保存状态文件save_state_every配置恢复时会自动检测评分器是否变化并重算队列中所有文档的分数crawler.py。总结你的爬虫你的评分规则 Crawl4LLM 的自定义扩展机制非常清爽继承DocumentRater基类 → 实现__call__打分 → 在crawl.py注册 → yaml 配置启用四步即可让爬虫按你的规则筛选网页。无论是想要过滤低质页面、偏好长文本还是引入自己的机器学习模型打分这套机制都能无缝支持。现在就去定制你的专属文档评分器吧让 Crawl4LLM 为你抓取最适合 LLM 预训练的高质量语料【免费下载链接】Crawl4LLMOfficial repository for Craw4LLM: Efficient Web Crawling for LLM Pretraining项目地址: https://gitcode.com/gh_mirrors/cr/Crawl4LLM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价