--- license: Apache License 2.0 #model-type: ##如 gpt、phi、llama、chatglm、baichuan 等 #- gpt #domain: ##如 nlp、cv、audio、multi-modal #- nlp #language: ##语言代码列表 https://help.aliyun.com/document_detail/215387.html?spm=a2c4g.11186623.0.0.9f8d7467kni6Aa #- cn #metrics: ##如 CIDEr、Blue、ROUGE 等 #- CIDEr #tags: ##各种自定义,包括 pretrained、fine-tuned、instruction-tuned、RL-tuned 等训练方法和其他 #- pretrained #tools: ##如 vllm、fastchat、llamacpp、AdaSeq 等 #- vllm tasks: - chatbot frameworks: PyTorch language: - zh - en base_model_relation: finetune datasets: - rqwfwef/Crawl-5k --- # CrawlLLM ## 1. 项目简介 本项目基于 **Qwen2.5-3B-coder-Instruct**,通过 **全参数 SFT 微调**,打造了一个专注于爬虫领域的 **指令生成** 及 **代码补全** 的小参数 LLM。 ### 🌟 主要特点: - ✅ **高质量爬虫代码生成**:能够编写高效、可靠的爬虫代码 - ✅ **精准理解与应用相关库**:适配主流爬虫库,智能调用 API - ✅ **强大的泛化能力**: 微调后的模型在humaneval上极大超越base模型,并超越Qwen2.5-7B-coder-Instruct ### 📦 开源数据集: 我们制作并开源了 [Crawl-5K](https://modelscope.cn/datasets/rqwfwef/Crawl-5k) 及其数据获取流程。 **Crawl-5K** 是首个专注于 **爬虫库相关知识和内容** 的高质量数据集,为 LLM 在爬虫任务上的优化提供了强大支撑。 --- ## 2. 方法 ### 2.1 数据管道 为了提升数据质量,我们设计了一套高效的数据处理流程,主要包括 **官方文档处理** 和 **代码结构化处理** 两部分。 ![数据管道流程图](data-pipeline.png) --- ### 📖 2.1.1 官方文档处理 - **📥 数据采集**: 使用 `playwright` 和 `html2text` 自动化抓取各大官方文档(Docs)网站的 HTML 内容,采用 **广度优先搜索(BFS)**,最大爬取深度设定为 **3** 层。 - **🔄 格式转换**: 抓取的 HTML 内容自动转换为 **Markdown**,确保文本清晰、易读。 - **🔍 关键信息提取**: 基于 **DeepSeek-R1** 挖掘文档重点内容,生成高质量的 **instruction-output** 数据对,为模型训练提供支持。 --- ### 🧑‍💻 2.1.2 代码结构化处理 - **🗂 代码解析**: 使用 **AST(Abstract Syntax Tree,抽象语法树)** 解析官方代码库,使代码更具结构化,提高数据质量。 - **📌 任务拆解**: - **✍️ FIM(Fill-in-the-Middle)任务(50%)** - 参考 **DeepSeek-Code** 的相关研究,格式如下: ```plaintext <|fim_start|>代码前段<|fim_hole|>代码后段<|fim_end|>缺失代码<|eos_token|> ``` - 基于该思想,我们设计出更适合**微调任务**的方法,示例: ```json { "instruction": "请根据上下文补充代码中缺失的部分:", "input": "前文代码<缺失代码>后文代码", "output": "填充代码" } ``` - **🔗 代码续写任务(50%)** - 另一半代码用于 **代码补全** 任务,将结构化代码拆分,输入 **前半部分**,预测 **后半部分**。 - 训练数据同时提供 **代码续写** 指引,帮助模型更好完成续写任务 --- ## 2.2 模型微调策略 🚀 本项目采用 **全参数 SFT(Supervised Fine-Tuning, 监督微调)** 使用**训练框架**:`ms-swfit`**base模型**`Qwen2.5-3B-coder-Instruct` --- ### 📌 训练配置 | 参数 | 值 | 说明 | |----------------|--------------------------|----| | **基础模型** | `Qwen2.5-3B-coder-Instruct` | 预训练代码模型 | | **训练方式** | `全参数 SFT` | 监督微调 | | **数据集** | `Crawl-5K` | 爬虫领域指令数据 | | **训练数据比例** | `99% 训练集, 1% 验证集` | `split_dataset_ratio=0.01` | | **最大序列长度** | `512` | `max_length=512` | | **截断策略** | `delete` | 过长文本直接裁剪 | --- ### 🔧 训练超参数 | 参数 | 值 | 说明 | |--------------------------------|---------------|----| | **学习率** | `1e-5` | `learning_rate=1e-5` | | **权重衰减** | `0.1` | `weight_decay=0.1` | | **批量大小** | `5` | `per_device_train_batch_size=5` | | **梯度累积步数** | `16` | `gradient_accumulation_steps=16` | | **优化器** | `AdamW` | `optim=adamw_torch` | | **β1, β2 (Adam)** | `0.9, 0.999` | `adam_beta1=0.9`, `adam_beta2=0.999` | | **梯度裁剪** | `1.0` | `max_grad_norm=1.0` | | **训练轮数** | `2` | `num_train_epochs=2.0` | | **学习率调度器** | `cosine` | `lr_scheduler_type=cosine` | | **学习率预热比例** | `5%` | `warmup_ratio=0.05` | | **自动混合精度** | `bfloat16` | `bf16=True` | | **梯度检查点** | `启用` | `gradient_checkpointing=True` | --- ### 💾 训练 & 评估策略 | 参数 | 值 | 说明 | |------------------------|-----------------|----| | **评估方式** | `steps` | `eval_strategy=steps` | | **评估步长** | `50` | `eval_steps=50` | | **日志记录步长** | `5` | `logging_steps=5` | | **保存策略** | `steps` | `save_strategy=steps` | | **模型保存步长** | `5000` | `save_steps=5000` | | **最大保存模型数量** | `5` | `save_total_limit=5` | | **数据加载进程数** | `8` | `dataloader_num_workers=8` | --- ✨ 🔗 **相关训练过程** 已在 [Swanlab](https://swanlab.cn/@ryne/Crawl-Qwen2.5-Coder-3B-Instruct-en/charts) 公开,欢迎查看详细训练曲线与指标分析。 --- ## 3. 实验结果 🚀 ### 3.1 效果展示 🔮 在本节中,我们展示了 Scrapy 爬虫的代码示例,其中包含 `parse`、`parse_page2` 和 `errback_page2` 方法。该示例演示了构造 `scrapy.Request` ,并使用我们的模型进行自动补全。 #### 📌 示例: ![代码补全示例](fim.png) 我们使用 `ollama` 结合 `Twinny` 在`vscode`进行代码补全时的界面效果。 ### 3.2 评测数据 📊 在 **Humaneval** 基准测试上,我们的模型取得了优秀的表现: | **Model** | **Dataset** | **Metric** | **Subset** | **Num** | **Score** | |------------------------------------|-------------|-----------|----------------------|--------|-----------| | Qwen2.5-Coder-3B-Instruct | humaneval | Pass@1 | openai_humaneval | 164 | 0.4329 | | Qwen2.5-Coder-7B-Instruct | humaneval | Pass@1 | openai_humaneval | 164 | 0.4817 | | 🏆 **Crawl-Qwen2.5-Coder-3B-Instruct** | humaneval | Pass@1 | openai_humaneval | 164 | **0.5000** | ✨ **关键发现:** - 微调后的 **3B** 模型在爬虫相关任务上的表现 **优于原始 3B 版本** 📈 - 其 **表现甚至优于 7B 版本** 🎯 --- ## 4. 总结 本次项目通过全参数 SFT 微调 Qwen2.5-3B-coder-Instruct,并结合高质量数据管道(官方文档爬取 + 代码 AST 解析),成功构建了一个专注于爬虫任务的 LLM。实验结果表明,模型在代码生成、库调用和任务理解方面都有明显提升。 未来,我们希望将运用CoT技术进一步提升LLM能力,并且运用更多蒸馏、剪枝方法轻量化模型,并开发一套code模型的强化学习技术。 --- ## 5. 相关链接 - **训练日志**:[SwanLab 日志链接](https://swanlab.cn/@ryne/Crawl-Qwen2.5-Coder-3B-Instruct-en/charts) - **模型权重**:[魔搭社区模型权重链接](https://modelscope.cn/models/rqwfwef/Crawl-Qwen2.5-3B-coder) - **Demo体验**:[魔搭社区 Demo 链接](https://www.modelscope.cn/studios/rqwfwef/crawllm) ---