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