核心原则:生成的每一页 PPT 都必须包含数据可视化图表 + 深度分析文本, 严禁出现空页、纯图表页、纯文字页。质量检查不合格的页面必须自动修复或回退重建。
| 页面类型 | 至少图表数 | 至少分析段数 | 每段最少字数 |
|---|---|---|---|
| KPI概览页 | 6个KPI卡片 | 4段 | 150字/段 |
| 趋势分析页 | 1个趋势图 | 4段 | 150字/段 |
| 分布分析页 | 1个图表(环形/柱状) | 3段 | 150字/段 |
| 排行分析页 | 1个条形图 | 4段 | 150字/段 |
| 总结/建议页 | 无硬性要求 | 4段 | 150字/段 |
| 封面/目录/尾页 | 无硬性要求 | 1段简介 | 30字/段 |
分析文本必须包含具体数值引用和业务洞察建议,不得是泛泛概括:
| 分析维度 | 必须包含的内容 |
|---|---|
| 数据引用 | 引用具体数值(含单位),如"XXX 台"、"占比 XX%"、"增长 XX%" |
| 对比分析 | 与同类/历史/目标进行对比,说明高低/好坏 |
| 原因解读 | 对数据背后的原因进行分析(至少 2 条可能原因) |
| 业务建议 | 给出可执行的业务行动建议(不空泛说"加强"、"优化") |
以下任一种情况判定为页面为空,严重级别 critical:
| 图表类型 | 最小宽度 | 最小高度 |
|---|---|---|
| 趋势折线图 | SLIDE_WIDTH × 0.40 | SLIDE_HEIGHT × 0.35 |
| 分布环形图/饼图 | SLIDE_WIDTH × 0.30 | SLIDE_HEIGHT × 0.30 |
| 排行条形图 | SLIDE_WIDTH × 0.45 | SLIDE_HEIGHT × 0.45 |
| KPI 卡片 | SLIDE_WIDTH × 0.28(单张) | SLIDE_HEIGHT × 0.15(单张) |
所有元素必须位于以下安全区域内:
| 校验项 | 说明 |
|---|---|
| 封面日期 | 必须与用户确认的周期一致 |
| 总页数 | 必须在用户确认的范围内(允许 ±1 页) |
| 目录页 | 若页数 ≥ 5 则必须包含目录页 |
| 条件 | 说明 |
|---|---|
| 无任何 critical 级别问题 | 必须满足 |
| 无任何 major 级别问题 | 必须满足 |
| minor 级别问题 ≤ 2 个 | 强烈推荐 |
| 质量评分 ≥ 85 | 必须满足 |
| 问题类型 | 修复方式 |
|---|---|
| 页面为空 | 不允许简单添加提示文字"建议补充",必须回退重建页面,调用 build 函数重新生成完整分析内容 |
| 图文重叠 | 重新计算位置,向下/右偏移;若空间不足则缩小图表 |
| 飞出页面 | 裁剪到安全区域内,必要时缩放 |
| 分析文本过短 | 扩写分析文本,补充数据引用和业务洞察 |
| 图表无数据 | 检查数据来源,使用备用数据列或降级为表格 |
| 占位符未替换 | 清空未替换的占位符文本 |
{page_title} 未替换)┌──────────────────────────────────────────────────────┐
│ KPI1: 总需求 1,250 台 KPI2: 已下单 780 台 │
│ KPI3: 转化率 62.4% KPI4: 覆盖客户 93 个 │
│ KPI5: 支持闭环率 78% KPI6: 覆盖国家 96 个 │
├──────────────────────────────────────────────────────┤
│ 需求总量与转化结构 │
│ 本期客户意向项目总需求台数为 1,250 台,其中累计已下单 │
│ 780 台(占比 62.4%),未下单 470 台(占比 37.6%), │
│ 下单转化率 62.4%...(≥150字深度分析) │
├──────────────────────────────────────────────────────┤
│ 客户覆盖与服务广度 │
│ 本期覆盖客户 93 个,涉及 96 个意向国家... │
├──────────────────────────────────────────────────────┤
│ 跨部门支持闭环效率 │
│ 支持需求闭环率 78%,... │
├──────────────────────────────────────────────────────┤
│ 未下单需求跟进策略 │
│ 当前未下单 470 台,... │
└──────────────────────────────────────────────────────┘
┌───────────────────────┬──────────────────────────────┐
│ │ 意向级别分布概况 │
│ 环形图 │ 共有 6 个不同的意向级别... │
│ (左 55%) │ │
│ │ 排名第一: A级 │
│ │ A级以 450 台(占比 36%)... │
│ │ │
│ │ 长尾分布特征 │
│ │ 前三名累计占比 72%... │
└───────────────────────┴──────────────────────────────┘
封面页是 PPT 的第一印象,且 python-pptx 在处理自定义模板时有多个已知陷阱。
以下规则由 quality_inspector._check_cover_quality() 在生成后自动执行。
检测逻辑:
is_placeholder=True 的 shape自动修复:将文字颜色改为 theme_colors['primary'](默认 #1E3A5F 深蓝)
典型场景:Wuling 模板,蓝色渐变矩形覆盖 0→3441700 EMU,title placeholder 在 y=3818251。
开发者设了 C_WHITE → 白字在白色背景上完全隐形。
检测逻辑:
"单击此处编辑母版标题样式""单击此处添加标题""单击此处编辑母版文本样式""单击此处添加文本""单击此处添加副标题"不可自动修复:因为无法从上下文中获取正确的报告标题/日期/部门。 需触发 rebuild 或返回错误让调用方处理。
典型场景:模板占位符不含 {report_title} 等文本标记,
_replace_all_placeholders() 找不到替换目标,占位符保持 PowerPoint 默认文字。
_build_cover_page 的 Pass 2(idx 兜底)应在 build 阶段解决此问题;
C012 是最后的防线,确保不会输出含模板默认文字的 PPT。
Agent 在调用 quality_assured_build 之前必须:
QualityRules 参数中ReportConfig 的 quality_threshold ≥ 85ReportConfig 的 max_fix_iterations ≥ 5