Model: rqwfwef/Crawl-Qwen2.5-3B-coder Source: Original Platform
license, tasks, frameworks, language, base_model_relation, datasets
| license | tasks | frameworks | language | base_model_relation | datasets | ||||
|---|---|---|---|---|---|---|---|---|---|
| Apache License 2.0 |
|
PyTorch |
|
finetune |
|
CrawlLLM
1. 项目简介
本项目基于 Qwen2.5-3B-coder-Instruct,通过 全参数 SFT 微调,打造了一个专注于爬虫领域的 指令生成 及 代码补全 的小参数 LLM。
🌟 主要特点:
- ✅ 高质量爬虫代码生成:能够编写高效、可靠的爬虫代码
- ✅ 精准理解与应用相关库:适配主流爬虫库,智能调用 API
- ✅ 强大的泛化能力: 微调后的模型在humaneval上极大超越base模型,并超越Qwen2.5-7B-coder-Instruct
📦 开源数据集:
我们制作并开源了 Crawl-5K 及其数据获取流程。
Crawl-5K 是首个专注于 爬虫库相关知识和内容 的高质量数据集,为 LLM 在爬虫任务上的优化提供了强大支撑。
2. 方法
2.1 数据管道
为了提升数据质量,我们设计了一套高效的数据处理流程,主要包括 官方文档处理 和 代码结构化处理 两部分。
📖 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 的相关研究,格式如下:
<|fim_start|>代码前段<|fim_hole|>代码后段<|fim_end|>缺失代码<|eos_token|> - 基于该思想,我们设计出更适合微调任务的方法,示例:
{ "instruction": "请根据上下文补充代码中缺失的部分:", "input": "前文代码<缺失代码>后文代码", "output": "填充代码" }
- 参考 DeepSeek-Code 的相关研究,格式如下:
-
🔗 代码续写任务(50%)
- 另一半代码用于 代码补全 任务,将结构化代码拆分,输入 前半部分,预测 后半部分。
- 训练数据同时提供 代码续写 指引,帮助模型更好完成续写任务
-
2.2 模型微调策略 🚀
本项目采用 全参数 SFT(Supervised Fine-Tuning, 监督微调)
使用训练框架:ms-swfitbase模型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 公开,欢迎查看详细训练曲线与指标分析。
3. 实验结果 🚀
3.1 效果展示 🔮
在本节中,我们展示了 Scrapy 爬虫的代码示例,其中包含 parse、parse_page2 和 errback_page2 方法。该示例演示了构造 scrapy.Request ,并使用我们的模型进行自动补全。
📌 示例:
我们使用 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 日志链接
- 模型权重:魔搭社区模型权重链接
- Demo体验:魔搭社区 Demo 链接

