海报确认、文案生成、海报生成增加服务端失败关闭门禁,绑定文件哈希、解析快照哈希和确认数据哈希,并返回 422 业务错误。[validators.py (line 65)](D:/work/code/python/coding/baodanagent/api/insurance/plan_data/validators.py:65) 缺失金额不再转换为 0;删除错误字段兜底和“年缴×年期=合同总保费”事实推导;里程碑冲突会阻断确认。[normalizer.py (line 14)](D:/work/code/python/coding/baodanagent/api/insurance/ppt/normalizer.py:14) PPT 渲染器支持可空金额和实际币种,缺失值显示“待确认”,避免 float(None)、空值除法等异常。 模板必须覆盖全部输入保司和产品;自动选择排序确定化,同优先级歧义时阻断。[template_selection.py (line 4)](D:/work/code/python/coding/baodanagent/api/insurance/ppt/template_selection.py:4) 场景判定写入 scenarioOverrideTrace,记录请求、模板、服务端及 Worker 最终判定。[routes.py (line 555)](D:/work/code/python/coding/baodanagent/api/insurance/ppt/routes.py:555) 前端增加哈希提交、人工调整原因、模板歧义提示及真实能力说明。 冻结三份核心 Schema,并建立 Goldens manifest、说明和评估脚本。 验证结果: 后端目标回归:111 passed, 1 skipped PPT 运行时回归:81 passed 前端生产构建和 vue-tsc:通过 Python compileall:通过 三份 Schema JSON:解析通过 git diff --check:通过,仅有换行符提示
33 KiB
PDF 计划书解析后续演进详细计划
文档版本:v1.0
编制日期:2026-08-02
适用范围:客户计划书 PDF 的解析、核对、PPT/PDF 生成、多保司展示与脱敏
当前基线:已完成 15 份真实计划书专项修复和回归验证
计划性质:后续开发执行基线,不替代现有需求、接口和部署文档
一、结论
后续目标不是继续为每份 PDF 堆叠硬编码,而是建立一条可持续的新保司接入链路:
通用解析
→ 解析画像匹配
→ 确定性字段与表格抽取
→ 质量校验
→ AI 仅补缺失字段
→ 人工核对
→ 金标回归
解析规则采用“后台可编辑的声明式解析画像 + 版本化发布”。管理员可以在后台修改匹配条件、字段标签、表格列映射、情景选择和校验规则;系统负责用样本验证,只有测试通过的版本才能发布。用户或管理员对某次识别结果的修正只进入纠错队列,不会未经审核自动修改全局规则。
这样可以达到三个目的:
- 同结构的新文件直接复用,不再逐份改代码;
- 新保司首次接入只需准备样本、确认列映射和验收结果;
- 无法确认的金额进入
needs_review,不以错误结果继续生成。
完整核心阶段预计 15~18 人日,其中后台画像管理、纠错审核、版本发布和回滚属于必做范围。
二、当前基线
2.1 已具备能力
| 能力 | 当前实现 | 结论 |
|---|---|---|
| 混合文本/OCR | api/insurance/ppt/extraction.py |
可按页判断低质量文本并 OCR,表格 OCR 使用 PSM 4 |
| 通用字段 | api/insurance/ppt/regex_extractor.py |
支持年龄、性别、吸烟、币种、保费、保额、缴费期 |
| IUL 表格 | 同上 | 支持年度/年龄斜杠、独立列、纵向压缩和保证/非保证双栏 |
| 储蓄险表格 | 同上 | 支持身故利益与退保价值跨页合并 |
| 坐标表格 | extract_iul_layout() |
可处理 PyMuPDF 能直接识别的矢量表格 |
| 结果质量门禁 | extraction.py、validator.py |
可阻止明显缺失和异常数据直接标记成功 |
| 产品先验 | 产品 JSON 配置、文件名提示 | 已覆盖 SIUL3、SBIUL2、GIUL3、FWD IF、AIA PIL2 等样本 |
| 多保司生成 | routes.py、celery_tasks.py、renderer.py |
一次任务可保留和渲染多个保司 |
| 脱敏 | masking.py、用户端接口 |
新任务使用后台配置的脱敏名称 |
| 人工核对 | PptDataReview.vue |
用户可修改解析结果后再生成 |
2.2 已验证样本范围
当前真实回归集共 15 份,包含:
- 宏利 SIUL3:5 年缴、10 年缴;
- 永明 SBIUL2:5 年缴、10 年缴,首年双倍保费;
- 全美 GIUL3:5 年缴、10 年缴;
- 富卫 IF:简体、英文、新加坡版、保额型与总保费型文件名;
- 友邦 PIL2;
- CL HISP+:单缴和 5 年缴;
- GE PLG4:单缴储蓄计划。
当前回归结果:产品、年龄、性别、非吸烟状态、币种、核心金额、缴费期及利益表均可进入可用状态。
2.3 当前边界
| 边界 | 表现 | 后续处理 |
|---|---|---|
| 未知产品名称 | Logo 为图片或正文无标准名称时可能识别为通用标题 | 产品先验 + 画像别名 + 人工确认 |
| 新表格结构 | 列顺序和情景定义完全不同可能列错位 | 解析画像明确列映射和情景选择 |
| 文件名无约定 | 无法使用 F-48-N-USD-S3m-5x 等先验 |
正文抽取;缺失时进入核对 |
| 低清扫描 | OCR 可能丢失年度、负号、小数点 | 页面质量评分、金额一致性校验、精确解析 |
| 多情景表格 | 保证、当前假设及不同回报率并列 | 画像指定首选情景,不允许默认猜测 |
| 新产品特殊规则 | 首年双倍、分期提领、额外账户等 | 产品画像声明金额语义和校验规则 |
三、目标与非目标
3.1 核心目标
| 编号 | 目标 | 验收指标 |
|---|---|---|
| G-01 | 已登记产品稳定回归 | 金标关键字段准确率 ≥ 99%,不得出现高置信度错误金额 |
| G-02 | 同版式新文件自动复用 | 已有画像命中率 ≥ 95% |
| G-03 | 新保司可快速接入 | 1~2 份代表样本可在 0.5~1 人日内形成首版画像 |
| G-04 | 未知模板安全降级 | 关键金额不确定时状态必须为 needs_review 或 partial |
| G-05 | 结果可追溯 | 核心字段至少记录来源页、来源类型和置信度 |
| G-06 | 可持续测试 | 每新增一个产品,必须同时新增金标夹具和回归结果 |
| G-07 | 多保司与脱敏不回退 | 双保司生成、前端展示、导出结果保持一致并使用脱敏名称 |
3.2 首期非目标
- 不承诺对任意 PDF 达到 100% 无人工识别;
- 不让 LLM 直接生成或推算利益表金额;
- 不建设通用低代码 OCR 平台;
- 不允许自动把用户修正直接发布为全局规则;
- 不把完整客户 PDF 或敏感字段提交到公共代码仓库;
- 不同时重构现有 PPT、海报和推荐模块的无关代码。
四、目标架构
flowchart TD
A["上传客户计划书"] --> B["文件安全检查与页级文本质量评分"]
B --> C["产品先验与解析画像匹配"]
C --> D["通用字段抽取"]
C --> E["画像驱动的表格抽取"]
D --> F["字段合并与来源记录"]
E --> F
F --> G["金额、年度、情景和险种质量校验"]
G -->|通过| H["success / 可进入数据核对"]
G -->|缺少语义字段| I["AI 定向补全缺失字段"]
G -->|金额或列映射不确定| J["needs_review / 阻止直接生成"]
I --> G
J --> K["人工核对并保存修正"]
K --> L["形成金标结果"]
L --> M["新增或修订解析画像并跑全量回归"]
4.1 匹配优先级
解析画像按以下优先级匹配:
- 用户已选择的
productId; - 产品标准名和别名精确匹配;
- 文件名前缀或命名规则匹配;
- 页内特征词、固定表头和公司标识组合匹配;
- 无可靠匹配时使用通用解析器,状态不得伪装成已匹配产品。
禁止仅凭一个通用词,例如 IUL、Premium、保单年度,判定具体产品。
4.2 解析优先级
明确的产品/用户先验
> 声明式解析画像
> 通用坐标表格
> 通用 OCR/正则表格
> AI 定向补字段
> 人工确认
金额字段发生冲突时,不以“最后写入者”为准,而是按照来源可信级别、标签明确度、表格完整度和一致性校验决定;无法决定时进入人工核对。
五、解析画像 v1
5.1 存储方案
后台可编辑意味着数据库必须保存草稿、发布版本和审计信息;代码仓库只保存 JSON Schema、内置种子画像和兜底默认值。
新增三类数据:
| 数据 | 用途 | 关键约束 |
|---|---|---|
insurance_ppt_parser_profiles |
画像主记录,关联保司、产品、险种和当前发布版本 | 一个产品可有多个版式画像;主记录不可直接保存未发布规则 |
insurance_ppt_parser_profile_versions |
每次草稿、测试、发布和归档的完整配置快照 | 已发布版本不可原地修改,只能新建版本 |
insurance_ppt_parser_corrections |
保存某次识别原值、人工修正值、差异和审核状态 | 修正不会自动修改画像;管理员审核后才能转成新草稿 |
建议字段:
parser_profiles
├── id / name / company_id / product_id / plan_type
├── status / active_version_id
├── created_by / updated_by
└── created_at / updated_at / deleted_at
parser_profile_versions
├── id / profile_id / version
├── status: draft/testing/published/rejected/archived
├── config_json / test_report_json
├── created_by / tested_by / published_by
└── created_at / tested_at / published_at
parser_corrections
├── id / session_id / pdf_hash
├── product_id / profile_id / profile_version
├── original_data_json / corrected_data_json / diff_json
├── status: pending/ignored/applied
├── submitted_by / reviewed_by / applied_version_id
└── created_at / reviewed_at
代码仓库保留:
api/insurance/ppt/config/parser_profile.schema.json
api/insurance/ppt/config/parser_profiles_seed/*.json
运行规则:
- 数据库中的
published版本是运行时唯一生效来源; - 种子画像只用于初始化或灾难恢复,不覆盖后台已经发布的版本;
- Worker 按
profile_id + version缓存,发布或回滚时主动失效; - 历史解析结果保存实际使用的画像 ID 和版本,不随后台修改而变化;
- 删除画像采用停用或软删除,不破坏历史任务。
5.2 建议 Schema
{
"id": "sunlife-sbiul2",
"version": 1,
"status": "published",
"companyId": "sunlife",
"productIds": ["sunlife-sbiul2-iul"],
"planType": "iul",
"match": {
"filenamePatterns": ["^SLS_SBIUL2_"],
"requiredTextAny": ["SBIUL 2", "SunBrilliance Indexed Universal Life II"],
"requiredHeadersAny": ["Policy Year", "保单年度"]
},
"identity": {
"issueAgeLabels": ["Age", "年龄", "上一次生日年龄"],
"smokerLabels": ["Smoking Status", "风险等级"],
"currencyLabels": ["Currency", "货币"]
},
"benefitTable": {
"rowFormat": "year_age_columns",
"scenarioPreference": ["current", "non_guaranteed", "guaranteed"],
"columns": {
"policy_year": ["Policy Year", "保单年度"],
"age": ["Age", "年龄"],
"annual_premium": ["Premium Planned", "计划保费"],
"account_value": ["Account Value", "账户价值"],
"total_surrender_value": ["Surrender Value", "退保价值"],
"death_benefit": ["Death Benefit", "身故赔偿"]
}
},
"amountRules": {
"firstYearPremiumMultiplierAllowed": true,
"totalPremiumMustBeNonDecreasing": true
},
"acceptance": {
"minimumBenefitRows": 20,
"requiredMilestoneYears": [1, 5, 10, 20, 30]
}
}
5.3 配置约束
- 只允许白名单字段,不执行配置中的 Python 或表达式;
- 正则表达式加载时限制长度,并在测试阶段编译;
- 每个画像必须有唯一
id + version; - 画像必须声明适用险种和至少一个可靠匹配条件;
scenarioPreference必须显式配置;- 列别名只解决表头差异,特殊计算继续由受测代码实现;
- 配置加载失败时跳过该画像并记录错误,不能阻断全部解析服务。
5.4 后台编辑能力
后台新增“解析画像”管理页,管理员可以编辑:
| 分区 | 可编辑内容 |
|---|---|
| 基本信息 | 画像名称、保司、产品、险种、状态 |
| 匹配规则 | 文件名规则、产品别名、必含文本、排除文本、固定表头 |
| 身份字段 | 年龄、性别、吸烟、币种、保额、保费和缴费期标签 |
| 表格结构 | 行格式、表头行、年度/年龄列、金额列映射、跨页延续规则 |
| 情景选择 | 保证、当前假设、非保证或指定回报率的优先级 |
| 金额语义 | 年缴、首年应缴、总保费、保额、首年倍数和累计逻辑 |
| 校验规则 | 最小数据行、关键年度、累计保费单调性、金额范围和必填字段 |
| 测试样本 | 关联样本、预期字段、关键年度和最近测试结果 |
后台不直接开放任意 Python 代码。常用规则使用表单和下拉框;只有“高级匹配”允许受限正则,并在保存时编译和限制长度。
管理员工作流:
创建画像或从已发布版本复制
→ 编辑草稿
→ 用当前样本试跑
→ 运行该画像全部样本
→ 运行全局基线回归
→ 查看字段差异和失败原因
→ 发布新版本
→ Worker 缓存失效
→ 新任务使用新版本
若发布后出现问题,管理员可点击“回滚”,将某个历史已发布版本重新设为当前版本;系统不删除失败版本,保留审计记录。
5.5 识别错误后的纠错闭环
现有能力只保存当前会话修正后的 extractions_json,无法反向改进解析规则。后续改为:
- 用户或管理员在数据核对页修正字段;
- 服务端保存原始值、修正值、字段差异、PDF 哈希和画像版本;
- 当前会话立即使用修正值,不需要再次调用模型;
- 后台“解析纠错”列表展示待审核记录;
- 管理员判断是单份文件异常,还是画像规则缺陷;
- 单份异常可标记“忽略/仅本次有效”;
- 规则缺陷可一键复制当前画像为新草稿,并把差异作为修改建议;
- 管理员明确修改列映射或字段规则;
- 新版本通过关联样本和全局回归后发布;
- 后续同结构文件直接使用新规则,不再依赖模型猜测。
模型只允许辅助生成“草稿建议”,不得自动发布、自动改列映射或覆盖已确认金额。
六、分阶段实施计划
Phase 0:发布当前专项修复(0.5 人日,P0)
任务
- PARSE-NEXT-0001 执行迁移
migrate_033.py~migrate_035.py; - PARSE-NEXT-0002 重启 API 与 Worker,确认使用新解析代码;
- PARSE-NEXT-0003 重新上传 15 份基线 PDF,不复用历史缓存;
- PARSE-NEXT-0004 验证双保司任务可选择并输出两家公司;
- PARSE-NEXT-0005 验证后台脱敏名称在用户端和新生成文件中一致;
- PARSE-NEXT-0006 保留上线前后解析耗时和错误日志。
完成标准
- 15 份样本均通过核心字段核对;
- 新生成任务不再出现仅保留第一家保司;
- 新生成任务不向普通用户显示后台已设置脱敏的全称;
- 回滚时可恢复旧镜像和数据库快照。
Phase 1:建立金标样本和批量评测(1.5 人日,P0)
任务
- PARSE-NEXT-0101 定义脱敏样本清单格式;
- PARSE-NEXT-0102 为现有 15 份 PDF 保存预期核心字段;
- PARSE-NEXT-0103 保存 1、5、10、20、30 年的关键利益值;
- PARSE-NEXT-0104 新增批量解析评测脚本;
- PARSE-NEXT-0105 输出字段准确率、缺失率、误报率、行数和耗时;
- PARSE-NEXT-0106 将评测接入本地发布检查,不把客户原 PDF 提交到 Git;
- PARSE-NEXT-0107 建立样本访问权限、脱敏和保留规则。
建议文件
scripts/tools/evaluate_plan_parsing.py
tests/fixtures/ppt_parse/manifest.schema.json
tests/fixtures/ppt_parse/expected/*.json
期望结果示例:
{
"caseId": "manulife-siul3-5pay",
"sourceRef": "secure-fixture://manulife-siul3-5pay.pdf",
"planType": "iul",
"expected": {
"productName": "Manulife SIUL 3",
"age": 48,
"gender": "female",
"smoker": "no",
"currency": "USD",
"sumInsured": 3000000,
"annualPremium": 80060,
"premiumPaymentPeriod": 5,
"benefitRowCountMinimum": 70
},
"milestones": {
"10": {"totalSurrenderValue": 362594}
}
}
完成标准
- 单条命令可完成全部样本评测;
- 报告能明确指出具体文件、字段、期望值和实际值;
- 任何已登记样本核心金额变化都会使评测失败;
- 测试输出不包含客户姓名、证件号或 PDF 全文。
Phase 2:画像数据模型与解析运行时(3.5 人日,P0)
任务
- PARSE-NEXT-0201 新增画像、版本和纠错记录的幂等迁移;
- PARSE-NEXT-0202 新增三个模型及索引、状态约束和
to_dict(); - PARSE-NEXT-0203 定义并校验解析画像 JSON Schema;
- PARSE-NEXT-0204 实现只读取
published版本的画像加载器; - PARSE-NEXT-0205 实现按
productId、别名、文件名和文本指纹匹配; - PARSE-NEXT-0206 匹配结果返回
profileId、profileVersion、matchedBy和confidence; - PARSE-NEXT-0207 把现有文件名提示迁移到首批种子画像;
- PARSE-NEXT-0208 将 IUL/储蓄险行格式和情景偏好改为画像参数;
- PARSE-NEXT-0209 保留现有通用解析器作为无画像兜底;
- PARSE-NEXT-0210 为画像冲突、损坏配置、停用版本和无匹配增加测试。
完成标准
- 现有 15 份样本无需依赖集中式文件名前缀代码即可通过;
- 同一 PDF 只能选择一个最高可信画像;
- 两个画像得分接近且无法确定时返回
needs_review; - 草稿或测试中的版本绝不会被生产解析任务读取;
- 历史结果可以追溯到实际使用的画像版本;
- 数据库画像不可用时,通用解析器仍能返回可解释状态。
Phase 3:管理员解析画像后台(3 人日,P0)
后台页面
新增“解析画像”菜单和独立页面,不与“产品小册子解析结果”混在一起。页面包含:
- 画像列表:保司、产品、险种、当前版本、状态、最近测试;
- 画像编辑器:匹配、身份字段、表格列、情景、金额语义、校验六个标签页;
- 样本诊断:左侧 PDF,右侧文本质量、候选表头、识别结果和字段来源;
- 测试报告:期望值、实际值、差异、失败字段和全局回归结果;
- 版本记录:草稿、测试、发布、驳回、回滚和操作人。
后台 API
| 方法 | URL | 用途 |
|---|---|---|
| GET | /insurance/admin/ppt/parser-profiles |
查询画像列表 |
| POST | /insurance/admin/ppt/parser-profiles |
创建画像和首个草稿 |
| GET | /insurance/admin/ppt/parser-profiles/{id} |
查询详情、版本和样本 |
| PUT | /insurance/admin/ppt/parser-profiles/{id}/draft |
保存草稿配置 |
| POST | /insurance/admin/ppt/parser-profiles/{id}/samples |
上传或关联测试样本 |
| POST | /insurance/admin/ppt/parser-profiles/{id}/test |
异步运行当前画像测试 |
| GET | /insurance/admin/ppt/parser-profile-tests/{taskId} |
查询测试进度和报告 |
| POST | /insurance/admin/ppt/parser-profiles/{id}/publish |
发布已通过测试的版本 |
| POST | /insurance/admin/ppt/parser-profiles/{id}/rollback |
回滚到指定已发布版本 |
| POST | /insurance/admin/ppt/parser-profiles/{id}/disable |
停用画像 |
发布门禁
- PARSE-NEXT-0301 实现画像 CRUD、草稿和版本接口;
- PARSE-NEXT-0302 实现样本上传、鉴权和安全存储;
- PARSE-NEXT-0303 实现 Celery 画像测试任务和进度查询;
- PARSE-NEXT-0304 实现当前样本、画像样本集和全局基线三级测试;
- PARSE-NEXT-0305 只有三级测试通过才允许发布;
- PARSE-NEXT-0306 实现发布、停用和回滚;
- PARSE-NEXT-0307 所有管理操作写入审计日志;
- PARSE-NEXT-0308 完成后台编辑器和测试报告页面;
- PARSE-NEXT-0309 权限限制为
config_manage; - PARSE-NEXT-0310 增加接口、权限、并发发布和回滚测试。
完成标准
- 管理员可在不改代码的情况下创建和调整解析画像;
- 保存草稿不会影响线上解析;
- 测试失败时发布按钮不可用,并显示具体字段差异;
- 发布后新任务使用新版本,历史任务保持旧版本;
- 回滚后新任务立即使用指定旧版本;
- 普通用户无法访问画像、样本和测试报告。
Phase 4:字段证据与纠错审核闭环(2.5 人日,P0)
任务
- PARSE-NEXT-0401 为产品、年龄、吸烟、保费、保额、缴费期记录来源页;
- PARSE-NEXT-0402 为表格记录来源页、情景和表头映射;
- PARSE-NEXT-0403 区分
profile、layout、ocr_regex、llm、filename_hint、user_confirmed来源; - PARSE-NEXT-0404 数据核对页提交时保存原始值、修正值和字段差异;
- PARSE-NEXT-0405 后台新增“解析纠错”待审核列表;
- PARSE-NEXT-0406 支持“仅本次有效”“忽略”“转为画像草稿”三种处理;
- PARSE-NEXT-0407 转为画像草稿时只生成修改建议,不自动发布;
- PARSE-NEXT-0408 金额冲突或情景不明确时阻止直接生成;
- PARSE-NEXT-0409 增加纠错权限、重复记录和审计测试。
状态规则
| 状态 | 条件 | 是否允许直接生成 |
|---|---|---|
success |
必填字段齐全,金额和表格校验通过 | 是 |
partial |
非关键字段缺失,核心金额可信 | 需用户确认 |
needs_review |
核心金额冲突、情景不明确或画像冲突 | 否 |
error |
文件损坏、无法读取或解析链路异常 | 否 |
完成标准
- 用户能够回答“这个金额来自哪一页、哪一列”;
- 当前任务保存修正后不需要再次调用模型;
- 管理员可以看到哪些产品、字段最常被修正;
- 单次修正不会污染其他产品或全局画像;
- 规则修正必须形成新版本并通过回归后发布。
Phase 5:未知保司后台接入(2 人日,P1)
标准流程
- 管理员选择保司和产品,上传 1~2 份代表计划书;
- 系统生成页级文本质量、候选表头、列映射和情景诊断;
- 模型可提供画像草稿建议,但不得自动启用;
- 管理员确认产品、金额语义、情景和列映射;
- 管理员录入或确认金标字段和关键年度;
- 系统运行当前样本、产品样本集和全局回归;
- 测试通过后管理员发布;
- 后续同结构计划书复用该画像。
任务
- PARSE-NEXT-0501 后台样本诊断展示页面质量、表格、表头和样例行;
- PARSE-NEXT-0502 生成候选产品、险种和画像匹配得分;
- PARSE-NEXT-0503 生成未启用的画像草稿;
- PARSE-NEXT-0504 支持管理员确认金标字段和关键年度;
- PARSE-NEXT-0505 用至少一家未登记保司完成演练;
- PARSE-NEXT-0506 验证常规新产品接入不需要修改解析代码。
完成标准
- 新保司首轮诊断不依赖代码修改;
- 画像草稿必须经过人工确认和测试后才能发布;
- 模型不可直接覆盖管理员确认的列映射和金额;
- 常规新产品接入工作量控制在 0.5~1 人日。
Phase 6:质量监控、性能与发布门禁(1.5~2 人日,P1)
任务
- PARSE-NEXT-0601 记录解析耗时、OCR 页数、画像命中和 LLM 调用次数;
- PARSE-NEXT-0602 记录
success/partial/needs_review/error分布; - PARSE-NEXT-0603 统计人工修改最多的产品和字段;
- PARSE-NEXT-0604 对文本 PDF 和扫描 PDF 分开统计成功率与 P95;
- PARSE-NEXT-0605 缓存键包含解析器版本和画像版本;
- PARSE-NEXT-0606 发布前执行单元测试、金标评测和双保司 E2E;
- PARSE-NEXT-0607 增加画像功能开关和回滚说明。
建议指标
| 指标 | 目标 |
|---|---|
| 已登记产品核心字段准确率 | ≥ 99% |
| 已登记产品画像命中率 | ≥ 95% |
| 关键金额高置信度误报 | 0 |
| 文本 PDF 解析成功率 | ≥ 98% |
| 扫描 PDF 解析成功率 | ≥ 90%,单独统计 |
needs_review 后仍直接生成 |
0 |
| 多保司遗漏 | 0 |
| 已开启脱敏却显示全称 | 0 |
完成标准
- 每次画像发布都有可保存的测试报告;
- 指标下降时能定位到解析器版本、画像版本和产品;
- 关闭画像功能开关后可回退到当前通用解析链路;
- 缓存不会复用旧画像产生的过期结果。
七、文件级改动预估
7.1 后端
| 文件 | 操作 | 说明 |
|---|---|---|
api/insurance/db/migrate_036.py |
新增 | 画像、版本和纠错记录三张表;如编号冲突则顺延 |
api/insurance/models/ppt_parser_profile.py |
新增 | 画像主记录和版本模型 |
api/insurance/models/ppt_parser_correction.py |
新增 | 识别修正、审核状态和应用版本 |
api/insurance/ppt/parser_profiles.py |
新增 | Schema 校验、发布版本加载和画像匹配 |
api/insurance/ppt/config/parser_profile.schema.json |
新增 | 后台和后端共用的白名单 Schema |
api/insurance/ppt/config/parser_profiles_seed/*.json |
新增 | 现有产品的初始化画像,不覆盖后台版本 |
api/insurance/ppt/extraction.py |
修改 | 接入画像、记录画像版本和来源 |
api/insurance/ppt/regex_extractor.py |
修改 | 接收行格式、列别名和情景参数 |
api/insurance/ppt/validator.py |
修改 | 增加画像期望、金额冲突和情景校验 |
api/insurance/ppt/parse_worker.py |
修改 | 保存诊断元信息和解析版本 |
api/insurance/ppt/routes.py |
修改 | 数据修正时创建纠错记录 |
api/insurance/admin/ppt_admin_routes.py |
修改 | 画像、样本、测试、发布、回滚和纠错 API |
api/insurance/admin/ppt_admin_service.py |
修改 | 管理业务、权限、审计和发布门禁 |
api/insurance/generation/celery_tasks.py |
修改 | 异步运行画像样本和全局回归 |
scripts/tools/evaluate_plan_parsing.py |
新增 | 批量金标评测 |
scripts/tools/inspect_plan_pdf.py |
新增 | 新模板诊断与画像草稿 |
7.2 前端
| 文件 | 操作 | 说明 |
|---|---|---|
frontend/src/pages/admin/PptParserProfilesAdmin.vue |
新增 | 画像列表、编辑、测试、版本和回滚 |
frontend/src/pages/admin/PptParserCorrectionsAdmin.vue |
新增 | 待审核纠错、差异对比和转草稿 |
frontend/src/utils/ppt-admin-api.ts |
修改 | 画像管理、测试任务和纠错接口 |
frontend/src/pages/components/ppt/PptDataReview.vue |
修改 | 显示来源、置信度、画像和冲突信息 |
frontend/src/pages/components/ppt/PptParsing.vue |
按需修改 | 展示画像匹配和解析阶段 |
frontend/src/utils/ppt-api.ts |
按需修改 | 适配诊断元信息字段 |
7.3 测试
tests/ppt_parser_profile_test.py
tests/ppt_parser_profile_match_test.py
tests/ppt_parser_profile_regression_test.py
tests/ppt_parser_evidence_test.py
tests/ppt_parser_unknown_template_test.py
tests/ppt_parser_profile_admin_api_test.py
tests/ppt_parser_profile_publish_test.py
tests/ppt_parser_correction_test.py
tests/ppt_multi_company_masking_e2e_test.py
现有 PptProductsAdmin.vue 的“小册子解析结果”用于维护产品卖点和产品规则,不能复用为客户计划书解析画像编辑器;两类配置在菜单、接口和数据模型上保持分离。
八、测试矩阵
8.1 单元测试
| 类别 | 必测场景 |
|---|---|
| 画像加载 | 正常、缺字段、重复 ID、版本错误、非法正则 |
| 画像匹配 | productId、别名、文件名、文本指纹、冲突、无匹配 |
| 身份字段 | 中英文、繁简体、Non-Smoker、否、未知 |
| 金额 | 千位符、小数、S/P 文件名、单缴、首年双倍、零值 |
| 表格 | 斜杠年度、独立列、纵向压缩、跨页、双情景、多情景 |
| 质量门禁 | 年度断裂、累计保费下降、退保值列错位、金额冲突 |
| 版本发布 | 草稿隔离、测试失败阻断、并发发布、历史版本、回滚 |
| 纠错审核 | 单次有效、忽略、转草稿、跨产品隔离、审计记录 |
8.2 集成测试
- 15 份现有真实样本全量回归;
- 每个画像至少覆盖两种缴费方案或两份代表文件;
- 至少一份未知保司文本 PDF;
- 至少一份未知保司扫描 PDF;
- 至少一份故意缺少产品名称或吸烟状态的 PDF;
- 至少一份保证/非保证情景并列的 PDF;
- 两份不同保司计划书同时生成;
- 脱敏开启和关闭两种生成结果。
8.3 端到端测试
上传两份不同保司计划书
→ 两份均完成解析
→ 数据核对页显示对应产品和来源
→ 用户修正一个低置信度字段
→ 选择兼容模板
→ 生成 PPT/PDF
→ 两家公司均出现
→ 脱敏名称与后台配置一致
九、新保司接入 Checklist
样本准备
- 至少提供 1 份完整计划书,建议提供 2 份不同缴费方案;
- 确认产品标准名、保司、险种和版本;
- 样本已获授权并完成必要脱敏;
- 人工标注核心字段和关键年度金额。
解析确认
- 明确年龄是投保年龄、上次生日年龄还是下次生日年龄;
- 明确吸烟定义和观察期;
- 明确金额是年缴、首年应缴、总保费还是保额;
- 明确利益表使用保证、当前假设还是指定回报率情景;
- 明确账户价值、现金价值和退保价值对应列;
- 明确首年双倍或非等额缴费规则;
- 明确利益表终止年龄和期望年度数量。
发布确认
- 新画像 Schema 校验通过;
- 新产品样本全部通过;
- 现有 15 份基线无回归;
- 后端自动化测试通过;
- 前端生产构建通过;
- 已记录画像 ID、版本和回滚方法。
十、发布与回滚
10.1 发布步骤
- 备份数据库和当前镜像;
- 发布代码与解析画像;
- 如有迁移,先由 API 单实例执行;
- 重启 API 和 Worker;
- 清理或自然失效旧解析缓存;
- 运行现有 15 份样本冒烟;
- 运行双保司与脱敏 E2E;
- 小流量开放,观察成功率和人工修改率;
- 指标稳定后全量开放。
10.2 回滚条件
出现以下任一情况立即停止扩量:
- 核心金额高置信度识别错误;
- 已登记产品准确率低于发布前基线;
- 两份计划书遗漏任一保司;
- 脱敏开启后仍向普通用户显示全称;
- 解析失败率或 P95 耗时显著恶化;
- Worker 出现持续积压。
10.3 回滚方式
- 关闭解析画像功能开关,回到通用解析器;
- 回滚代码镜像;
- 恢复旧画像版本;
- 不回写、不删除用户已确认的历史数据;
- 数据库迁移优先采用向后兼容设计,避免紧急降级表结构。
十一、风险与应对
| 风险 | 影响 | 应对 |
|---|---|---|
| 画像过度绑定单份样本 | 同产品另一方案失效 | 至少两份代表文件;匹配用稳定表头而非坐标常量 |
| OCR 小数点或年度丢失 | 金额或行号错误 | 累计保费、年龄偏移和年度连续性校验 |
| 多情景选错 | 收益数据系统性错误 | 画像显式声明情景;不明确则 needs_review |
| 文件名先验错误 | 错产品或错金额 | 文件名只补明确字段;与正文冲突时要求核对 |
| LLM 覆盖确定性数值 | 正确金额被改错 | 确定性字段受保护;LLM 仅补缺失字段 |
| 用户修正污染全局规则 | 后续文件被错误影响 | 修正先作为金标候选,审核后再更新画像 |
| 样本包含客户隐私 | 合规风险 | 安全存储、访问控制、脱敏、禁止提交原 PDF |
| 配置错误影响全部产品 | 大面积回归 | 画像隔离、Schema 校验、全量基线和功能开关 |
十二、排期与里程碑
| 里程碑 | 阶段 | 工作量 | 交付物 |
|---|---|---|---|
| M0 当前修复上线 | Phase 0 | 0.5 人日 | 迁移、重启、15 份冒烟结果 |
| M1 可量化回归 | Phase 1 | 1.5 人日 | 金标清单、评测脚本和基线报告 |
| M2 画像运行时 | Phase 2 | 3.5 人日 | 数据模型、Schema、加载器和首批画像 |
| M3 后台可管理 | Phase 3 | 3 人日 | 编辑、样本、测试、发布、版本和回滚 |
| M4 纠错可复用 | Phase 4 | 2.5 人日 | 字段证据、纠错队列、审核和转草稿 |
| M5 新保司可接入 | Phase 5 | 2 人日 | 后台诊断、金标确认和新保司演练 |
| M6 可灰度上线 | Phase 6 | 1.5~2 人日 | 指标、缓存版本、发布门禁和回滚开关 |
推荐执行顺序:
第一周:Phase 0 → Phase 1 → Phase 2
第二周:Phase 3 → Phase 4
第三周:Phase 5 → Phase 6 → 灰度验收
十三、完成定义
核心计划只有在以下条件全部满足后才能标记完成:
- 当前 15 份样本形成可重复执行的金标回归;
- 管理员可以在后台编辑解析画像,不需要修改代码;
- 画像具备草稿、测试、发布、历史版本和回滚流程;
- 现有产品不再依赖集中式文件名硬编码即可识别;
- 新保司可以通过后台诊断和声明式画像接入;
- 产品、金额和利益表结果均经过质量门禁;
- 无法确认的关键金额不会被标记为成功;
- 核心字段具备来源页、来源类型和置信度;
- 人工修正进入后台纠错队列,可转为新画像草稿,但不会未经审核污染全局规则;
- 双保司生成和脱敏 E2E 通过;
- 发布包含指标观察、功能开关和回滚方案;
- 文档、测试和画像版本与代码同步维护。
十四、与现有文档的关系
| 文档 | 关系 |
|---|---|
PDF实时解析提速与精准抽取方案.md |
描述实时解析总体方案;本文承接真实样本修复后的后续演进 |
PPT_PDF解析与数据核对页面问题修复报告_20260730.md |
提供解析和核对页面的历史根因证据 |
PPT多文件上传比对功能_详细修复计划书.md |
负责多文件和多保司上传生成链路 |
用户上传产品小册子解析与留存实施计划.md |
面向产品小册子;本文面向客户计划书,二者不得混用 |
保险智能客服系统_测试用例.md |
后续应补充画像、未知模板、多保司和脱敏验收用例 |