大家好,我是屑老板鱼皮,上周给大家分享了下我们 的写书功能。只需要输入你想写的书名和描述,就能够自动让 AI 帮你生成一本书籍:
由于也是刚刚上线嘛,功能没有做到特别完备,也收到了很多小伙伴们的反馈,比如:
收到大家的反馈后,我就开始写代码来修复这些问题了。
现在,AI 写书功能已经全面升级,改进如下:
欢迎大家体验一下,AI 写出来的书,还是挺有意思的哈哈!
鱼聪明 AI:https://yucongming.com
介绍完了优化点,接下来我想给大家分享一下 AI 写书程序的优化方法。
当我们要开发一个执行时间很长、中间过程很多的任务时,都可以采用下面的方法来设计程序,能够给发起任务的用户带来更好的体验。
比如我们鱼聪明的 AI 写书任务,要经过:任务校验 => 生成目录 => 依次生成多篇文章 => 结果生成等多个流程,总耗时可能要超过 10 分钟。
最简单粗暴的方式,就是一个方法内,把所有这套流程的代码全部写完。像下面这样:
但是这样的缺点很明显:
所以,首先我们要进行 任务拆分 ,把每个任务作为一个单独的方法(函数),将上一个任务的结果作为下一个任务的输入来进行参数传递。
像下面这样:
这样,程序的结构就很清晰了。但只要有一个方法失败,整个写书任务还是会终止,再次重试时还会从第一步(任务校验)开始执行。
怎么解决呢?
我们可以对任务状态进行 持久化 ,比如把每个任务的执行结果、任务整体的执行状态保存到数据库中,比如当前正在写第几篇文章。如果失败了,就把失败的信息和当前步骤记录到数据库中,相当于保存了个断点。
然后,写书任务的每个小步骤在执行前,都要从数据库(而不是从程序中)获取当前任务的最新状态,从而判断自己是否需要执行当前步骤。
举个例子,如果已经生成过书籍的目录,然后服务器挂了导致任务失败。点击重试后,生成目录的任务就不用再执行了。
伪代码如下:
通过上面的 和 ,我们的程序就已经有了从中间失败状态继续执行的能力。
但是还要考虑一些特殊情况,比如任务失败了,还没来得及把 “失败” 状态保存到数据库中服务器就挂了,给用户的感觉就是 “任务仍在执行中”。
对于这种情况,可以编写定时任务来轮询数据库中所有执行超过一定时间、并且状态仍为执行中的任务,并且将这些任务状态置为 “失败”,算是一种补偿机制。
当然,系统资源允许的情况下,还可以适当增加重试策略,任务失败后自动重试,不影响用户体验。但一定要设置最大重试次数、重试间隔时间等,避免 “滚雪球”。
此外,只要是开发这种长耗时的任务,在上线初期最好多加一些监控和日志,后面排查问题会方便很多。
这样一套流程下来,程序的可靠性、可用性就会增强不少~