查看原文
其他

AI 写书,升级了!

鱼皮 程序员鱼皮 2024-01-21

大家好,我是屑老板鱼皮,上周给大家分享了下我们 鱼聪明 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 大作:

往期推荐

上线啦!

聊聊本地缓存和分布式缓存

“这不是个大学生都能做吗?”

美好的周末,又改了一天 Bug。。

代码开源了!

通过 Desktop 学 Docker 也太简单了

继续滑动看下一个

AI 写书,升级了!

鱼皮 程序员鱼皮
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存