---
title: hr4b-v4-hrdata
canonical_url: "https://www.modelscope.cn/datasets/jack3688/hr4b-v4-hrdata"
md_url: "https://www.modelscope.cn/datasets/jack3688/hr4b-v4-hrdata.md"
repository: jack3688/hr4b-v4-hrdata
chinese_name: "企业HR助手-微调数据集与源码"
last_updated: 2026-08-06
license: Apache-2.0
downloads: 194
stars: 0
---

# hr4b-v4-hrdata

> hr4b-v4-hrdata - jack3688 在 ModelScope 开源的数据集。河北源泰文化传播有限公司 企业HR助手：3份原始人事文档 → 558条SFT数据集（V4），含完整数据处理流水线源码与文档

jack3688/hr4b-v4-hrdata 是 ModelScope 魔搭社区上的数据集，采用 Apache-2.0 许可。

- **Repository**: jack3688/hr4b-v4-hrdata
- **License**: Apache-2.0
- **Downloads**: 194
- **Stars**: 0
- **Last updated**: 2026-08-06

Source: https://www.modelscope.cn/datasets/jack3688/hr4b-v4-hrdata

---

## 目录

1. [项目概览](#一项目概览)
2. [原始数据处理完整思路](#二原始数据处理完整思路)
3. [数据优化技术细节](#三数据优化技术细节)
4. [重点难点](#四重点难点)
5. [Orin 部署与推理](#五orin-部署与推理)
6. [仓库文件说明](#六仓库文件说明)

---

## 一、项目概览

| 项目 | 值 |
|------|-----|
| 公司 | 河北源泰文化传播有限公司 |
| 模型 | Qwen3.5-4B + LoRA（r=16, alpha=32, QLoRA 4bit） |
| 训练数据 | 558 条（单轮 540 + 多轮 18），ChatML 含 system |
| 训练配置 | max_seq_length 512 / batch 1 / grad_accum 32 / epochs 3 |
| 训练结果 | final loss 1.139（V4，530 条 train） |
| 部署 | GGUF Q4_K_M 量化（2.6G）+ llama.cpp / unsloth studio |
| 推理速度 | 本机 34.9 tok/s / Orin 29-31 tok/s |

**处理链路总览**：

```
3份原始txt ──→ prepare_dataset.py 流水线 ──→ 558条SFT数据（多格式）
    │                                             │
    │ ①解析结构化             ②生成问答             │ unsloth train
    │ ③同义问法 ④多轮追问     ⑤防幻觉 ⑥数字抽测      ▼
    └─────────────────────────────────────→ Qwen3.5-4B LoRA 微调
                                                │
                                         GGUF 导出（含 mmproj）
                                                │
                              ModelScope 分发 → 本机/Orin llama.cpp 部署
```

---

## 二、原始数据处理完整思路

### 2.1 数据来源（3 份异构文档）

| 文件 | 格式特征 | 解析策略 |
|------|---------|---------|
| `人事工作流程.txt` | 制表符表格（分类/子任务/责任人/标准/时间） | `parse_workflow_table` 按 `\t` 拆列、`\n` 分行 |
| `人事管理流程.txt` | 编号章节 + 项目符号 + 审批权限表 + 入职准备表 | `parse_policy_document` 正则提取章节标题、`_parse_approval_region` 解析审批表 |
| `行政人事日常工作流程图表汇总.txt` | 分隔线分节（【流程步骤】【流程说明】等） | `parse_workflow_catalog` 双通道：章节明细 + 目录 TOC |

**核心思路**：三类文档格式完全不同，不能用一个解析器硬啃——**按格式特征各写解析器，统一收敛为结构化中间产物 `structured_records.json`**（分类/子任务/责任人/标准/时间），后续问答生成全部基于结构化数据，保证一致性。

### 2.2 解析 → 结构化

- **表格文档**：清洗空行、制表符错位，提取 `{category, items:[{task, responsible, standard, time}]}`
- **制度文档**：按章节号排序（`_sec_key` 处理 "10" > "9" 的字典序陷阱），章节正文项目符号 → bullets
- **图表汇总**：目录（TOC）单独提取 → 生成"有哪些章节"类问题；正文分节 → 生成章节明细问答

### 2.3 结构化 → 问答（多角度生成）

每个分类生成 5 类基础问答，覆盖不同信息维度：

| 类型 | 问题示例 | 信息维度 |
|------|---------|---------|
| 流程总览 | `{分类}的工作流程是什么？` | 全流程步骤 |
| 责任人汇总 | `{分类}工作由谁负责？` | 责任人 |
| 时间节点 | `{分类}各项任务的时间节点？` | 时间 |
| 子任务细节 | `"{子任务}"由谁负责/时间要求/标准？` | 单一子任务三要素 |
| 场景化问答 | 手工编写的真实员工问法 | 口语化 |

### 2.4 数据组成（558 条 = 单轮 540 + 多轮 18）

| 来源 | 条数 | 说明 |
|------|------|------|
| workflow_table | ~110 | 表格文档 5 类问答 + 同义问法 + 数字抽测 |
| policy_doc | ~30 | 制度章节问答 + 审批权限 + 入职准备 |
| workflow_catalog | ~180 | 图表汇总章节问答 + TOC |
| company_context | ~120 | 公司实体（组织/人员/审批/文档）+ 寒暄 + 防幻觉 |
| multiturn | 18 | 手工多轮对话（全生命周期 + 否定/澄清追问） |

---

## 三、数据优化技术细节

> 这是本项目数据质量的核心。共 6 大优化方向，全部在 `prepare_dataset.py` 中实现。

### 3.1 同义问法（问题多样性）

**问题**：模板化问法（"X 的工作流程是什么？"）会让模型只会回答一种句式。

**方案**：`SYNONYM_TMPLS` 提供 5 种口语化问法轮换：
```python
SYNONYM_TMPLS = [
    "我想办{c}，具体怎么弄？",
    "怎么办理{c}？",
    "{c}要走哪些手续？",
    "{c}麻烦吗？大概什么流程？",
    "我们员工问{c}怎么办？",
]
```
每个分类生成 2 个同义问法，**答案复用同一份**（不重复内容只换问法）。效果：模型学会"同一个流程，各种问法都能答"。

### 3.2 多轮追问链（对话能力）

**问题**：单轮数据训练出的模型只会一问一答，不会承接上下文追问。

**方案**：`build_multiturn_qa` 手工编写 **18 组多轮对话**，覆盖：

- **全生命周期追问**：招聘（流程→面试→审批）入职（材料→手续→合同）转正（申请→审批）离职（申请→手续→工资）五险一金（办理→缴费→回单）考勤（汇总→责任人）合同（签订→续签）
- **否定/澄清追问**：如"试用期离职也要提前30天吗？"→"不是的，试用期提前3天即可"——训练模型**纠正误解**而非顺着错误前提
- **边界追问**："劳动合同签几年？"→"制度未统一规定"（不编造）

### 3.3 制度深挖（业务准确性）

**问题**：泛泛的流程问答丢失了制度细节（审批链、责任人、时限）。

**方案**：
- **审批权限**：从 `APPROVAL_HIERARCHY` 生成"X需要哪些层级审批？"（如 招聘申请：部门经理 → 部门分管领导 → 人力资源部经理 → 总经理）
- **责任人绑定**：从 `PERSONNEL` 生成"X由谁负责？"，**特别强化**易混淆点——"是赵修艺负责招聘吗？"→"不，招聘由严致荣、周敏江负责，赵修艺负责入职转正离职"
- **正向样本反制**：防幻觉样本过强会导致真实业务误拒答，补 3 条入职材料正向样本 + 招聘责任人 4 条变体

### 3.4 边界防幻觉（不编造）

**问题**：基座模型对"像 HR 但制度没写"的问题会编造（面试评分表编维度、食堂编菜单）。

**方案**：`unknown_pairs` 50+ 条强拒答样本，**三类递进**：

1. **制度外工具类**（面试评分表）："公司制度中没有任何面试评分表模板，我不能也不应该凭空编造评分维度、权重……"
2. **行政类**（食堂/地址/福利）："不在人事管理制度范围内，建议咨询行政部"
3. **薪酬隐私类**（工资/加班费/补偿金）："薪酬保密 / 制度未查到，建议咨询财务部"

**关键设计**：拒答措辞分级——工具类最强硬（"严禁编造"），行政类温和（"建议咨询"），既防幻觉又不显得机械。**平衡原则**：防幻觉样本不能太多，否则误伤真实业务问答（曾导致"入职材料"误拒答，靠 3.3 的正向样本修复）。

### 3.5 数字抽测（精确性）

**问题**：模型对大数/时限类细节容易说错（如"提前几天""每月几号"）。

**方案**：`TIME_PATTERNS` 正则匹配含明确数字的子任务（`\d+天 / 号 / 周 / 个工作日 / 个月内 / 年 / 月份`），对每个匹配项生成"具体是多久？"抽测问答，强化模型对数字的精确记忆。

### 3.6 寒暄与人设（真实使用体验）

**问题**：V1 模型"你好"回英文、自我介绍"由赵修艺开发"幻觉。

**方案**：`greeting_pairs` 30+ 条中文寒暄（你好/在吗/谢谢/再见/你能做什么/介绍下你自己/你是真人吗），关键点：
- **身份澄清**：自我介绍明确"基于公司人事制度文档构建的智能服务，不是真人，也不是公司员工开发的"
- **能力展示**："你能做什么/你有哪些能力"回答列出 5 类可解答业务
- **中英文触发**：hello/hi/ok 也回中文并引导"请用中文向我提问"

### 3.7 去重与过滤（质量保障）

`filter_and_dedup` 三层过滤：

| 层级 | 规则 | 目的 |
|------|------|------|
| 长度 | 问题 <2 字、答案 <3 字或 >2000 字丢弃 | 防止残缺/超长样本 |
| 精确去重 | `(user, assistant)` 哈希集合 | 完全重复丢弃 |
| 近似去重 | `norm_for_dedup` 归一化（去标点/空格/全半角）后比较 | 语义重复丢弃 |

**关键细节**：近似去重归一化后比较，避免"你好"与"你好呀"等仅标点差异的重复；但寒暄类每句有独立答案不误杀（曾踩坑：全量近似去重把寒暄对杀光，改为长度下限 + 按内容判重）。

### 3.8 数据增强与平衡

- **system prompt 变体**：3 套系统提示词轮换，增强人设鲁棒性
- **问句模板轮换**：`WF_Q_TMPLS / RESP_Q_TMPLS / TIME_Q_TMPLS` 按索引轮换，问题表述多样性
- **训练/验证切分**：`split_by_source` 按来源分层切分（val 5%），保证验证集覆盖各来源
- **多格式导出**：`export_formats` 同时输出 ChatML / ShareGPT / Alpaca / Completion 4 种格式，适配不同训练框架

---

## 四、重点难点

### 4.1 Qwen3.5 是 VLM 架构（最大坑）

- Qwen3.5 是 `Qwen3_5ForConditionalGeneration`（视觉塔 + 文本塔 + MMProj）
- unsloth studio 部署 4B HF 模型强制走 **FastVisionModel 分支**，6GB 显存爆（`CUDA driver error`）
- **解法**：GGUF 量化（Q4_K_M 2.6G）+ llama.cpp / unsloth studio 加载，本机 6GB 可跑 35 tok/s
- **GGUF 必须带 mmproj 视觉塔**（`master.BF16-mmproj.gguf`），否则纯文本加载报错

### 4.2 transformers ≥5.2.0（环境门槛）

- qwen3_5 架构需要 transformers ≥5.2.0（本机 5.5.0 为 unsloth 支持上限）
- 依赖 `flash-linear-attention`（GDN 层加速）+ `causal-conv1d`（需官方预编译 wheel，`+` 文件名必须保留）

### 4.3 6GB 显存训练极限

- 2B：max_seq_length 1024；4B：**512**（batch 1 + grad_accum 32 补偿）
- QLoRA 4bit + train_on_completions（只训回答部分）

### 4.4 数据防幻觉的平衡

- 拒答样本过强 → 误伤真实业务（入职材料误拒答）
- 拒答样本过弱 → 编造（面试评分表/食堂）
- 迭代 4 版才找到平衡点：分级拒答措辞 + 正向样本反制 + epochs 3

### 4.5 双机部署网络瓶颈

- 本机 ↔ Orin 直连 scp 仅 60KB/s（33% 丢包）
- **解法**：ModelScope 中转（本机上传 15min → Orin 下载 5min @ 8.8MB/s）

### 4.6 Orin 后台服务保活

- SSH 断开会杀掉后台进程 → 必须 `setsid bash -c '...' < /dev/null &`

---

## 五、Orin 部署与推理

> Orin（100.84.197.70，aarch64，30GB 统一显存）只需简单两步：下载模型 → 启动服务。

### 5.1 下载 GGUF（从 ModelScope，约 5 分钟）

```bash
ssh jack@100.84.197.70
export PATH=$HOME/.local/bin:$PATH
modelscope download --model jack3688/hr4b-v4-gguf --local_dir /home/jack/models/hr4b-v4-gguf
```

### 5.2 启动服务（unsloth studio，带 Web UI）

```bash
cd /home/jack/models/hr4b-v4-gguf
setsid bash -c '/home/jack/.local/bin/unsloth studio run \
  --model /home/jack/models/hr4b-v4-gguf/master.Q4_K_M.gguf \
  --host 0.0.0.0 --port 8888 > /home/jack/studio_gguf.log 2>&1' < /dev/null &
# mmproj 视觉塔自动发现（同目录）；Web UI 端口 8888；API key 见日志
```

### 5.3 推理（OpenAI 兼容 API）

```bash
# 浏览器 Web UI: http://<orin-ip>:8888
# 或 API:
curl http://100.84.197.70:8888/v1/chat/completions \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "master.Q4_K_M",
    "messages": [
      {"role": "system", "content": "你是河北源泰文化传播有限公司的企业HR助手，负责解答人事、行政、招聘、培训、考勤、薪酬等日常问题。回答请简洁准确，基于公司制度。不知道的不要编造。"},
      {"role": "user", "content": "招聘新员工的具体流程是什么？"}
    ],
    "max_tokens": 300
  }'
# 实测 29-31 tok/s
```

---

## 六、仓库文件说明

```
hrdata/
├── README.md                        # 本文档
├── prepare_dataset.py               # 【核心】数据流水线（解析→问答→优化→导出）
├── company_entities.py              # 公司实体（公司名/部门/人员/审批链/文档/系统提示词）
├── convert_workflows.py             # 早期转换脚本（v1 流程解析，被 prepare_dataset.py 取代）
├── 人事工作流程.txt                 # 原始文档①：表格型
├── 人事管理流程.txt                 # 原始文档②：制度型
├── 行政人事日常工作流程图表汇总.txt  # 原始文档③：图表汇总型
├── output/
│   ├── train.jsonl                  # 训练集（530 条，ChatML）
│   ├── val.jsonl                    # 验证集（28 条，ChatML）
│   ├── hr_workflows_chatml.jsonl    # 全量 558 条（ChatML）
│   ├── structured_records.json      # 结构化中间产物（可复用于 RAG）
│   └── dataset_stats.json           # 数据统计
└── deploy/
    └── DEPLOYMENT.md                # 完整部署文档（本机 + Orin）
```

### 复现步骤

```bash
# 1. 生成数据
python3 prepare_dataset.py

# 2. 微调（需 unsloth + Qwen3.5 环境，见 QWEN3.5_FINETUNE_NOTES.md）
cd output && unsloth train --config train_config_4b.yaml

# 3. 部署（见 deploy/DEPLOYMENT.md 与本文档第五章）
```
