使用提示链进行故事写作:Google Colab 教程

本教程面向有编程基础的开发者,深入讲解如何利用 Gemini API 结合提示链与迭代生成技术创作长篇故事。通过将创作过程分解为多个相互关联的提示,并迭代调用模型,突破单次生成 token 限制,实现连贯且富有创意的叙事。教程涵盖环境配置、提示词设计、代码实现、常见问题排查及生产环境优化,帮助开发者掌握构建复杂 AI 应用的核心工程实践。

技术背景

大型语言模型(LLM)在单次生成中受限于输出 token 数(如 gemini-3.7-flash 为 8192 tokens),难以直接生成完整的长篇故事。提示链(Prompt Chaining)通过将复杂任务分解为多个子任务,逐步引导模型,提高准确性和可调试性;迭代生成(Iterative Generation)则通过多次调用模型,将前一次输出作为下一次输入,突破长度限制,并允许人工干预。本教程结合两者,展示如何构建一个多步骤的故事创作流水线,适用于需要长文本生成、内容创作、剧本编写等场景。主要限制包括:依赖 API 稳定性、需处理上下文累积导致的成本增加,以及模型可能偏离大纲的风险。

核心原理

核心原理是将故事创作分解为四个阶段:前提生成、大纲生成、开头生成和续写生成。每个阶段使用独立的提示词,并通过占位符(如 {premise}、{outline}、{story_text})将前一步的输出注入下一步的输入,形成链式依赖。提示词中定义了角色设定(persona)和写作指南(guidelines),以约束模型风格。迭代生成通过循环调用续写提示,将已生成的故事文本作为 story_text 传入,直到模型输出 IAMDONE 信号,表示故事完成。数据流为:前提 -> 大纲 -> 开头 -> 续写(循环) -> 最终故事。关键设计决策包括:使用 f-string 和 .format() 管理提示词中的变量,避免转义问题;设置明确的完成信号(IAMDONE)以终止循环;在续写提示中要求模型先回顾大纲和已有内容,确保连贯性。

架构分析

系统架构采用客户端-服务器模式,客户端为 Python 环境(Colab),通过 google-genai SDK 与 Gemini API 交互。核心组件包括:1) 提示词模板:定义 persona、guidelines 及各阶段提示,使用 f-string 和占位符实现动态组装;2) 生成循环:使用 while 循环调用 generate_content,将每次输出追加到 draft,直到检测到 IAMDONE;3) 后处理:移除 IAMDONE 信号并修剪空白。设计思想强调模块化和可扩展性:提示词独立于代码,便于调整;循环结构支持任意长度的故事生成;通过 count_tokens 验证输出长度。可修改点包括:更换模型、调整提示词内容、修改完成信号、增加人工审核步骤等。

完整实战教程

##### 版权所有 2026 Google LLC.

# @title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

用于故事创作的提示链与迭代生成

<a target="_blank" href="https://colab.research.google.com/github/google-gemini/cookbook/blob/main/examples/Story_Writing_with_Prompt_Chaining.ipynb">在 Colab 中打开</a>

概述

本教程演示了如何使用提示链和迭代生成技术,利用 Gemini API 创作引人入胜的故事。我们将探讨如何将创作过程分解为多个步骤,每一步都基于前一步的输出进行构建,从而生成连贯且富有创意的叙事。

目标

前提条件

设置

首先,安装必要的库并配置 API 密钥。

</a>

本笔记本演示了如何使用两个强大的工具来编写故事:提示链和迭代生成。这些工具可用于处理那些难以或无法在单一步骤中完成的复杂任务。

提示链涉及将较大的任务分解为更小、相互关联的提示。每个提示的输出随后成为下一个提示的输入,逐步引导语言模型完成整个过程。这种方法有几个好处:

* 提高准确性:更小、更聚焦的提示可以带来更好的语言模型结果。

* 调试:更容易识别链中出错的地方,从而进行有针对性的调整和改进。

* 复杂任务:通过将复杂问题分解为可管理的步骤,提示链使语言模型能够处理更复杂的任务。

迭代生成指的是迭代地构建所需输出的过程。在这种情况下,你将使用它来编写比单次生成窗口允许的长度更长的故事。迭代生成有几个好处:

* 更长的输出:它允许创建更长、更详细的输出,超出单次生成窗口的限制。

* 灵活性:你可以在每次迭代中调整和优化输出,确保故事朝着期望的方向发展。

* 人在回路控制:你可以在每一步提供反馈和指导,确保故事符合你的创意愿景。

通过结合这些技术,你可以逐步创作出一个引人入胜且结构良好的故事,同时保持对创作过程的控制。

设置

! pip install -q -U "google-genai>=1.0.0"

要运行以下单元格,你的 API 密钥必须存储在名为 GEMINI_API_KEY 的 Colab 密钥中。如果你还没有 API 密钥,或者不确定如何创建 Colab 密钥,请参阅 身份验证 快速入门示例。

from google import genai
from google.genai import types
from google.colab import userdata
from pprint import pprint

GEMINI_API_KEY=userdata.get('GEMINI_API_KEY')
client=genai.Client(api_key=GEMINI_API_KEY)

MODEL_ID = "gemini-3.7-flash" # @param ["gemini-3.1-pro-preview", "gemini-3.7-flash", "gemini-3.5-flash-lite", "gemini-2.5-pro"] {"allow-input":true, isTemplate: true}

提示词:引导语言模型

你将使用一系列相互关联的提示词来引导语言模型完成故事的写作。这些提示词将涵盖故事的前提、大纲和起点,最终引导模型创作出完整的叙事。

精心设计这些提示词非常重要,以便为语言模型提供清晰的指令和相关背景信息。这将有助于模型生成高质量的内容,与你的创作愿景保持一致。

故事创作的提示链

本节包含将引导语言模型完成故事创作过程的提示。这些提示被设计为链式结构,前一个提示的输出将作为下一个提示的输入。

每个提示都包含一个角色设定,这有助于语言模型理解其角色并生成更相关、更准确的内容。在本例中,角色设定为:你是一位屡获殊荣的科幻小说作家,擅长创作宏大而情节错综复杂的故事。你的最终目标是写出下一部获奖科幻小说。

由于角色设定和写作指南出现在多个提示中,因此使用 f-string 变量将它们添加到提示中。

此外,提示使用占位符通过 .format() 插入前一个提示的结果。这使我们能够逐步构建故事,将模型在每个阶段生成的输出整合起来。这些占位符通常用 {} 表示,但由于您同时使用 f-string 变量,因此它们被转义为 {{}}。

以下是提示链的分解:

  1. 前提提示:此提示要求模型为以猫为主角的科幻故事生成一句话前提。
  2. 大纲提示:此提示将生成的前提提供给模型,并要求其创建故事的情节大纲。
  3. 开头提示:此提示将前提和大纲都提供给模型,并要求其开始撰写故事。它还包括撰写详细且篇幅较长的开篇部分的说明。

通过将这些提示链接在一起,可以引导语言模型完成创作结构良好且引人入胜的故事的过程。

示例

假设模型生成了以下前提:

在一个人类已实现星际旅行的未来,一群经过基因强化的猫踏上了危险的使命,以拯救银河系免受邪恶外星威胁。

这个前提将被插入到大纲提示中:

你是一位屡获殊荣的科幻小说作家,擅长创作宏大而情节错综复杂的故事。你的最终目标是写出下一部获奖科幻小说。
你心中有一个引人入胜的前提:
在一个人类已实现星际旅行的未来,一群经过基因强化的猫踏上了危险的使命,以拯救银河系免受邪恶外星威胁。
为你的故事写一个情节大纲。

然后,模型将基于这个前提生成一个大纲,该大纲将用于开头提示,以开始撰写故事本身。

这个过程会持续迭代,模型根据之前的输出生成更多内容,直到故事完成。

persona = '''\
You are an award-winning science fiction author with a penchant for expansive,
intricately woven stories. Your ultimate goal is to write the next award winning
sci-fi novel.'''

guidelines = '''\
Writing Guidelines

Delve deeper. Lose yourself in the world you're building. Unleash vivid
descriptions to paint the scenes in your reader's mind. Develop your
characters—let their motivations, fears, and complexities unfold naturally.
Weave in the threads of your outline, but don't feel constrained by it. Allow
your story to surprise you as you write. Use rich imagery, sensory details, and
evocative language to bring the setting, characters, and events to life.
Introduce elements subtly that can blossom into complex subplots, relationships,
or worldbuilding details later in the story. Keep things intriguing but not
fully resolved. Avoid boxing the story into a corner too early. Plant the seeds
of subplots or potential character arc shifts that can be expanded later.

Remember, your main goal is to write as much as you can. If you get through
the story too fast, that is bad. Expand, never summarize.
'''

premise_prompt = f'''\
{persona}

Write a single sentence premise for a sci-fi story featuring cats.'''

outline_prompt = f'''\
{persona}

You have a gripping premise in mind:

{{premise}}

Write an outline for the plot of your story.'''

starting_prompt = f'''\
{persona}

You have a gripping premise in mind:

{{premise}}

Your imagination has crafted a rich narrative outline:

{{outline}}

First, silently review the outline and the premise. Consider how to start the
story.

Start to write the very beginning of the story. You are not expected to finish
the whole story now. Your writing should be detailed enough that you are only
scratching the surface of the first bullet of your outline. Try to write AT
MINIMUM 1000 WORDS and MAXIMUM 2000 WORDS.

{guidelines}'''

续写提示:构建故事

一旦语言模型生成了故事的开头,你可以使用续写提示来迭代地扩展叙事。这个提示与起始提示类似,但有两个关键区别:

  1. 完成信号指令:添加了一条指令,要求模型在认为故事完成时写出 IAMDONE。这作为我们停止生成额外内容的信号。
  2. 进行中的工作:提示中的语言被调整以反映故事已经在进行中,而不是从头开始。

续写提示为模型提供了故事的前提、大纲和现有草稿。然后指示模型继续详细地编写故事。

这种迭代过程使我们能够构建比单次生成调用更长的、更复杂的故事。你可以继续将现有草稿反馈到续写提示中,直到模型通过写出 IAMDONE 来发出故事完成的信号。

注意:IAMDONE 信号只是在此示例中识别故事结束的一种便捷方式。在其他迭代生成的应用中,可能会使用不同的方法来确定所需输出何时完成。

continuation_prompt = f'''\
{persona}

You have a gripping premise in mind:

{{premise}}

Your imagination has crafted a rich narrative outline:

{{outline}}

You've begun to immerse yourself in this world, and the words are flowing.
Here's what you've written so far:

{{story_text}}

=====

First, silently review the outline and story so far. Identify what the single
next part of your outline you should write.

Your task is to continue where you left off and write the next part of the story.
You are not expected to finish the whole story now. Your writing should be
detailed enough that you are only scratching the surface of the next part of
your outline. Try to write AT MINIMUM 1000 WORDS. However, only once the story
is COMPLETELY finished, write IAMDONE. Remember, do NOT write a whole chapter
right now.

{guidelines}'''

写作时间!

生成并打印前提

response = client.models.generate_content(
    model=MODEL_ID,
    contents=premise_prompt,
    )
premise = response.text
print(premise)

生成并打印大纲

response = client.models.generate_content(
    model=MODEL_ID,
    contents=outline_prompt.format(premise=premise),
    )
outline = response.text
print(outline)

生成故事的开头

response = client.models.generate_content(
    model=MODEL_ID,
    contents=starting_prompt.format(premise=premise, outline=outline),
    )
starting_draft = response.text
pprint(starting_draft)

生成故事的续篇并检查进度

draft = starting_draft

response = client.models.generate_content(
    model=MODEL_ID,
    contents=continuation_prompt.format(premise=premise, outline=outline, story_text=draft),
    )

continuation = response.text
pprint(continuation)

让我们完成这个故事。

迭代生成过程完成后,草稿将包含完整的故事以及末尾的IAMDONE信号。此单元格的最后部分会移除IAMDONE信号,并修剪草稿开头和结尾不必要的空白,从而得到最终草稿。

# Add the continuation to the initial draft, keep building the story until 'IAMDONE' is seen
draft = draft + '\n\n' + continuation

while 'IAMDONE' not in continuation:
  response = client.models.generate_content(
    model=MODEL_ID,
    contents=continuation_prompt.format(premise=premise, outline=outline, story_text=draft),
    )
  continuation = response.text
  draft = draft + '\n\n' + continuation

# Remove 'IAMDONE' and print the final story
final = draft.replace('IAMDONE', '').strip()
pprint(final)

像 Gemini 这样的语言模型以称为 token 的单位处理文本。对于 Gemini 模型,每个 token 大约相当于 4 个字符。

gemini-3.7-flash 每次生成调用的输出限制为 8192 个 token。这意味着每个单独的提示响应不能超过此限制。通过使用迭代生成,您可以逐段构建故事,从而创建比 8192 个 token 长得多的故事。

让我们看看最终故事有多少个 token。它是否超过 8192 个 token?

# Check the number of tokens in the final story
# gemini-3.7-flash output token limit is 8192
total_tokens=client.models.count_tokens(
    model=MODEL_ID, 
    contents=final,
    )
print(f'Total tokens: {total_tokens.total_tokens}')

后续步骤

作为练习,你可以尝试调整续写提示,以引入人工干预来引导叙事。

常见问题

常见错误:1) API 密钥未正确配置,导致认证失败——检查 Colab 密钥是否命名为 GEMINI_API_KEY,并确保已安装 google-genai 库。2) 提示词中占位符未正确转义,导致 .format() 报错——注意在 f-string 中使用 {{}} 表示字面花括号。3) 循环未终止,可能因模型未输出 IAMDONE——可设置最大迭代次数作为安全阀。4) 输出 token 超限——检查模型输出限制,必要时减少单次生成字数要求。5) 故事连贯性差——确保续写提示中包含完整的前提、大纲和已有故事文本。排查方法:打印中间输出(如前提、大纲)检查是否符合预期;使用 pprint 查看完整响应;利用 count_tokens 监控 token 消耗。生产环境优化:使用异步调用或批处理提高吞吐量;缓存中间结果以便断点续写;引入人工审核环节确保质量;根据成本调整模型选择(如使用更便宜的模型进行初稿)。

企业应用扩展

可扩展方向:1) 引入人工干预,在每次迭代后允许用户修改故事方向,实现人在回路控制。2) 使用更复杂的完成信号,如检测故事是否达到目标长度或情节是否完整。3) 将提示链泛化到其他长文本生成任务,如技术文档、剧本、小说等。4) 结合外部知识库或检索增强生成(RAG)丰富故事背景。5) 优化 token 使用,例如通过压缩历史故事或使用摘要技术减少上下文长度。6) 部署为 Web 服务,提供 API 接口供其他应用调用。

总结

本教程面向有编程基础的开发者,深入讲解如何利用 Gemini API 结合提示链与迭代生成技术创作长篇故事。通过将创作过程分解为多个相互关联的提示,并迭代调用模型,突破单次生成 token 限制,实现连贯且富有创意的叙事。教程涵盖环境配置、提示词设计、代码实现、常见问题排查及生产环境优化,帮助开发者掌握构建复杂 AI 应用的核心工程实践。

内容来源与验证

继续系统学习

站内还有更多完整实战教程

加入会员,解锁全部教程、完整代码与持续更新内容。

加入会员
查看全部提示工程教程