---
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)  

---