<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ChatGPT 人工智能：自动写书（难度：3）]]></title><description><![CDATA[<h2><a class="anchor-offset" name="简介"></a>简介</h2>
<p dir="auto">在本教程中，你将学习构建一个简单但实用的应用程序：书籍作者。用户可以指定任何主题，然后程序将使用 ChatGPT 自动编写整本书。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a20ee7ba-bc77-4358-8b86-a048fa848b6d.gif" alt="p.gif" class=" img-responsive img-markdown" width="508" height="383" /></p>
<p dir="auto"> </p>
<p dir="auto">我们将首先添加一些小部件，允许用户指定他/她想要什么类型的书，然后使用 ChatGPT 块相应地编写这本书。</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-0-编写书籍策略讨论"></a>步骤 0 - 编写书籍策略讨论</h2>
<p dir="auto">在开始编写任何代码之前，我们需要讨论如何使用 ChatGPT 编写书籍的基本思路。众所周知，ChatGPT 的响应存在字数限制：我们的输入加上它的输出不能超过 4096 个标记，大约是 3000 个单词。因此，如果我们的书长度超过 3000 个单词，我们无法在单个请求中从 ChatGPT 获得完整的书。</p>
<p dir="auto">为了解决这个问题，有一个简单而巧妙的解决方案。我们将把这个过程分解成 2 个步骤：</p>
<ul>
<li>我们将首先要求 ChatGPT 编写一个目录，其中包括每个章节的标题</li>
<li>然后我们反复要求 ChatGPT 编写每个章节。</li>
</ul>
<p dir="auto"> <br />
现在让我们开始吧。</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-1-一个空项目"></a>步骤 1 - 一个空项目</h2>
<p dir="auto">创建一个新项目，并将其命名为“ChatGPT- Book Writer”。删除带有狗的精灵，我们将只使用“Empty1”精灵进行编码。</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-2-标题标签"></a>步骤 2 - 标题标签</h2>
<p dir="auto">首先，我们将添加一个标签，上面写着“标题：”。它将告诉用户在哪里输入书的标题。如下图所示，确保将标签的背景设置为 100% 透明，并将其边框宽度设置为 0。你将在舞台的中心获得一个标签。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ba07a479-9dda-4ee6-8c83-6ffca3047ab6.png" alt="3bbd1b39-b342-490c-b745-652a1de1403f-image.png" class=" img-responsive img-markdown" width="1037" height="517" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-3-移动标题标签"></a>步骤 3 - 移动标题标签</h2>
<p dir="auto">我们需要将标签移动到左上角。最简单的方法是使用“小部件位置”工具，它允许我们更改小部件的大小并将其拖动到新位置。新位置和大小将直接存储在块中，因此下次程序运行时，小部件将自动出现在新位置。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ce147fe8-b4c3-4fbc-ad62-8a419d1dc647.gif" alt="p.gif" class=" img-responsive img-markdown" width="945" height="274" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-4-添加标题输入文本框"></a>步骤 4 - 添加标题输入文本框</h2>
<p dir="auto">接下来，我们将添加一个文本框供用户输入书名。我们将采取相同的 2 个步骤：添加小部件，然后调整其大小和位置。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/9b771285-779a-44cd-a16b-dd8fafdc9b97.gif" alt="p.gif" class=" img-responsive img-markdown" width="1320" height="274" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-5-添加章节数标签"></a>步骤 5 - 添加章节数标签</h2>
<p dir="auto">接下来，我们需要允许用户从下拉菜单中选择章节数。它不仅可以让用户控制书的长度，还可以让我们轻松地逐个浏览每个章节。</p>
<p dir="auto">我们将首先添加一个如下所示的标签：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/76f14c4c-5c42-4594-820c-62bb2b6920d4.png" alt="db79978c-da93-45de-9653-ffcb866805f6-image.png" class=" img-responsive img-markdown" width="522" height="89" /></p>
<p dir="auto"> <br />
以下是执行此操作的块：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/95cfca9e-9969-440a-9dd1-9728fd979cc2.png" alt="43b3f1c0-4eac-489e-8d28-e757ddd01f6c-image.png" class=" img-responsive img-markdown" width="816" height="286" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-6-添加下拉菜单"></a>步骤 6 - 添加下拉菜单</h2>
<p dir="auto">接下来，我们将添加一个下拉菜单，允许用户选择 3 到 10 之间的数字：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fc8450c9-d4e0-4504-9cec-51bc337a099b.gif" alt="p.gif" class=" img-responsive img-markdown" width="512" height="387" /></p>
<p dir="auto"> <br />
为此，我们首先需要添加一个名为“numbers”的新列表，并将数字 3 到 10 插入其中：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b044b492-6b09-432a-bf4c-b265d4c2f090.png" alt="7d7c5edb-30f0-4c2e-89f3-1cd7794defaa-image.png" class=" img-responsive img-markdown" width="149" height="290" /></p>
<p dir="auto"> <br />
接下来，我们可以添加使用“numbers”列表的“下拉菜单”小部件，并将其移动到所需位置：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d6ffb0cf-8018-488d-8c72-5ffd6cf990a2.png" alt="4b4b2ef1-7984-4e73-9954-eed4e3355b93-image.png" class=" img-responsive img-markdown" width="827" height="343" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-7-添加-目录-按钮和-内容-按钮"></a>步骤 7 - 添加“目录”按钮和“内容”按钮</h2>
<p dir="auto">接下来，我们需要再添加 2 个按钮：</p>
<ul>
<li>“目录”按钮将生成目录。</li>
<li>“内容”按钮将根据目录生成书的章节。</li>
</ul>
<p dir="auto">它们将如下所示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/01e6ff98-43f8-45f6-8451-dc1278824d2a.png" alt="3f69ac5f-ee40-4c06-999f-31b9657d5e87-image.png" class=" img-responsive img-markdown" width="508" height="103" /></p>
<p dir="auto"> <br />
以下是添加按钮并更新其样式的新块：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/e42fa89d-e4df-4f99-af97-6873c12893d5.png" alt="dbcdb31b-ccb0-404d-8ca3-4312d3d7925c-image.png" class=" img-responsive img-markdown" width="1047" height="594" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-8-添加用于输出的文本框"></a>步骤 8 - 添加用于输出的文本框</h2>
<p dir="auto">最后，我们需要的小部件是另一个用于显示书籍的文本框。它需要有多行并允许滚动。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/06c499cd-7b2b-432d-89b3-a9e26899b493.png" alt="37ba16be-06a3-4f0e-ba5b-e858181f758c-image.png" class=" img-responsive img-markdown" width="528" height="392" /></p>
<p dir="auto"> <br />
以下是添加文本框的新块：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5fe72bae-5b63-432c-8612-f741b047df35.png" alt="c75ae064-2718-49e7-8eb6-167a354e0227-image.png" class=" img-responsive img-markdown" width="1084" height="64" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-9-将标题添加到书中"></a>步骤 9 - 将标题添加到书中</h2>
<p dir="auto">在用户输入书名（随意选择任何标题）和章节数后，他/她将首先单击“目录”按钮。当发生这种情况时，我们首先需要将书名从输入文本框复制到输出文本框：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d7972cee-631f-4b3e-b614-2557c11cefaf.gif" alt="p.gif" class=" img-responsive img-markdown" width="512" height="386" /></p>
<p dir="auto"> <br />
为此，我们需要使用“当小部件被点击时”块来检测用户何时单击“目录”按钮。当发生这种情况时，我们需要将输出文本框（“booktextbox”）的值设置为输入文本框（“textbox1”）的值。为了表明这是标题，我们可以使用连接块将“&lt;”和“&gt;”添加到标题：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3c1a3396-9d39-4769-80a1-dd64e5d2fd3b.png" alt="677d6ced-68ba-4f5b-b2a2-5ba2cd1b5335-image.png" class=" img-responsive img-markdown" width="830" height="127" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-10-要求-chatgpt-生成目录"></a>步骤 10 - 要求 ChatGPT 生成目录</h2>
<p dir="auto">现在我们终于准备好使用 ChatGPT API 了。为了让它编写目录，我们只需要告诉它书名和章节数。例如，这是我们的第一个版本的提示：</p>
<pre><code class="language-text">你正在帮我写一本书。标题是 &lt;时间旅行 101&gt;。它将有 4 个章节。现在编写目录。
</code></pre>
<p dir="auto">现在让我们将此提示放入名为“request”的变量中，然后将此请求发送给 ChatGPT，并将响应存储在名为“response”的变量中。然后我们可以将此响应“追加”到输出文本框：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/90a37ac1-d775-45e4-b8bb-f2cd39d10a30.png" alt="9a60b3ea-99bc-4b9d-bc19-c25706a5e07e-image.png" class=" img-responsive img-markdown" width="1269" height="304" /></p>
<p dir="auto"> <br />
这是我们将得到的：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/91414865-66c4-456c-a361-070349401c68.gif" alt="p.gif" class=" img-responsive img-markdown" width="512" height="386" /></p>
<p dir="auto"> <br />
这是一个好的开始。我们将逐一修复这些问题。</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-11-让-chatgpt-只返回目录"></a>步骤 11 - 让 ChatGPT 只返回目录</h2>
<p dir="auto">显然，最大的问题是 ChatGPT 的响应不“干净”。由于它被训练为“聊天”，它自然会在目录之前和之后添加一些句子。</p>
<p dir="auto">现在让我们尝试改进我们的请求，以便它只返回目录。例如，我们可以尝试这样说：</p>
<pre><code class="language-text">你正在帮我写一本书。标题是 &lt;时间旅行 101&gt;。它将有 4 个章节。现在只返回目录，不要在它之前或之后添加任何内容。除了目录，我不想要任何其他内容！
</code></pre>
<p dir="auto">不幸的是，我们总是得到一个“健谈”的响应：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/8b354c9b-a6e5-4f14-bbcc-3340aec8c0a7.gif" alt="p.gif" class=" img-responsive img-markdown" width="512" height="386" /></p>
<p dir="auto"> <br />
你能找到一个<strong>总是</strong>有效的好的提示吗？</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-12-标记目录的开头和结尾"></a>步骤 12 - 标记目录的开头和结尾</h2>
<p dir="auto">坏消息是，对于当前版本的 ChatGPT 来说，几乎不可能找到一个能让我们得到干净目录的提示。所以我们必须找到另一种解决方案。我们的想法是，我们接受在目录之前和之后可能存在不需要的句子，并且我们要求 ChatGPT 告诉我们目录在哪里。具体来说，我们可以要求 ChatGPT 在目录之前和之后添加 ```，如下所示：</p>
<pre><code class="language-text">你正在帮我写一本书。标题是 &lt;时间旅行 101&gt;。它将有 4 个章节。现在编写目录。在它之前和之后添加 ```。
</code></pre>
<p dir="auto"> <br />
现在我们发现 ChatGPT 几乎总是在一对 ``` 之间给出目录：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/cd5d2ab3-497c-483d-912b-40370daa20dd.gif" alt="p.gif" class=" img-responsive img-markdown" width="512" height="386" /></p>
<p dir="auto"> <br />
现在我们只需要提取响应中 2 个 ``` 标记之间的部分。我们可以使用“part N of T by X”块轻松地做到这一点：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c5b33445-d5b6-4885-83ca-c8553c137ed0.png" alt="9ec77f78-28ea-4e97-b8e3-5b4528701b57-image.png" class=" img-responsive img-markdown" width="837" height="320" /></p>
<p dir="auto"> <br />
它的工作方式是，它将首先通过 ``` 标记拆分响应。由于响应中有 2 个标记，此步骤会将响应拆分为 3 个部分，中间部分（第 2 部分）将是目录本身。</p>
<p dir="auto"> <br />
这是更改后你应该得到的：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/8b677857-4fd7-4384-b2b2-2cd34f7731af.gif" alt="p.gif" class=" img-responsive img-markdown" width="512" height="386" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-13-使用用户输入组成请求"></a>步骤 13 - 使用用户输入组成请求</h2>
<p dir="auto">另一个小问题是我们的提示是“硬编码的”。它根本没有使用用户的输入。要更改这一点，我们需要使用“连接”块来使用文本框和下拉菜单的值组成请求：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7e198453-27c2-48e0-bac6-4a2953cec025.gif" alt="p.gif" class=" img-responsive img-markdown" width="1006" height="368" /></p>
<p dir="auto"> <br />
之后，我们将始终获取用户指定的标题和章节数：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/2580070e-25d2-4ef8-b37a-20abe4c971be.gif" alt="p.gif" class=" img-responsive img-markdown" width="524" height="423" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-14-编写第一章"></a>步骤 14 - 编写第一章</h2>
<p dir="auto">现在让我们尝试要求 ChatGPT 编写第一章。我们只需要告诉它书名和目录，这恰好是输出文本框的当前值。所以我们只需要将它保存到一个名为“toc”的新变量中，然后像这样组成请求：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ee1ef755-2313-42f9-9a76-e012cef4dfa4.png" alt="13109a8b-8453-4952-90be-7c23228a5607-image.png" class=" img-responsive img-markdown" width="1015" height="202" /></p>
<p dir="auto"> <br />
请注意，由于我们正在开发程序，我们可以将字数限制为一个较小的数字，例如 100，这样我们就不必等待太长时间才能得到响应。</p>
<p dir="auto">如果我们将 request2 变量打印到控制台面板，它将如下所示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/74d22443-4294-46ec-9499-40779c51f20e.png" alt="df02681c-4026-4252-b7da-5e78747bbe0b-image.png" class=" img-responsive img-markdown" width="411" height="370" /></p>
<p dir="auto"> <br />
由于它看起来不错，现在我们只需要将此 request2 发送给 ChatGPT，并将新的响应追加到书籍文本框。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/e1bab9c5-01e9-402e-9063-c1b1cc2a4b06.png" alt="7ae84d31-8578-4ce4-9d3b-e5a1b5cfc4fa-image.png" class=" img-responsive img-markdown" width="1211" height="304" /></p>
<p dir="auto"> <br />
现在我们可以成功生成第 1 章：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/4372d14a-550f-4edb-99f6-e9a1d9bb4ba3.gif" alt="p.gif" class=" img-responsive img-markdown" width="508" height="383" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="步骤-15-使用循环编写所有章节"></a>步骤 15 - 使用循环编写所有章节</h2>
<p dir="auto">对于最后一步，我们需要使用循环逐个编写所有章节。我们可以使用 for 循环使变量“chapter”从 1 到章节总数，然后在循环中使用“chapter”变量组成对 ChatGPT 的请求：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/f6c321d9-4d56-4de1-978d-a30287dd2f83.png" alt="b11b1101-d035-4d3b-bce7-9fdbbd76a9c9-image.png" class=" img-responsive img-markdown" width="1074" height="397" /></p>
<p dir="auto"> <br />
这是该程序的最终演示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a20ee7ba-bc77-4358-8b86-a048fa848b6d.gif" alt="p.gif" class=" img-responsive img-markdown" width="508" height="383" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="增强功能"></a>增强功能</h2>
<p dir="auto">这个版本的书籍作者非常粗糙。有很多地方可以增强它。以下是一些示例：</p>
<ul>
<li>有时 ChatGPT 无法正确生成目录。我们如何改进请求以避免这种情况？</li>
</ul>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/35389d06-0b38-4d27-9739-956658d76d97.png" alt="b5e39227-9ef0-434a-8de1-3a3d18438204-image.png" class=" img-responsive img-markdown" width="518" height="235" /></p>
<ul>
<li>
<p dir="auto">输出文本框中的书籍格式不正确。尝试在书的不同部分之间添加一些空行。</p>
</li>
<li>
<p dir="auto">有时目录在给定的章节数之后包含一个“结论”，但我们的程序尚未生成任何结论。你可以尝试在最后添加它。</p>
</li>
</ul>
]]></description><link>https://forum.creaticode.com/topic/1714/chatgpt-人工智能-自动写书-难度-3</link><generator>RSS for Node</generator><lastBuildDate>Thu, 11 Jun 2026 01:17:00 GMT</lastBuildDate><atom:link href="https://forum.creaticode.com/topic/1714.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 05 Jan 2025 15:05:00 GMT</pubDate><ttl>60</ttl></channel></rss>