劳动仲裁案件的要素抽取与画像构建系统的设计与实现

王雨洁 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
.claude 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
backend 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
frontend 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
nlp-service 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
案例文件 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
.gitignore 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
README.md 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
config.py 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
docker-compose.yml 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش
test_e2e.py 3c8c968c3a feat: 劳动仲裁案件要素抽取与画像构建系统 4 هفته پیش

README.md

劳动仲裁案件要素抽取与画像构建系统

面向劳动仲裁领域的多源异构案件材料要素抽取、多维画像构建与辅助分析系统。系统采用"规则引擎 + Chinese RoBERTa 多任务神经网络 + Ollama 大语言模型"三层混合架构,覆盖六大案由类型共计 70 余个要素字段,实现从文件上传到结构化要素、三维画像、相似案件匹配的一站式处理。

系统架构

frontend/ (React 18 + Vite 5, :5173)
    │ Axios HTTP
    ▼
backend/ (FastAPI, :8000)
    ├── RuleBasedExtractor     正则规则抽取(70+ 字段基线覆盖)
    ├── HybridExtractor        三层混合调度(规则/BERT/Ollama 按字段路由)
    ├── PortraitGenerator      法律/事实/风险三维画像评分
    ├── SimilarCaseMatcher     Jaccard 三维加权相似度匹配
    └── RiskPredictor          风险等级评估
    │ HTTP
    ▼
nlp-service/ (FastAPI, :8001)
    ├── ChineseRobertaMultiTask    BERT 多任务模型(NER + 分类 + QA + 回归)
    └── Ollama Qwen 2.5 3B        LLM 零样本增强(可选)
    │
    ▼
MySQL 8.0 (graduation) + Qdrant 向量库(可选)

项目结构

second_type/
├── frontend/                          # React 前端(:5173)
│   └── src/
│       ├── App.jsx                    # 主界面(上传、要素表、画像、相似案件、评估)
│       ├── api.js                     # Axios HTTP 客户端
│       └── styles.css                 # 样式表
├── backend/                           # FastAPI 业务后端(:8000)
│   ├── app/
│   │   ├── main.py                    # 路由与业务逻辑(API 入口)
│   │   ├── models.py                  # ORM 模型(Case, CaseFile, ProcessingTask 等)
│   │   ├── schemas.py                 # Pydantic 请求/响应模型
│   │   ├── config.py                  # 配置管理(读取 .env)
│   │   ├── extractor.py               # 规则抽取器(22 个函数,770 行)
│   │   ├── anj.py                     # Ollama LLM 调用封装
│   │   ├── hierarchy_extract.py       # 案由层级模板
│   │   ├── db.py                      # 数据库连接与 Session
│   │   ├── migrate.py                 # 数据库迁移
│   │   ├── services/
│   │   │   ├── hybrid_extractor.py    # 混合抽取器(4 模式切换)
│   │   │   ├── portrait_generator.py  # 画像生成(三维度评分)
│   │   │   ├── similar_cases_local.py # 相似案件匹配(Jaccard)
│   │   │   ├── document_parser.py     # 文件解析(PDF/DOCX/TXT)
│   │   │   ├── complexity_classifier.py # 复杂度分类
│   │   │   └── risk_predictor.py      # 风险评估
│   │   └── extractors/
│   │       └── rule_extractor.py      # 独立规则提取器
│   ├── data/
│   │   ├── case_elements_schema.json  # 要素 Schema(277 行)
│   │   ├── case_elements_hierarchy.json # 案由层级模板
│   │   ├── raw_corpus.json            # 清洗后语料
│   │   ├── training_dataset.json      # 训练数据
│   │   └── augmented_dataset.json     # 增强数据(150+ 条)
│   ├── tools/
│   │   ├── prepare_dataset.py         # 数据清洗脚本
│   │   ├── evaluate_extraction.py     # 评估脚本
│   │   └── evaluate_extractor.py      # 提取器评估
│   ├── uploads/                       # 上传文件存储
│   ├── .env                           # 环境变量配置
│   └── requirements.txt               # Python 依赖
├── nlp-service/                       # NLP 模型微服务(:8001)
│   ├── app/
│   │   ├── main.py                    # API 路由(/extract, /health)
│   │   ├── schemas.py                 # 请求模型
│   │   └── services/
│   │       ├── extractor.py           # BERT 提取器(模型 + 规则回退)
│   │       ├── bert_multi_task_model.py # 多任务模型定义
│   │       └── model_loader.py        # 单例模型加载器
│   ├── training/
│   │   ├── train_bert.py              # 训练脚本
│   │   ├── bio_schema.py              # BIO 标签体系(15 类实体,31 标签)
│   │   ├── prepare_training_data.py   # 自动标注流水线
│   │   ├── augment_data.py            # 数据增强
│   │   └── evaluate.py                # 统一评估框架
│   └── models/
│       └── chinese_roberta_labor_extractor_v2/  # 训练好的模型(~391MB)
├── config.py                          # 根目录配置兼容模块
├── docker-compose.yml                 # PostgreSQL + Qdrant 容器(可选)
├── test_e2e.py                        # 端到端测试脚本
└── README.md

快速开始

环境要求

  • Python 3.10+(推荐 Conda)
  • Node.js 18+
  • MySQL 8.0+
  • (可选)Ollama + Qwen 2.5 3B

1. 数据库

CREATE DATABASE graduation CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

配置 backend/.env

DATABASE_URL=mysql+pymysql://root:密码@127.0.0.1:3306/graduation?charset=utf8mb4
USE_OLLAMA=true
OLLAMA_BASE_URL=http://127.0.0.1:11434
OLLAMA_MODEL_NAME=qwen2.5:3b

2. 安装依赖

# 后端
cd backend
pip install -r requirements.txt

# NLP 服务
cd nlp-service
pip install -r requirements.txt

# 前端
cd frontend
npm install

3. 启动服务

# 终端 1:后端
cd backend
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

# 终端 2:NLP 模型服务
cd nlp-service
uvicorn app.main:app --reload --host 0.0.0.0 --port 8001

# 终端 3:前端
cd frontend
npm run dev -- --host 0.0.0.0 --port 5173

浏览器访问 http://localhost:5173

4.(可选)启动 Ollama

ollama serve
ollama pull qwen2.5:3b

API 参考

后端 API(:8000)

方法 端点 说明
GET /health 健康检查
POST /api/cases/upload 上传案件材料,触发自动抽取
GET /api/cases/{id} 获取案件详情
GET /api/cases/{id}/elements 获取结构化要素
PUT /api/cases/{id}/elements 更新要素(前端编辑后保存)
GET /api/cases/{id}/portrait 获取案件画像
POST /api/cases/{id}/similar 获取相似案件({"top_k": 5}
GET /api/evaluation/metrics 获取评估指标

完整文档:http://localhost:8000/docs(Swagger 自动生成)

NLP 微服务 API(:8001)

方法 端点 说明
GET /health 模型状态检查
POST /extract BERT 模型要素抽取
POST /extract/compare 规则 vs 模型对比

模型架构

Chinese RoBERTa (hfl/chinese-roberta-wwm-ext, ~102M)
    ├── Token Classification Head (768 → 31) ─── NER(15 类实体 BIO 标签)
    ├── Classification Heads (768 → 6, 768 → 4) ─── 案由/合同分类
    ├── Span QA Head (768 → 2) ─── 事实片段抽取
    └── Regression Head (768 → 128 → 64 → 1) ─── 金额预测

联合损失:L = 0.40×L_NER + 0.30×L_CLS + 0.15×L_QA + 0.15×L_REG
优化器:AdamW (lr=2e-5),FP16 混合精度,早停 patience=3

三层混合抽取策略

层级 实现 负责字段 优势
Layer 1 规则层 RuleBasedLaborExtractor(22 个正则函数) 姓名、日期、金额、法条、案号 精确率高、速度快(0.02s)
Layer 2 BERT 层 ChineseRobertaMultiTask(4 任务头) 案由分类、实体识别、片段抽取 语义理解强、召回率提升 12pp
Layer 3 LLM 层 Ollama Qwen 2.5 3B(零样本) 仲裁请求、解除原因、自由文本 零样本泛化、覆盖极端变体

三层通过 HybridExtractor 按字段类型路由,任一层不可用时自动降级至下层,核心链路不中断。

配置说明

backend/.env 主要配置项:

变量 默认值 说明
DATABASE_URL - MySQL 连接字符串
extractor_mode rules 抽取模式:rules / bert / ollama / hybrid
use_ollama false 启用 Ollama LLM 增强
ollama_base_url http://127.0.0.1:11434 Ollama 服务地址
ollama_model_name qwen2.5:3b 使用的模型
use_remote_nlp_service false 使用远程 NLP 微服务
bert_model_service_url http://localhost:8001/extract BERT 服务地址
use_vector_store false 启用 Qdrant 向量检索

模型训练

数据准备

# 1. 清洗语料
cd backend
python tools/prepare_dataset.py

# 2. 自动标注(规则抽取 → BIO 标签 + 分类标签)
cd nlp-service/training
PYTHONPATH="..;../../backend" python prepare_training_data.py

# 3. 数据增强
PYTHONPATH="..;../../backend" python augment_data.py

训练

cd nlp-service/training
HF_ENDPOINT="https://hf-mirror.com" PYTHONPATH="..;../../backend" \
    python train_bert.py \
    --dataset ../../backend/data/augmented_dataset.json \
    --output ../models/chinese_roberta_labor_extractor \
    --epochs 10 \
    --batch_size 4 \
    --lr 2e-5

评估

cd nlp-service/training
PYTHONPATH="..;../../backend" python evaluate.py \
    --dataset ../../backend/data/augmented_dataset.json \
    --output eval_results.json \
    --methods rules,bert

端到端测试

确保三服务已启动后运行:

python test_e2e.py

测试覆盖:健康检查 → 上传案件 → 获取要素 → 获取画像 → 相似案件匹配 → NLP 直接调用。

技术栈

层级 技术
前端 React 18 + Vite 5 + Recharts + Axios
后端 FastAPI + SQLAlchemy + PyMySQL
NLP 模型 Chinese RoBERTa (hfl/chinese-roberta-wwm-ext) + Multi-Task
LLM Ollama + Qwen 2.5 3B(本地部署)
文档解析 pypdf + python-docx + python-magic
中文分词 jieba
向量检索 Qdrant + sentence-transformers(可选)
数据库 MySQL 8.0

六案由要素体系

案由类型 核心要素
劳动关系纠纷 劳动关系确认、未签合同双倍工资
工伤保险待遇 伤残补助金、医疗费、停工留薪期工资
追索劳动报酬 拖欠工资、加班费、高温津贴
经济补偿金 协商解除补偿、代通知金
赔偿金 违法解除赔偿金(2N)
生育保险待遇 生育津贴、生育医疗费

已知限制

  • 训练数据:当前增强后约 150 条样本,NER 标注稀疏,实体识别仍高度依赖规则层
  • Ollama 依赖:LLM 增强需本地运行 Ollama 服务,不可用时可回退至规则模式
  • BERT 模型:嵌套实体和边界模糊实体的预测不够稳定
  • 匹配性能:相似案件使用线性扫描 O(N),大规模时建议启用 Qdrant 向量检索

许可证

本项目仅用于学术研究与毕业设计展示。