前言
最近经常在抖音刷到用 AI
生成的图片然后组成人物传记,比如我随便截了两张图:
然后今天再去逛 Coze
的时候,发现又多了不少插件。脑子里就又涌现出了一个想法:古今中外,著名的书籍浩如烟海,或许我们可以使用现代化的 AIGC
工具,来帮我们推荐书籍、总结书籍、并且绘制一些书籍的情节图。
这就提供了一个方便、全面、快捷的阅读指引和学习工具,可以帮助读者更好地理解和利用书籍的内容,提高阅读体验和学习效果。
插件选择
我们需要实现的主要功能是:用户输入一个关键词,机器人去搜索这个关键词相关的书籍,然后根据这本书籍的名称和简介,交给一层大语言模型总结,然后分别交给文生图、文生脑图的插件去生成对应的图片,最后把结果拼起来返回给用户。
搜书
搜书用的是这个插件,首先使用 search_books_online
,根据关键词去搜索匹配相对应的书籍。然后从匹配的结果中获取 book_id
,用这个 id
去调用 get_online_book_info
,去获取更精确的书籍名称、简介、分类、出版时间等信息。
文本生成图片
文本生成图片我一开始用的是这个 SD图片生成
但这个插件在调试的过程中经常出问题,特别是在批处理的时候,节点流程经常会异常终止。后面我选择了下面这个生图插件,它相比前者来说确实更加的稳定:
文本生成脑图
文本生成脑图我用的是下面这个插件
对于文学作品来说,一本书也好,一篇文章也好,用一张脑图去概括它,分析它是一件很好的事情。脑图可以帮助我们更好地理解整一部作品。
下面是大模型节点拓展过后的情节概述
《沙丘》是美国作家弗兰克·赫伯特所著的一部科幻小说,讲述了一个发生在未来宇宙中的故事。\n\n故事发生在一个由许多星系组成的宇宙中,其中最强大的星系是帝国。帝国的统治者是皇帝,他通过控制香料的生产和分配来维持自己的统治。香料是一种来自沙丘星的珍贵物质,它可以延长人类的寿命、增强人类的智力和能力,因此成为了整个宇宙中最有价值的商品。\n\n主人公保罗是一个来自沙丘星的年轻人,他的家族控制着沙丘星上的香料生产。保罗拥有一种特殊的能力,可以预见未来,这使得他成为了一个被各方势力争夺的对象。皇帝担心保罗会威胁到他的统治,因此派人暗杀了保罗的父亲。保罗为了报仇,加入了一个反抗皇帝的组织,并开始了他的复仇之路。\n\n在这个过程中,保罗遇到了许多人,包括他的母亲、妹妹、朋友、敌人等等。他也经历了许多挑战和考验,包括战斗、政治阴谋、心理斗争等等。最终,保罗成功地推翻了皇帝的统治,成为了新的统治者。\n\n《沙丘》是一部非常经典的科幻小说,它深刻地探讨了权力、欲望、人性、命运等主题,同时也展现了作者出色的想象力和文学才华。
我们尝试使用这个情节概述去生成一片脑图:
总体来说还是不错的,大模型节点概括的很好,脑图插件生成的结果我自身也满意
工作流实现
在确定好要用什么模型之后,就可以开始着手来实现整个插件。插件实现前可以先用一些流程图工具来梳理一些插件流程:
- 首先是一个开始节点,这里匹配一个书籍相关的关键词
- 根据关键词模糊搜索书籍
- 精确匹配书籍相关的信息
- 这里会有两个分叉的流程,分别用于生成脑图和生成情节图
- 用大模型去概括书籍的信息,然后调用插件生成脑图
- 用大模型去概括书籍的情节,然后调用插件生成情节图
- 用一个代码节点把上述得到的一些结果拼起来,得到一个最终结果
- 输出最终结果
下面来看工作流每一步的具体实现流程:
开始节点中的 name
就是用户的输入,把 name
作为模糊搜索的入参 kw
,然后把模糊搜索的出参 book_id
作为精确搜索书籍节点的入参 id
。
根据书籍搜索的相关节点可以拿到书籍的名称 title
,书籍的介绍 intro
,这个时候用一个大语言模型去拓展这两个参数,然后把拓展的结果交给脑图生成插件去执行。
书名:{{title}}
简介:{{intro}}
根据你对这本书的理解与上面的简介,尽可能详细的描述这本书的情节与梗概,我要基于你的描述生成一篇脑图
同样的,再用一个大语言模型去拓展书籍的信息,生成一个数组,其中数组的每一项就是书籍的一段情节,然后交给文生图插件去生成图片。
书名:{{title}}
根据你对这本书的理解,尽可能分点详细的描述这本书的情节,情节需要循序渐进,有始有终。你需要总结这本书,用十段左右情节来概括这本书的主要内容,结果返回一个数组,数组的每一项就是一段情节,我会根据你返回的数组去绘制数张循序渐进的情节图,数组元素为10个。
最后,使用一个代码节点来整理以下上述的各种输出,然后交给结束节点回答给用户:
ts
async function main({ params }: Args): Promise<Output> {
const { title, intro, mindmap, imgs } = params
let content = ''
imgs.forEach((img, index) => {
if (img?.data?.images?.[0]?.image_url) {
content += `![img_${index}](${img.data.images[0].image_url})\n`
}
})
return {
title,
intro,
mindmap,
imgs: content
};
}
在用这个代码节点的时候我发现 \n
到最后输出出来是一个空格,不知道是 bug
还是设计如此,所以我把要隔行输出的分成了几个变量,然后在结束节点输出的时候再调整格式。
接入体验
然后,我们来创建一个 bot
,接入我们刚刚已经设计完成的工作流:
接下来,我们输入一本书的名称,来试试看结果。我这里输入了"百年孤独":
以上就是整个 bot
的大致输出以及功能,我们来一起总结一下这个bot的功能及意义:
- 可以很方便地获取书籍信息,只需输入书名,就可以获取到书的大纲、脑图和情节图,
- 大纲提供了书籍的总体结构,帮助读者更好地理解书籍的主题和框架;脑图则可以帮助读者更清晰地理解各个章节之间的关系,以及主要概念的连接;情节图则提供了书中情节的视觉化呈现,使读者对故事情节有更直观的理解。
- 通过情节图和脑图的呈现,读者可以更直观地了解书籍的故事走向和主题发展,这有助于激发读者的创意和思考,促进对书籍内容的深入探讨和思考。
最后
以上就是本文的全部内容,如果你觉得有意思的话,点点关注点点赞吧~
BotID :7355724875166220338