99 lines
4.4 KiB
Markdown
99 lines
4.4 KiB
Markdown
# 报告模板管理模块
|
||
|
||
上传一个文档,自动完成:
|
||
|
||
1. **远程解析**:调用 `http://192.168.4.194:8000/convert`(表单字段 `file` + `engine=auto`)将文档转换为 Markdown。
|
||
2. **抽取目录**:从 Markdown 中识别章节标题层级(目录)。
|
||
3. **生成声明**:为每个目录(章节)生成一段"章节声明"(撰写指引),存入模板。
|
||
4. **脱敏入库**:按标题拆分正文,对每个章节正文**脱敏**(去掉精确数字/金额/日期/百分比等),再按远程 MySQL `report_section_references` 表格式写入,得到可复用的模板化范文。
|
||
|
||
解析、目录抽取、正文拆分逻辑参考 `eval_report/routers/template.py` 与 `routers/reference.py`。
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
config.py 全局配置(DB / 解析服务 / LLM)
|
||
main.py FastAPI 入口
|
||
database/ 连接、ORM 模型、建表
|
||
models.py report_templates / report_template_sections / report_section_references
|
||
schemas/template.py 接口出入参
|
||
services/
|
||
file_parse_client.py 调用远程 /convert → Markdown
|
||
section_extractor.py 目录抽取 + 正文按标题拆分(共用同一遍历)
|
||
desensitize_service.py 章节正文脱敏(去精确数字等)
|
||
declaration_service.py 为每个目录生成"声明"(LLM 可选 + 兜底模板)
|
||
llm_client.py OpenAI 兼容 Chat 客户端(可选)
|
||
routers/template.py 上传/列表/详情/删除
|
||
```
|
||
|
||
## 配置
|
||
|
||
复制 `.env.example` 为 `.env` 并修改:
|
||
|
||
- `DATABASE_URL`:远程 MySQL(章节内容入库目标)。
|
||
- `FILE_PARSE_API_URL`:远程文档解析服务(默认 `http://192.168.4.194:8000/convert`,文件字段 `FILE_PARSE_FIELD_NAME=file`,引擎 `FILE_PARSE_ENGINE=auto`)。
|
||
- `LLM_*`:可选。配置后用 LLM 生成更贴合的章节声明;留空则使用确定性兜底模板。
|
||
|
||
启动时会按需在远程库中创建本模块用到的三张表(`DB_AUTO_CREATE_TABLES=true`,已存在则跳过)。
|
||
|
||
## 运行
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
python main.py
|
||
# 或
|
||
uvicorn main:app --host 0.0.0.0 --port 8100
|
||
```
|
||
|
||
打开 `http://localhost:8100/docs` 查看接口文档。
|
||
|
||
## 主要接口
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
| --- | --- | --- |
|
||
| POST | `/templates/upload` | 上传文档,解析为模板(目录+声明)并将章节内容入库 |
|
||
| GET | `/templates` | 模板列表 |
|
||
| GET | `/templates/{id}` | 模板详情(含目录与各章节声明) |
|
||
| DELETE | `/templates/{id}` | 删除模板 |
|
||
| GET | `/health` | 健康检查 |
|
||
|
||
### 上传示例
|
||
|
||
```bash
|
||
curl -X POST "http://localhost:8100/templates/upload" \
|
||
-F "file=@/path/to/报告.docx"
|
||
```
|
||
|
||
返回包含:模板信息(每个目录的 `sectionDeclaration` 即声明)、入库章节数与各章节摘要。
|
||
|
||
## 日志
|
||
|
||
启动即初始化日志系统(`log/logger.py`),输出到控制台(强制 UTF-8,避免 Windows 中文乱码)并写入 `logs/`:
|
||
|
||
| 文件 | 内容 |
|
||
| --- | --- |
|
||
| `logs/app.log` | 全量日志(按大小轮转) |
|
||
| `logs/error.log` | WARNING 及以上 |
|
||
| `logs/upload.log` | 上传/解析/入库链路(`routers.template`、`services.*`) |
|
||
|
||
- 每个 HTTP 请求会记录方法、路径、状态码、耗时,并在响应头返回 `X-Request-ID`。
|
||
- uvicorn 的 access/error 日志也统一汇入上述文件。
|
||
- 可在 `.env` 调整:`LOG_LEVEL`、`LOG_DIR`、`LOG_TO_CONSOLE`、`LOG_MAX_BYTES`、`LOG_BACKUP_COUNT`、`LOG_HTTP_ACCESS`。
|
||
|
||
## 数据落点
|
||
|
||
- `report_templates`:一条模板记录。
|
||
- `report_template_sections`:每个目录一条,`section_prompt` 字段存放该目录的**声明**。
|
||
- `report_section_references`:每个章节一条,存放该章节**脱敏后的正文内容**(与远程库现有格式一致)。
|
||
|
||
### 脱敏规则
|
||
|
||
`services/desensitize_service.py`:
|
||
|
||
- 阿拉伯数字串(含小数/千分位/全角)→ 占位符(默认 `X`):`总投资10.5亿元` → `总投资X亿元`、`85.3%` → `X%`、`2020年3月` → `X年X月`。
|
||
- 标题行(`#` 开头)整行保留,不动章节编号与标题。
|
||
- 行首枚举序号(`1)`、`(2)` 等)保留,仅脱敏正文数字。
|
||
- 表格分隔行保留;数据格数字默认脱敏(`DESENSITIZE_MASK_TABLE_NUMBERS`)。
|
||
- 中文数字(一二三…)默认保留(多为序数/层级)。
|
||
- 可在 `.env` 调整:`DESENSITIZE_ENABLED`、`DESENSITIZE_PLACEHOLDER`、`DESENSITIZE_MASK_TABLE_NUMBERS`。
|