Files
Crawl-Qwen2.5-3B-coder/README.md

199 lines
8.0 KiB
Markdown
Raw Permalink Normal View History

---
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 代码结构化处理
- **🗂 代码解析**
使用 **ASTAbstract Syntax Tree抽象语法树** 解析官方代码库,使代码更具结构化,提高数据质量。
- **📌 任务拆解**
- **✍️ FIMFill-in-the-Middle任务50%**
- 参考 **DeepSeek-Code** 的相关研究,格式如下:
```plaintext
<|fim_start|>代码前段<|fim_hole|>代码后段<|fim_end|>缺失代码<|eos_token|>
```
- 基于该思想,我们设计出更适合**微调任务**的方法,示例:
```json
{
"instruction": "请根据上下文补充代码中缺失的部分:",
"input": "前文代码<缺失代码>后文代码",
"output": "填充代码"
}
```
- **🔗 代码续写任务50%**
- 另一半代码用于 **代码补全** 任务,将结构化代码拆分,输入 **前半部分**,预测 **后半部分**
- 训练数据同时提供 **代码续写** 指引,帮助模型更好完成续写任务
---
## 2.2 模型微调策略 🚀
本项目采用 **全参数 SFTSupervised 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)
---