# PPT 提示词分层与大纲替换经验总结 更新日期:2026-04-26 ## 背景 这次优化涉及两个容易反复踩坑的问题: 1. PPT 生图提示词需要同时保证“整套风格统一”和“单页内容具体”,但全局规则如果每页都重复,会让单页提示词冗长且难维护。 2. 一个画布只允许有一套 PPT,再次执行“生成PPT大纲”时应该替换旧 PPT,而不是把新大纲追加到旧大纲后面。 核心经验是:全局约束要沉到公共提示词,单页提示词只描述本页差异;PPT 语义要以 `pptMeta` 为边界,替换时只清理已有 PPT 及其绑定内容。 ## 经验原则 ### 1. 公共提示词承载全局设计系统 公共提示词适合放所有跨页不变的规则: - 核心生成要求,例如输出整页 16:9 幻灯片、文字语言、只渲染白名单文字。 - 设计一致性,例如色板比例、字体继承、组件复用、重复视觉母题、对比度和留白。 - 单页设计边界,例如不得为单页创造新色板、新字体体系、新画风或新组件样式。 - 禁止事项,例如不要把“封面页”“页面标题”“视觉概念”等字段名渲染进画面。 这些规则如果放进每页提示词,会造成重复、增加 token,也会让后续维护时出现公共约束和单页约束不一致。 ### 2. 单页提示词只描述本页差异 单页提示词应该尽量短,只保留本页需要变化的内容: - 画面可见文字白名单。 - 当前页用途、版式、标题语义、内容语义。 - 本页视觉锚点。 - 版式指导。 - 上一页/下一页摘要。 - 用户额外要求。 这样每页提示词只负责“这一页怎么表达”,不负责重复定义“整套 PPT 应该是什么风格”。 ### 3. 可见文字和结构说明必须分层 图片模型容易把提示词里的字段名当成幻灯片文字渲染出来。 更稳的结构是: - `画面可见文字`:唯一允许出现在幻灯片上的文本。 - `设计参考信息`:只供模型理解页面用途和版式,不允许渲染。 - 公共禁止事项:统一约束所有页面,不在每页重复。 这比只过滤“封面”“大纲”几个词更可靠。 ### 4. 单画布单 PPT 要在工具入口替换 `generate_ppt` 是创建 PPT 大纲的唯一工具入口,因此替换旧 PPT 应在新 Frame 创建前完成。 替换逻辑: 1. 用 `isFrameElement(element) && element.pptMeta` 识别已有 PPT Frame。 2. 用 `FrameTransforms.getFrameContents(board, frameIds)` 收集 PPT Frame 及其 `frameId` 绑定内容。 3. 额外收集 `pptMeta.slideImageElementId` 和 `pptMeta.slideImageHistory[].elementId`,避免旧图片脱离 frame 绑定后残留。 4. 通过 ID 倒序 `Transforms.removeNode` 删除,避免删除过程中索引漂移。 5. 普通 Frame 和非 PPT 内容不清理。 ### 5. 文案也要同步真实行为 当工具行为从“追加新 Frame”变成“替换已有 PPT”后,内置 Skill 文案和 MCP tool warnings 必须同步。 否则 Agent 可能继续按旧语义提示用户,或让用户误以为多次执行会保留多套 PPT。 ## 检查清单 - 公共提示词包含设计一致性、单页边界和禁止事项。 - 单页提示词不再重复输出公共规则块。 - 单页提示词仍保留可见文字、视觉锚点、版式指导和相邻页上下文。 - 再次执行 `generate_ppt` 会删除旧 PPT 页面及其绑定内容。 - 旧 PPT 的当前图和历史图引用不会残留。 - 普通 Frame 不受 PPT 替换影响。 - Skill 文案明确“同一画布只保留一套 PPT”。 ## 验证建议 ```bash pnpm --dir packages/drawnix exec vitest run \ src/services/ppt/__tests__/ppt-prompts.test.ts \ src/mcp/tools/__tests__/ppt-generation.test.ts \ --no-file-parallelism --maxWorkers=1 ``` ## 提交备注模板 ```text 问题描述: - PPT 单页提示词重复携带全局设计边界和禁止事项,导致提示词冗长且公共约束难维护。 - 同一画布多次执行“生成PPT大纲”会追加多套 PPT,不符合单画布单 PPT 的产品约束。 修复思路: - 将全局设计一致性、单页边界和禁止事项集中到公共提示词。 - 单页提示词只保留可见文字、视觉锚点、版式指导和相邻页上下文。 - 在 `generate_ppt` 创建新 Frame 前,按 `pptMeta` 清理旧 PPT 页面、绑定内容和历史图片引用。 更新代码架构: - PPT prompt 层按公共提示词和单页提示词分层。 - PPT 替换逻辑集中在 `generate_ppt` 工具入口,不新增 PPT 实体。 ```