动手做个Agent - Presentation Agent实践

50 阅读7分钟

动手做个Agent - Presentation Agent实践

【AI大模型教程】

两个月前趁着claude code比较火,上手直接试了一下用它来做一个presentation agent的saas服务。整体感觉是claude code这类代码工具可以极大的提高开发的效率,尤其是在不熟悉的前端开发的时候,完全是靠模型帮忙端到端生成的。虽然claude code在体验上还是有挺多问题,但是还是非常值得推荐开发同学去体验尝试,关于claude code的使用体验,后面有时间再慢慢聊吧,今天简单聊聊这个presentation agent的内容。

整体效果

只能说效果一般,要做好还有很多地方要打磨。

Landing Page

工作页面

结果预览

PC端

移动端:

设计思路

首先我们生成的不是PPT,而是演示页面,那么基于现有的大模型在生成静态页面能力这么强的基础上,我们选择直接生成HTML页面。

我们采用的是workflow的形式来生成完整的内容,主要划分成以下三个步骤:

1.根据用户需求生成内容大纲

2.根据大纲生成每页的主要内容

3.生成演示页面

其实做下来发现,核心的难点还是信息的收集,本质上我们做的是类似Deep Research做的事情,只是顺便把结果结构化成不同的页面。

Agent

为了完成前面提到的3个任务,我们设计了3个不同的Agent,分别生成大纲,内容和网页。这里给Agent配备的工具只有搜索(serper.dev)和fetch(MCP工具),利用json_object作为输出结构,方便解析,同时限制了agent的最大调用次数,避免陷入死循环。

Outline Agent

Outline很简单,纯粹的prompt驱动

Plain Text                   你的任务是根据用户的描述生成大纲。                   大纲包含{num_topics}个子主题,每个子主题包含 3-5 个要点。                   要求:                   - 如果你对用户的描述内容不清楚,或者是涉及时效性的信息,使用搜索工具获取最新的信息来帮助你理解                   - 在搜索到相关链接后,可以使用 {fetch_tool} 工具来阅读页面的详细内容。                   - **最终必须返回有效的JSON格式**,严格遵循以下 Pydantic 模型的定义:                   {Outline.model_json_schema()}                   **重要**:无论如何都必须输出符合上述schema的JSON对象,即使信息不完整也要返回一个基本的大纲结构。

最终输出:

Search Agent

前面Outline Agent已经生成结构化的数据,那么Search Agent就可以并行执行,分别去收集每一块内容。

最终输出

Html Agent

有了前面的内容,Html Agent内部其实也是个workflow,分成主题样式设计、封面页生成、目录页生成、内容页生成几个步骤。

问题和反思

开发效率问题

整体前前后后利用下班时间,从开始到最终部署到自己的网站,利用claude code花了大概1-2个月(包括中间有几个星期忙工作,没时间搞,只能说是断断续续)。

开发模式基本是我会跟claude聊想法,然后转化成github项目上的issue或者feature,然后每天就跟claude code说要解决哪个feature,看它写代码然后review,但是中间claude code会限制使用次数,往往就会造成干到一半就停工,等第二天再接着搞的情况,浪费了挺多时间,如果买个更高级的claude会员应该会好很多。

另外也没有用现有的Agent SDK,比如langgraph,所有的开发(比如上下文管理,MCP集成)都是从头撸的,也花费了一些时间,不过好处是对细节把控更到位一些。

在服务开发期间,比较大的问题我感觉还是claude对于代码库复杂的情况下,很多细节没有理解,会导致没有复用原来的接口能力,重复造轮子,即浪费时间也浪费使用次数。当然也跟我的claude.md没去更新管理有关,每次都是让它重新理解代码,只能说我自己对代码库的上下文管理还不到位。

使用claude-monitor可以方便了解用量,对当前工作有预期。

信息收集模块

Search Agent这里问题挺多,包括:

1.Search Agent为了提高效率,是采用并行的方法去执行的,每个Agent只负责大纲的一部分,就会造成Agent对整体的内容缺乏一个把控,会重复去同一个来源获取信息,这势必导致token的浪费和生成的部分内容和其他Agent有重复。同时生成的内容会过于丰富,导致后面生成页面的时候信息过多,增加页面复杂度。 一个稍微好点的方法可能是只靠一个Agent去完成所有的信息收集,但是这对agent的能力要求就比较高了。另外就是将Agent返回的结果再做一次汇总。

2.Token用量极高,这里我主要限制了搜索和fetch的使用次数,以及fetch内容的长度。看下面图,内容生成就花费了900K的token,而且大部分都是输入token。一个更好的策略应该是用更小更便宜的模型,对网页的内容根据query做个理解总结再返回,而不是直接将网页原始内容作为输入。

3.图片问题。在Search Agent中,我们获取图片的方法主要是两种,一个是根据网页的内容,模型自己判断哪些图片链接是有用的,另外就是直接进行图片搜索,这就导致我们无法判断图片的质量,以及图片是否跟内容相关。比如会出现质量差的图片,或者有水印的图片,有大量文字的图片,给最终的页面相关呈现不好的情况;另外我们不下载图片(其实如果下载图片的话好一些,由于某些扣扣搜搜的原因我选择不下载),会出现链接失效或者无法显示的问题,同时图片的尺寸未知,无法提前跟紧图片尺寸设计它在页面上的位置和呈现形式。

比如下面Iphone的图片显示不完整,被截断:

海报图片缺失:

正如前面提到了,解决方法包含:1、将图片下载到本地,这样保证图片有效以及获取图片大小。2、使用一个多模态模型对图片做一层理解,分析它的内容

HTML生成

HTML生成的难点是评估效果,每次都只能根据自己的感觉来调整prompt或者流程,开发效率挺低了,还是那句话,Agent的前提是能有效定义好评估的标准,最好能够自动化的评估,不然没法快速迭代。

相对来说,封面页和目录页是好设计的,只要prompt调整的好,基本都能生成还不错的效果,但是内容页就比较难了,对于我这种没有设计美学的人来说,只能看它整体布局是不是简洁清晰,有没有明显的问题。

我这里只列举一些我觉得还不够好的地方

1.页面布局不对齐,比如下面这种:

2.内容分布不合理,有的多,有的少

3.图片失效和尺寸问题,这个前面已经提过了

4.不同的页面,有的内容有的长一些,有的短一些,这个主要是没有限制页面尺寸,限制尺寸会带来的问题就是内容溢出,二者要做权衡

5.配色有点土有时候,不够现代,比如下面的,蓝色没问题,但是整体我就感觉不是很好看