# 施工方案数据脱敏模块

基于 `wlast.md` (v2.3) 文档实现的数据脱敏系统。

## 目录结构

```
desensitize/
├── __init__.py              # 模块导出
├── engine.py                # 脱敏引擎核心
├── validator.py             # 黑白名单校验器
├── dict_manager.py          # 脱敏字典管理器
├── model_client.py          # 本地大模型客户端
├── remapper.py              # 审查结果逆向映射器
├── processors/              # 四维度处理器
│   ├── base_processor.py    # 处理器基类
│   ├── pii_processor.py     # PII脱敏（姓名/手机/身份证）
│   ├── geo_processor.py     # 地理坐标脱敏（桩号/地名/高程）
│   ├── biz_processor.py     # 商业标识脱敏（企业名/项目名）
│   └── financial_processor.py # 财务数据脱敏（金额/单价）
└── README.md                # 本文件
```

## 四维度脱敏规则

| 维度 | 脱敏对象 | 脱敏策略 | 保留逻辑 |
|------|---------|---------|---------|
| PII | 姓名、电话、身份证、证书编号 | 占位符/掩码替换 | 角色关系与排班逻辑 |
| 地理坐标 | 桩号、地名、高程、桥隧名称 | 相对化处理/序列化 | 相对长度与工程实体序列 |
| 商业标识 | 项目名、企业名、合同编号 | 泛化替换 | 组织角色架构 |
| 财务数据 | 金额、单价、工程量 | 全量掩码 | 表格科目结构 |

## 两阶段部署策略

### 阶段一（测试）
- 配置：`DEPLOY_PHASE = test`
- 使用外部大模型 API 测试验证
- 仅用于测试数据集，严禁生产文档

### 阶段二（生产）
- 配置：`DEPLOY_PHASE = local`
- 方案A：`DESENSITIZE_SCHEME = scheme_a`（规则引擎主导 + 轻量本地模型兜底）
- 方案B：`DESENSITIZE_SCHEME = scheme_b`（本地大模型全量语义驱动）

## API 接口

| 接口 | 路径 | 功能 |
|------|------|------|
| 文档脱敏 | `POST /desensitize/document` | 四维度脱敏处理 |
| 脱敏校验 | `POST /desensitize/validate` | 黑白名单校验 |
| 结果还原 | `POST /desensitize/remap` | 审查结果逆向映射 |
| 字典查询 | `GET /desensitize/dict/{task_id}` | 查询字典元信息 |
| 文本脱敏 | `POST /desensitize/text` | 简化版文本脱敏 |

## 配置说明

在 `config/config.ini` 中添加以下配置：

```ini
[desensitize]
DEPLOY_PHASE = test              # 部署阶段: test/local
DESENSITIZE_SCHEME = scheme_a    # 本地方案: scheme_a/scheme_b
DEFAULT_LEVEL = standard         # 默认脱敏级别
DICT_STORAGE_PATH = ./data/desensitize_dicts
ENABLE_VALIDATION = true
VALIDATION_FAILURE_ACTION = block
```

## 安全约束

1. **外部调用前置脱敏原则**：脱敏是调用任何外部大模型 API 的强制前提
2. **本地化优先原则**：所有脱敏动作在企业内部本地服务器完成
3. **可逆映射原则**：本地保留脱敏字典，支持结果还原
4. **纵深防御原则**：规则引擎 + 本地 AI 模型 + 黑白名单校验三层防护

## 示例

**原始文本**：
```
映雪特大桥（D1K86+279.91～D1K87+279.91）跨越云雾河，全长1000m。
项目经理张三（电话：13812345678）负责现场安全管理，安全费用预算 ￥1,250,000.00 元。
```

**脱敏后**：
```
[1号特大桥]（K0+000～K1+000）跨越[1号河流]，全长1000m。
[项目经理A]（电话：[手机号脱敏]）负责现场安全管理，安全费用预算 [金额脱敏] 元。
```

## 运行测试

```bash
python test_desensitize.py
```
