Sunday 的面试指南

AI 演示文稿 Agent 实战(下):失败续做、局部修改与 PPTX 导出

《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday

你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。

上一小节最后,咱们批准了 Outline v2。

reviewOutline() 保存审核结果以后,routeAfterReview() 返回了:

prepare_pages

这表示大纲阶段已经结束,工作流即将开始制作页面。

那么接下来,还有几个问题需要解决。

  1. 假设六个页面里只有第三页生成失败,前面已经完成的页面还要不要重新生成?
  2. 用户只想修改第二页的内容,系统怎样只重做第二页?
  3. 如果用户说“第二页使用绿色背景”,还需要重新调用模型生成页面正文吗?
  4. 最终导出文件时,系统又怎样保证使用的是当前大纲和每一页的最新 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():

AI 演示文稿 Agent 实战(下):失败续做、局部修改与 PPTX 导出 配图 1

这个 Node 主要完成两件事:

  1. 根据当前大纲创建页面任务
  2. 把需要制作的 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() 方法里面。

AI 演示文稿 Agent 实战(下):失败续做、局部修改与 PPTX 导出 配图 2

这个方法中有这么一段代码,它会先检查当前大纲版本是否已经存在页面任务:

// 检查当前大纲版本是否已经创建过页面任务
// 同一个 outlineVersion 不允许重复生成页面
const existing = this.value.pages.filter(

本节试读已结束

继续学习,解锁完整课程

购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。

扫码添加作者微信,备注「Agent 课程」

添加作者微信 · 购买完整课程

解锁完整课程 ¥499

《Agent 大模型 0 到 1 系统课》
扫码添加微信,备注「Agent 课程」,购买后由 Sunday 提供完整内容的学习方式。

扫码添加作者微信 LGD_Sunday,购买 499 元 Agent 课程

微信昵称:LGD_Sunday
手机上可长按保存二维码,再用微信扫一扫识别。

保存微信二维码