# 煤矿安全大模型——矿途智护者

## 项目背景

- 国家高度重视煤矿安全生产工作，提高从业人员的安全知识水平，是煤矿安全管理的重要基础。
- 安全管理领域积累了海量数据，但难以为安全决策所利用。
- 根据国家矿山安监局统计：90%以上煤矿事故都与人的不安全行为有关。

## 主要功能

- 支持煤矿安全领域常规题型解答，如：单选题、多选题、判断题、填空题等 （针对煤矿主要负责人及安管人员、煤矿各种作业人员）
- 支持针对安全规程规章制度、技术等文档内容回答（如《中华人民共和国矿山安全法》、《煤矿建设安全规程》）
- 支持煤矿历史事故案例，事故处理报告查询，提供事故原因详细分析、事故预防措施以及应急响应知识

## 创建环境
```shell
conda create -n CoalLLM python=3.10
conda activate CoalLLM
```
## 依赖包安装
```shell
pip install modelscope[framework]  # 模型库
pip install py-data-juicer[sci]    # 数据处理库
pip install ms-swift[llm]          # 训练库
pip install ms-swift[eval]         # 评测库
```


##  数据构建

输入如下命令，会在data目录下生成CoalQA_data.json

```shell
git clone https://gitlink.org.cn/yaosenJ/Coal_Mine_SAFETY.git
cd Coal_Mine_SAFETY/data_process
python  Generate_QAdata.py  ../data/CoalQA_data.json
```

CoalQA_data.json内容结构形如：

```json
[
  {
    "instruction": "请提供新建矿井立井井筒冻结法施工的具体要求。",
    "output": "新建矿井立井井筒冻结法施工需要遵守以下要求：冻结深度必须穿过风化带延深至稳定的基岩10m以上，第一个冻结孔必须全孔取芯，钻孔时必须测定钻孔的方向和偏斜度，偏斜度超过规定时必须及时纠正，冻结管必须采用无缝钢管并焊接或螺纹连接，开始冻结后必须经常观察水文观测孔的水位变化，并在确定冻结壁已交圈后才能进行试挖。"
  },
  ...
  
]
```
## 模型训练
安装 flash-attention 加快推理速度
```shell
pip install flash-attn --no-build-isolation
```
使用ms-swift训练模型
```shell
!CUDA_VISIBLE_DEVICES=0 swift sft \
    --sft_type lora \
    --model_type internlm2_5-7b-chat \
    --model_id_or_path /root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat \
    --dataset /root/Coal_Mine_SAFETY/data/data.json\
    --system "你是一个煤矿安全领域的知识达人，你对相关煤矿安全规章规程制度、技术等文档非常熟悉。请你专业正确地解答用户想问的煤矿安全相关问题。" \
    --dataset_test_ratio 0.01 \
    --output_dir output \
    --lora_target_modules ALL \
    --lora_rank 8 \
    --dtype bf16 \
    --seed 42 \
    --learning_rate 1e-4 \
    --warmup_ratio 0.05 \
    --max_length 2048 \
    --batch_size 4 \
    --eval_batch_size 4 \
    --num_train_epochs 3 \
    --gradient_accumulation_steps 4 \
    --save_total_limit 5 \
    --eval_steps 100 \
    --save_steps 100 
   ```
**显存占用**  
  
<p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E6%98%BE%E5%AD%98%E5%8D%A0%E7%94%A8.png?ref=main"/>
    <br>
</p>

**训练日志**
      
<p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2Ftrain_log.png?ref=main"/>
    <br>
</p>

## 使用evalscope评估模型

### 1. 自定义数据集评估

```shell
!CUDA_VISIBLE_DEVICES=0 swift eval \
    --ckpt_dir /root/Coal_Mine_SAFETY/output/internlm2_5-7b-chat/v4-20240909-222741/checkpoint-1113 \
    --eval_dataset no \
    --infer_backend pt \
    --eval_backend Native \
    --eval_limit 10 \
    --seed 42 \
    --eval_batch_size 8 \
    --custom_eval_config custom_eval_config.json \
    --temperature 0.7 \
    --top_k 20 \
    --top_p 0.9 
```
  <p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E8%AF%84%E6%B5%8B.png?ref=main"/>
    <br>
</p>

##  项目展示

<p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%871.png?ref=main"/>
    <br>
</p>
<p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%874.png?ref=main"/>
    <br>
</p>
<p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%875.png?ref=main"/>
    <br>
</p>
<p align="center">
    <br>
    <img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%876.png?ref=main"/>
    <br>
</p>