ChatGPT 人工智能:自动写书(难度:3)
-
简介
在本教程中,你将学习构建一个简单但实用的应用程序:书籍作者。用户可以指定任何主题,然后程序将使用 ChatGPT 自动编写整本书。
我们将首先添加一些小部件,允许用户指定他/她想要什么类型的书,然后使用 ChatGPT 块相应地编写这本书。
步骤 0 - 编写书籍策略讨论
在开始编写任何代码之前,我们需要讨论如何使用 ChatGPT 编写书籍的基本思路。众所周知,ChatGPT 的响应存在字数限制:我们的输入加上它的输出不能超过 4096 个标记,大约是 3000 个单词。因此,如果我们的书长度超过 3000 个单词,我们无法在单个请求中从 ChatGPT 获得完整的书。
为了解决这个问题,有一个简单而巧妙的解决方案。我们将把这个过程分解成 2 个步骤:
- 我们将首先要求 ChatGPT 编写一个目录,其中包括每个章节的标题
- 然后我们反复要求 ChatGPT 编写每个章节。
现在让我们开始吧。
步骤 1 - 一个空项目
创建一个新项目,并将其命名为“ChatGPT- Book Writer”。删除带有狗的精灵,我们将只使用“Empty1”精灵进行编码。
步骤 2 - 标题标签
首先,我们将添加一个标签,上面写着“标题:”。它将告诉用户在哪里输入书的标题。如下图所示,确保将标签的背景设置为 100% 透明,并将其边框宽度设置为 0。你将在舞台的中心获得一个标签。
步骤 3 - 移动标题标签
我们需要将标签移动到左上角。最简单的方法是使用“小部件位置”工具,它允许我们更改小部件的大小并将其拖动到新位置。新位置和大小将直接存储在块中,因此下次程序运行时,小部件将自动出现在新位置。
步骤 4 - 添加标题输入文本框
接下来,我们将添加一个文本框供用户输入书名。我们将采取相同的 2 个步骤:添加小部件,然后调整其大小和位置。
步骤 5 - 添加章节数标签
接下来,我们需要允许用户从下拉菜单中选择章节数。它不仅可以让用户控制书的长度,还可以让我们轻松地逐个浏览每个章节。
我们将首先添加一个如下所示的标签:
以下是执行此操作的块:
步骤 6 - 添加下拉菜单
接下来,我们将添加一个下拉菜单,允许用户选择 3 到 10 之间的数字:
为此,我们首先需要添加一个名为“numbers”的新列表,并将数字 3 到 10 插入其中:
接下来,我们可以添加使用“numbers”列表的“下拉菜单”小部件,并将其移动到所需位置:
步骤 7 - 添加“目录”按钮和“内容”按钮
接下来,我们需要再添加 2 个按钮:
- “目录”按钮将生成目录。
- “内容”按钮将根据目录生成书的章节。
它们将如下所示:
以下是添加按钮并更新其样式的新块:
步骤 8 - 添加用于输出的文本框
最后,我们需要的小部件是另一个用于显示书籍的文本框。它需要有多行并允许滚动。
以下是添加文本框的新块:
步骤 9 - 将标题添加到书中
在用户输入书名(随意选择任何标题)和章节数后,他/她将首先单击“目录”按钮。当发生这种情况时,我们首先需要将书名从输入文本框复制到输出文本框:
为此,我们需要使用“当小部件被点击时”块来检测用户何时单击“目录”按钮。当发生这种情况时,我们需要将输出文本框(“booktextbox”)的值设置为输入文本框(“textbox1”)的值。为了表明这是标题,我们可以使用连接块将“<”和“>”添加到标题:
步骤 10 - 要求 ChatGPT 生成目录
现在我们终于准备好使用 ChatGPT API 了。为了让它编写目录,我们只需要告诉它书名和章节数。例如,这是我们的第一个版本的提示:
你正在帮我写一本书。标题是 <时间旅行 101>。它将有 4 个章节。现在编写目录。
现在让我们将此提示放入名为“request”的变量中,然后将此请求发送给 ChatGPT,并将响应存储在名为“response”的变量中。然后我们可以将此响应“追加”到输出文本框:
这是我们将得到的:
这是一个好的开始。我们将逐一修复这些问题。
步骤 11 - 让 ChatGPT 只返回目录
显然,最大的问题是 ChatGPT 的响应不“干净”。由于它被训练为“聊天”,它自然会在目录之前和之后添加一些句子。
现在让我们尝试改进我们的请求,以便它只返回目录。例如,我们可以尝试这样说:
你正在帮我写一本书。标题是 <时间旅行 101>。它将有 4 个章节。现在只返回目录,不要在它之前或之后添加任何内容。除了目录,我不想要任何其他内容!
不幸的是,我们总是得到一个“健谈”的响应:
你能找到一个总是有效的好的提示吗?
步骤 12 - 标记目录的开头和结尾
坏消息是,对于当前版本的 ChatGPT 来说,几乎不可能找到一个能让我们得到干净目录的提示。所以我们必须找到另一种解决方案。我们的想法是,我们接受在目录之前和之后可能存在不需要的句子,并且我们要求 ChatGPT 告诉我们目录在哪里。具体来说,我们可以要求 ChatGPT 在目录之前和之后添加 ```,如下所示:
你正在帮我写一本书。标题是 <时间旅行 101>。它将有 4 个章节。现在编写目录。在它之前和之后添加 ```。
现在我们发现 ChatGPT 几乎总是在一对 ``` 之间给出目录:
现在我们只需要提取响应中 2 个 ``` 标记之间的部分。我们可以使用“part N of T by X”块轻松地做到这一点:
它的工作方式是,它将首先通过 ``` 标记拆分响应。由于响应中有 2 个标记,此步骤会将响应拆分为 3 个部分,中间部分(第 2 部分)将是目录本身。
这是更改后你应该得到的:
步骤 13 - 使用用户输入组成请求
另一个小问题是我们的提示是“硬编码的”。它根本没有使用用户的输入。要更改这一点,我们需要使用“连接”块来使用文本框和下拉菜单的值组成请求:
之后,我们将始终获取用户指定的标题和章节数:
步骤 14 - 编写第一章
现在让我们尝试要求 ChatGPT 编写第一章。我们只需要告诉它书名和目录,这恰好是输出文本框的当前值。所以我们只需要将它保存到一个名为“toc”的新变量中,然后像这样组成请求:
请注意,由于我们正在开发程序,我们可以将字数限制为一个较小的数字,例如 100,这样我们就不必等待太长时间才能得到响应。如果我们将 request2 变量打印到控制台面板,它将如下所示:
由于它看起来不错,现在我们只需要将此 request2 发送给 ChatGPT,并将新的响应追加到书籍文本框。
现在我们可以成功生成第 1 章:
步骤 15 - 使用循环编写所有章节
对于最后一步,我们需要使用循环逐个编写所有章节。我们可以使用 for 循环使变量“chapter”从 1 到章节总数,然后在循环中使用“chapter”变量组成对 ChatGPT 的请求:
这是该程序的最终演示:
增强功能
这个版本的书籍作者非常粗糙。有很多地方可以增强它。以下是一些示例:
- 有时 ChatGPT 无法正确生成目录。我们如何改进请求以避免这种情况?
-
输出文本框中的书籍格式不正确。尝试在书的不同部分之间添加一些空行。
-
有时目录在给定的章节数之后包含一个“结论”,但我们的程序尚未生成任何结论。你可以尝试在最后添加它。
-