AI 演示文稿 Agent 实战(下):失败续做、局部修改与 PPTX 导出
《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday
你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。
上一小节最后,咱们批准了 Outline v2。
reviewOutline() 保存审核结果以后,routeAfterReview() 返回了:
prepare_pages
这表示大纲阶段已经结束,工作流即将开始制作页面。
那么接下来,还有几个问题需要解决。
- 假设六个页面里只有第三页生成失败,前面已经完成的页面还要不要重新生成?
- 用户只想修改第二页的内容,系统怎样只重做第二页?
- 如果用户说“第二页使用绿色背景”,还需要重新调用模型生成页面正文吗?
- 最终导出文件时,系统又怎样保证使用的是当前大纲和每一页的最新 Revision?
那么这一小节,咱们就继续从 prepare_pages 开始,继续往下面看~
批准大纲以后,页面任务怎样生成
先回到 presentation-graph.service.ts。
大纲审核通过以后,Graph 会进入 prepare_pages Node:
.addConditionalEdges('review_outline', this.routeAfterReview, {
prepare_pages: 'prepare_pages',
revise_outline: 'revise_outline',
finish_rejected: 'finish_rejected'
})
当前审核结果是 approve,所以接下来执行的就是 preparePages():
这个 Node 主要完成两件事:
- 根据当前大纲创建页面任务
- 把需要制作的 pageId 放进执行队列
咱们一点点来看。
首先,咱们会根据 presentationId 获取到当前的文稿对象,然后处理页面制作的任务
// 根据 presentationId 加载当前演示文稿聚合对象
const aggregate = await this.load(state.presentationId)
// 根据当前大纲生成页面制作任务
// 如果页面任务已经存在,则由领域模型内部保证不会重复创建
aggregate.ensurePageTasks()
ensurePageTasks() 会读取当前已经批准的大纲,再把大纲中的每一页转换成一项可以执行的页面任务。
这里先看一下转换以前的数据。
上一小节生成的 Outline v2 中,有一个 slides 数组。数组里的每一项都表示一页大纲,例如第三页的数据大致是:
const outline = {
version: 2,
slides: [
{
pageId: 'page-3',
order: 3,
title: '页面任务的部分成功与局部重做',
purpose: '展示页面级任务如何独立记录结果',
keyPoints: [
'成功页面继续保留',
'失败页面单独续做',
'单页修改产生新 Revision'
]
}
]
}
项目在遍历 outline.slides 时,把当前遍历到的这一项命名为 slide:
const pages: PageTask[] = outline.slides.map((slide) => ({
pageId: slide.pageId,
order: slide.order,
title: slide.title,
purpose: slide.purpose,
// 继续补充页面制作阶段需要的状态
}))
所以,slide 指的就是大纲中的某一页。
不过,一页大纲只能说明“这一页准备讲什么”。真正开始制作以后,系统还需要记录这一页有没有生成成功、尝试了几次、当前使用哪个版本。
因此,项目又定义了 PageTask,也就是 页面制作任务。
同一页大纲转换成 PageTask 以后,就会变成:
{
pageId: 'page-3',
order: 3,
title: '页面任务的部分成功与局部重做',
purpose: '展示页面级任务如何独立记录结果',
outlineVersion: 2,
pageRevision: 1,
status: 'pending',
attempts: 0,
lastError: null,
changeRequest: null,
styleOverride: null,
currentArtifactId: null,
artifacts: []
}
创建并保存这些 PageTask 以后,后面的工作流才能判断哪些页面需要生成、哪些页面已经完成,以及失败以后应该继续哪一页。
那么页面任务为什么不会被重复创建呢?
这个关键就在 ensurePageTasks() 方法里面。
这个方法中有这么一段代码,它会先检查当前大纲版本是否已经存在页面任务:
// 检查当前大纲版本是否已经创建过页面任务
// 同一个 outlineVersion 不允许重复生成页面
const existing = this.value.pages.filter(本节试读已结束
继续学习,解锁完整课程
购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。
