199 lines
8.0 KiB
Markdown
199 lines
8.0 KiB
Markdown
---
|
||
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 数据管道
|
||
|
||
为了提升数据质量,我们设计了一套高效的数据处理流程,主要包括 **官方文档处理** 和 **代码结构化处理** 两部分。
|
||
|
||

|
||
|
||
---
|
||
|
||
### 📖 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` ,并使用我们的模型进行自动补全。
|
||
|
||
#### 📌 示例:
|
||

|
||
|
||
我们使用 `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)
|
||
|
||
--- |