# AI 数据清洗接口
**本文引用的文件 **
- [AiCleanController.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/api/AiCleanController.java)
- [AiCleanSynonymController.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/api/AiCleanSynonymController.java)
- [CleanErrorLogController.java](file://ai-server/src/main/java/com/zsjz/ai/module/dm/controller/CleanErrorLogController.java)
- [AiCleanService.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/service/AiCleanService.java)
- [AiCleanSynonymService.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/service/AiCleanSynonymService.java)
- [AiCleanTemplateVectorIndex.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/index/AiCleanTemplateVectorIndex.java)
- [AiCleanStatusEnum.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/enums/AiCleanStatusEnum.java)
- [AiCleanExitEnum.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/enums/AiCleanExitEnum.java)
- [AiCleanStageEnum.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/enums/AiCleanStageEnum.java)
- [AiRejectReason.java](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/enums/AiRejectReason.java)
- [CleanErrorLog.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/dm/entity/CleanErrorLog.java)
- [CleanErrorLogQuery.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/dm/query/CleanErrorLogQuery.java)
- [ai_clean.sql](file://sql/ai_clean.sql)
- [ai_clean_synonym_init.sql](file://sql/ai_clean_synonym_init.sql)
## 目录
1. [简介](#简介)
2. [项目结构与接口范围](#项目结构与接口范围)
3. [核心组件与数据流](#核心组件与数据流)
4. [接口总览](#接口总览)
5. [/aiClean 智能清洗接口](#aiclean-智能清洗接口)
6. [/aiClean/synonym 同义词接口](#aicleansynonym-同义词接口)
7. [/cleanLog CleanErrorLogController 错误日志接口](#cleangelog-cleannerorlogcontroller-错误日志接口)
8. [清洗流程与 pgvector、DuckDB 的关系](#清洗流程与-pgvector-duckdb-的关系)
9. [失败定位与排查指南](#失败定位与排查指南)
10. [性能与限制](#性能与限制)
11. [结论](#结论)
## 简介
本文件说明 AI 数据清洗链路的 REST 接口,覆盖:
- `/aiClean`:AI 清洗任务提交、执行、撤销、行拒绝明细、动态表分页、模板向量索引状态与重建。
- `/aiClean/synonym`:表头同义词库的查询、新增、修改、删除、启用/停用。
- `/cleanLog`(由 `CleanErrorLogController` 暴露):清洗错误日志分页查询。
这些接口共同支撑以下能力:
- 上传 CSV/Excel 后,对未匹配既有模板的 sheet 进行 AI 判定和清洗。
- 将命中既有模板的数据走原有清洗链路,把没有合适模板的数据写入 AI 动态表。
- 用 pgvector 维护模板语义向量索引,辅助模板候选召回。
- 用 DuckDB 临时数据源完成结构探测、列类型推断、规则试跑与批量清洗。
- 记录每行的清洗拒绝原因,并通过错误日志表辅助定位问题。
## 项目结构与接口范围
AI 清洗相关接口集中在三个控制器中:
- `AiCleanController`:挂在 `/aiClean`,是独立于 `/dm`、`/govern` 的新链路。
- `AiCleanSynonymController`:挂在 `/aiClean/synonym`,管理评分归一用的词对。
- `CleanErrorLogController`:挂在 `/cleanLog`,提供清洗错误日志分页查询。
```mermaid
graph TB
Client["前端或外部调用方"] --> AC["AiCleanController
/aiClean/*"]
Client --> ASC["AiCleanSynonymController
/aiClean/synonym/*"]
Client --> CEL["CleanErrorLogController
/cleanLog/list"]
AC --> ACS["AiCleanService"]
AC --> TVI["AiCleanTemplateVectorIndex"]
AC --> JOB["AiCleanJobMapper
ai_clean_job"]
ASC --> ASS["AiCleanSynonymService"]
ASS --> DB["PostgreSQL
ai_clean_synonym"]
CEL --> ELQ["CleanErrorLogQuery"]
ELQ --> ELM["CleanErrorLogMapper
clean_error_log"]
subgraph "AI 清洗存储"
JOB
DB
ELM
end
```
**图示来源**
- [AiCleanController.java:1-138](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/api/AiCleanController.java#L1-L138)
- [AiCleanSynonymController.java:1-70](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/api/AiCleanSynonymController.java#L1-L70)
- [CleanErrorLogController.java:1-30](file://ai-server/src/main/java/com/zsjz/ai/module/dm/controller/CleanErrorLogController.java#L1-L30)
**章节来源**
- [AiCleanController.java:1-138](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/api/AiCleanController.java#L1-L138)
- [AiCleanSynonymController.java:1-70](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/api/AiCleanSynonymController.java#L1-L70)
- [CleanErrorLogController.java:1-30](file://ai-server/src/main/java/com/zsjz/ai/module/dm/controller/CleanErrorLogController.java#L1-L30)
## 核心组件与数据流
### 控制器层
| 组件 | 职责 |
|---|---|
| `AiCleanController` | 暴露智能清洗任务提交、同步执行、任务列表、撤销、拒绝明细、动态表分页、模板向量索引状态与重建接口。 |
| `AiCleanSynonymController` | 暴露同义词词条列表、创建、更新、删除、启用/停用接口。 |
| `CleanErrorLogController` | 暴露清洗错误日志分页查询接口。 |
### 服务层
| 组件 | 职责 |
|---|---|
| `AiCleanService` | 实现 S1→S7 主流程:探测结构、匹配模板、生成规则、校验置信度、走既有链路或写 AI 动态表、记录任务与拒绝明细。 |
| `AiCleanSynonymService` | 管理 `ai_clean_synonym` 表,校验“同一归一化词全局唯一”“不做链式传递”,并在事务提交后重建全局缓存。 |
| `AiCleanTemplateVectorIndex` | 把既有模板和 AI 模板的结构元数据嵌入为向量,写入 pgvector 表,供模板语义召回与 Agent 选表使用。 |
### 数据层
| 表 | 用途 |
|---|---|
| `ai_clean_template` | AI 模板定义,含中文名、物理表名、表头指纹、分类、版本、置信度等。 |
| `ai_clean_field` | AI 模板字段,决定 DuckDB 动态表 DDL 与前端展示列。 |
| `ai_clean_rule` | 清洗函数链快照,以枚举 hint JSON 形式保存。 |
| `ai_clean_job` | 单个 sheet/block 的清洗任务轨迹,含状态、出口、token 成本、行统计、失败原因。 |
| `ai_clean_batch` | 智能清洗批次状态机:JUDGING → CLEANING_EXISTING → LOADING_AI → DONE/PARTIAL。 |
| `ai_clean_synonym` | 表头同义词库,用于评分归一和绑定域映射。 |
| `clean_error_log` | 清洗失败的错误日志,按 batchId/fileId/sheetId 等过滤。 |
**章节来源**
- [AiCleanService.java:1-260](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/service/AiCleanService.java#L1-L260)
- [AiCleanSynonymService.java:1-178](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/service/AiCleanSynonymService.java#L1-L178)
- [AiCleanTemplateVectorIndex.java:1-220](file://ai-server/src/main/java/com/zsjz/ai/module/aiclean/index/AiCleanTemplateVectorIndex.java#L1-L220)
- [ai_clean.sql:1-214](file://sql/ai_clean.sql#L1-L214)
- [ai_clean_synonym_init.sql:1-42](file://sql/ai_clean_synonym_init.sql#L1-L42)
## 接口总览
### /aiClean
| HTTP 方法 | URL | 主要参数 | 响应体 | 说明 |
|---|---|---|---|---|
| POST | `/aiClean/submit` | `fileId` | `Result` | 为未匹配模板的 sheet 建 AI 清洗任务,幂等。 |
| POST | `/aiClean/run` | `jobId` | `Result` | 同步执行一个清洗任务。 |
| GET | `/aiClean/jobs` | `fileId`(可选) | `Result>` | 当前案件下的任务列表。 |
| POST | `/aiClean/revert` | `jobId` | `Result` | 撤销该 job 在 AI 动态表中的数据。 |
| GET | `/aiClean/job/rejections` | `jobId`、`reason`(可选)、`page`、`size` | `Result