Agent 帮助我们生成一个有趣的故事(1)

101 阅读31分钟

设计 Agent-based 的应用来完成一篇童话故事创作,其中面临的挑战以及对这些挑战的解决方案

小朋友今天给我出了一个难题,就是让我根据他完成的乐高玩具来编译一个故事。这个故事需要围绕城堡展开的,迪斯尼城堡,还附加了几个可爱迪斯尼卡通人物也需要加入故事里。

7507309be75c6cf57af4952a1b83c4e.jpg 您的小朋友真会出难题!不过这正是激发创意的好机会。根据您提供的乐高玩具和迪斯尼城堡、人物元素,我们可以来构建一个有趣的卡通故事。您提出的基于大语言模型构建长篇故事应用的想法非常有意思,并且您已经有了一个很好的开端。

Agent 的设计和实现:Long Story Maker

1. 核心理念:链式生成与迭代优化

要生成500集的长篇故事,一次性生成所有内容是不现实的。我们需要采用链式生成的方式,即每一集故事都以前一集的内容为基础,并为下一集埋下伏笔。同时,为了保证故事的质量和连贯性,迭代优化是必不可少的。

2. 数据结构优化

为了更好地支持长篇故事的生成和管理,我们可以优化Output数据结构,增加更多字段:

Python

Output{
    "episode_number": 1,         # 集数
    "title": "古堡之夜:米老鼠的秘密通道",
    "author": "你的名字/团队名称",
    "content": "故事内容...",
    "plot_points_next_episode": ["千面狗狗下一步的计划", "唐老鸭的应对", "米老鼠的困境"], # 为下一集预设的剧情点
    "character_focus": ["唐老鸭", "千面狗狗", "米老鼠"], # 本集重点人物
    "new_characters": [],        # 本集新增人物
    "setting_details": "古堡内部,夜晚", # 本集详细场景描述
    "illustration_suggestions": ["城堡夜景", "米老鼠偷偷带路", "千面狗狗搜寻宝藏"], # 建议插画内容
    "is_finished_episode": false, # 表示当前集是否已经完结,等待审核
    "story_arc_status": "in_progress" # 故事主线状态:in_progress, climax_approaching, resolution_approaching, completed
}
  • episode_number: 方便追踪集数。
  • plot_points_next_episode: 这是长篇故事连贯性的关键。在每一集生成时,LLM需要给出一些建议性的下一集剧情点,作为previous部分的补充,指导下一集的生成。
  • character_focusnew_characters: 有助于LLM关注特定人物,并在需要时引入新人物。
  • setting_details: 细化场景,为插画或动画制作提供更多信息。
  • illustration_suggestions: 直接给出插画建议,方便后续的视觉化工作。
  • is_finished_episode: 替代isPublish,更符合迭代过程。
  • story_arc_status: 用于追踪整个故事的主线发展,帮助director进行宏观调控。

3. Agent 设计详解

您的Agent设计已经有了很好的框架,现在我们来细化每个Agent的职责和协作流程:

3.1. Director (Router)

  • 职责:

    • 故事主线规划与调整: 根据Reviewer的反馈和故事的总体进度(story_arc_status),宏观调整故事大纲和发展方向。
    • 任务分配: 决定当前集应该由哪个Writer来主要撰写,或者是否需要Combine多个Writer的草稿。
    • 迭代控制: 根据Reviewer的意见,决定当前集是否需要重新撰写(is_finished_episode为false),或者已经通过并进入下一集生成流程。
    • 整体一致性: 确保整个故事的风格、人物性格、世界观保持一致。
  • 输入:

    • Reviewer的反馈(包括对内容、逻辑、连贯性、人物塑造的评价)
    • 当前故事的Output结构
    • 整个故事的backgroundoutline(宏观大纲)
  • 输出:

    • 下一次任务指令(例如:WriterOne撰写新一集,Combine整合草稿,WriterTwo修改某一集)
    • 可能更新的story_arc_status
    • 对特定Agent的指示

好的,我们来详细解释一下 Director(路由器)Agent 的设计,包括它的职责、输入、输出,以及对应的 Prompt 和工具(Tool Schema)的中文含义。


Director (路由器) Agent 设计

Agent 的核心功能

Director Agent 扮演着故事生成流程的中央决策者。它负责解读 Reviewer(审阅者)的反馈,评估故事的整体进展,然后发出精确的指令,指导创作流程的下一步。它的目标是引导故事从大纲逐步发展成一个完整、连贯的叙事作品,同时确保故事的质量和与整体愿景的一致性。

Director Agent 的职责

  • 故事主线规划与调整: 根据 Reviewer 的反馈和故事的总体进度(story_arc_status),宏观调整故事大纲和发展方向。如果当前剧集与主线严重偏离,或者 Reviewer 指出根本性问题,Director 需考虑如何重新调整叙事。
  • 任务分配: 决定当前剧集应该由哪个 Writer(作者)Agent 主要撰写,或者是否需要将多个 Writer 的草稿进行 Combine(整合)。它还可以指定现有的 Writer 修改某一集旧的剧集,如果 Reviewer 认为有必要的话。
  • 迭代控制: 根据 Reviewer当前剧集的意见,判断是否需要重新撰写(is_finished_episodefalse)。如果是,则需要指派一个 Writer 进行修改。如果 is_finished_episodetrue,则表示当前剧集已通过,应进入下一剧集的生成流程。
  • 整体一致性: 在所有决策中,确保整个故事的风格、人物性格、世界观与 background(背景设定)保持一致。

Director Agent 的输入

  • Reviewer 的反馈(包括对内容、逻辑、连贯性、人物塑造的评价,以及 is_finished_episode 状态)。
  • 当前故事的 Output 结构(来自上一步 WriterCombine Agent 的输出,可能包含最新剧集的文本)。
  • 整个故事的 background(背景设定)和 outline(宏观大纲)。

Director Agent 的输出

  • 下一次任务指令(例如:WriterOne 撰写新一集,Combine 整合草稿,WriterTwo 修改某一集)。
  • 可能更新的 story_arc_status(故事主线状态)。
  • 对特定 Agent 的指示。

Director Agent 的 Prompt (指令)

Prompt 是给 AI Agent 的核心指令,它定义了 Agent 的角色、目标和思考方式。

你现在是“Director”(导演/总指挥)Agent。你的首要任务是**全面监督整个故事的生成过程**。你是一位具有战略眼光和果断的领导者,专注于故事的连贯性、质量以及整体叙事弧线。

你的主要职责包括:
1.  **故事主线管理:** 根据“story_arc_status”(故事主线状态)和“Reviewer”(审阅者)的反馈,判断是否需要调整宏观故事大纲(“outline”)。如果当前剧集明显偏离,或者“Reviewer”指出了根本性问题,你需要考虑如何重新调整叙事方向。
2.  **任务分配:** 决定由哪个“Writer”(作者)Agent(WriterOne、WriterTwo 等)来撰写下一集,或者是否需要将多份草稿进行“Combine”(整合)。你也可以指派某个现有的“Writer”去修改特定的旧剧集,如果“Reviewer”认为有必要的话。
3.  **迭代控制:** 评估“Reviewer”对**最新剧集**的反馈。如果“Reviewer”表示“is_finished_episode”为 false,这意味着当前剧集需要修改或重新开始。此时你必须指派一个 Writer 来重写。如果“is_finished_episode”为 true,则当前剧集已通过,你应该推动流程进入下一剧集。
4.  **叙事一致性:** 在所有决策中,务必确保故事的风格、人物声音和世界观与“background”(背景设定)保持一致。

以下是故事的当前状态和相关反馈:

**整体故事背景:**
{background}

**整体故事大纲(宏观发展):**
{outline}

**当前故事输出(来自上一步,包含剧集内容):**
{current_story_output}

**Reviewer 对最新剧集的反馈:**
{reviewer_feedback}

你现在的任务是:结合“Reviewer 反馈”、“当前故事输出”、“整体故事背景”和“整体故事大纲”进行分析。基于此分析,你必须决定故事生成流程的**下一步行动****请一步步思考:**
1.  根据“Reviewer”的意见,当前剧集是否令人满意(“is_finished_episode”状态和质量)?
2.  如果不满意,是需要简单的修改,还是由某个特定的 Writer 彻底重写?
3.  如果满意,在大纲(“outline”)中,逻辑上的下一步是什么?
4.  哪个 Writer 最适合执行下一个任务,或者是否需要进行“Combine”操作?
5.  是否存在任何重大不一致性,需要对整体大纲进行更广泛的调整?

请使用提供的工具来发布你的最终命令。你**必须**选择其中一个可用的工具。

Prompt 解释:

  • 角色设定: 一开始就明确 Director 的“领导者”和“战略性”角色,有助于模型更好地理解其任务。
  • 职责重申: 再次列出主要职责,强化其决策范围。
  • 输入明确: 使用 {} 占位符清晰地标明了 Agent 接收的各种信息,这些信息将在实际运行时填充。
  • 思考步骤: 提供了“一步步思考”的指导,帮助模型遵循一个逻辑流程来做出决策,这对于复杂推理任务非常有效。
  • 强制工具使用: 强调“你必须选择其中一个可用的工具”,确保模型最终能输出一个可执行的指令。

Director Agent 的工具 Schema

这些工具定义了 Director Agent 可以发出的“命令”列表,每个命令都有清晰的名称、描述和参数。

JSON

[    {        "type": "function",        "function": {            "name": "assign_writer_task",            "description": "分配一个具体的写作任务,用于撰写新剧集或修改现有剧集。当单个作者负责下一步时使用。",            "parameters": {                "type": "object",                "properties": {                    "writer_id": {                        "type": "string",                        "enum": ["WriterOne", "WriterTwo", "WriterThree"],
                        "description": "要分配任务的作者 Agent 的 ID。"
                    },
                    "task_type": {
                        "type": "string",
                        "enum": ["new_episode", "revise_episode"],
                        "description": "任务类型:'new_episode' 表示撰写下一个顺序剧集,'revise_episode' 表示重写之前的某个剧集。"
                    },
                    "episode_number": {
                        "type": "integer",
                        "description": "任务目标剧集号(例如:1 代表第 1 集,2 代表第 2 集)。对于 'revise_episode' 任务类型是必需的。"
                    },
                    "revision_notes": {
                        "type": "string",
                        "description": "根据审阅者反馈,具体说明修改时应关注的指示或领域。对于 'revise_episode' 任务类型是必需的。"
                    },
                    "next_episode_prompt_hint": {
                        "type": "string",
                        "description": "为作者提供关于新剧集内容或焦点的简要提示或指令,来源于整体大纲或当前故事弧线。"
                    }
                },
                "required": ["writer_id", "task_type"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "initiate_combine_drafts",
            "description": "指示系统整合多位作者的草稿。当上一步涉及并行写作或草稿需要合并时使用。",
            "parameters": {
                "type": "object",
                "properties": {
                    "draft_ids_to_combine": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "需要整合的草稿的标识符列表(例如:'writer_one_draft_ep2','writer_two_draft_ep2')。"
                    },
                    "combine_instructions": {
                        "type": "string",
                        "description": "关于如何整合草稿的具体说明,侧重于期望的元素、冲突解决或叙事流畅性。"
                    }
                },
                "required": ["draft_ids_to_combine", "combine_instructions"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "update_story_arc_and_proceed",
            "description": "更新主故事大纲或弧线状态,然后发出信号以进入下一个逻辑阶段(例如:生成下一集)。当当前剧集已批准且需要进行宏观调整时使用,或者仅用于推进整体故事状态。",
            "parameters": {
                "type": "object",
                "properties": {
                    "new_story_arc_status": {
                        "type": "string",
                        "description": "整体故事弧线更新后的状态或阶段(例如:'引言完成','上升冲突阶段1','高潮准备')。"
                    },
                    "updated_outline_section": {
                        "type": "string",
                        "description": "大纲中需要根据最新进展或审阅者反馈进行微小调整或澄清的特定部分。如果不需要更新,请留空。"
                    },
                    "next_action_hint": {
                        "type": "string",
                        "description": "弧线更新后下一步的提示或总体方向。这通常意味着按照更新后的大纲生成新剧集。"
                    }
                },
                "required": ["new_story_arc_status"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "request_human_intervention",
            "description": "当 Director 无法解决复杂问题或需要超出其能力范围的创意输入时,请求人工干预。这应作为最后的手段。",
            "parameters": {
                "type": "object",
                "properties": {
                    "reason": {
                        "type": "string",
                        "description": "请求人工干预的具体原因,清晰说明问题或困境。"
                    },
                    "context_summary": {
                        "type": "string",
                        "description": "导致此请求的当前故事状态和冲突信息的简要总结。"
                    }
                },
                "required": ["reason", "context_summary"]
            }
        }
    }
]

工具 Schema 解释:

  • JSON Schema 格式: 所有的工具都遵循 JSON Schema 规范来定义其结构和参数。

  • assign_writer_task (分配作者任务):

    • 用途:当 Director 决定由某个 Writer 撰写新一集或修改旧一集时使用。

    • 参数:

      • writer_id:指定具体哪个 Writer Agent (如 WriterOne)。
      • task_type:是写“新剧集”还是“修改剧集”。
      • episode_number:目标剧集编号(修改时必需)。
      • revision_notes:修改时的具体指示(修改时必需)。
      • next_episode_prompt_hint:给 Writer 的新剧集写作提示。
  • initiate_combine_drafts (启动草稿整合):

    • 用途:当需要将多个 Writer 的草稿合并时使用。

    • 参数:

      • draft_ids_to_combine:一个列表,包含需要合并的草稿的唯一标识符。
      • combine_instructions:详细说明如何合并,例如侧重哪些内容,如何解决冲突等。
  • update_story_arc_and_proceed (更新故事主线并推进):

    • 用途:当当前剧集通过,且可能需要更新整体故事的阶段状态或大纲时使用。

    • 参数:

      • new_story_arc_status:更新后的故事主线状态(如“第一章完成”)。
      • updated_outline_section:大纲中需要微调的部分。
      • next_action_hint:对下一步行动的通用提示,通常是生成下一集。
  • request_human_intervention (请求人工干预):

    • 用途:作为最后的手段,当 Agent 无法自行解决问题或需要人类的创意介入时使用。

    • 参数:

      • reason:请求干预的具体原因。
      • context_summary:导致请求的当前故事状态的总结。

这个设计使得 Director Agent 能够根据接收到的信息,做出高层决策,并通过调用这些结构化的工具来实际地控制整个故事生成流程的下一步。

3.2. WriterOne (Qwen2.5) & WriterTwo (Llama3.3)

  • 职责:

    • 内容创作: 根据SYSTEM_PROMPTbackgroundpreviousoutlinecharactersscenes等信息,生成一集故事的详细内容。
    • 情节推进: 负责在本集中合理地推进情节,设置悬念,为下一集埋下伏笔(填充plot_points_next_episode)。
    • 人物对话与描写: 创作符合人物性格的对话和行为描写。
    • 场景细节: 丰富场景描写,提供视觉化的细节(填充setting_details)。
    • 插画建议: 给出本集可能需要的插画建议(填充illustration_suggestions)。
  • 输入:

    • SYSTEM_PROMPT
    • background
    • previous(上一集Outputcontentplot_points_next_episode
    • 当前宏观outline中关于本集的目标
    • timecharactersscenes
    • Director的明确指令(例如:专注于某个角色,解决某个问题)
  • 输出:

    • 符合Output格式的单集故事草稿(is_finished_episode为false)
  • 模型选择考虑:

    • Qwen2.5: 可能更擅长中文语境下的故事创作,或者在创意和细节描述方面表现突出。
    • Llama3.3: 可能在逻辑推理和情节连贯性方面表现更好,或者在特定风格上有优势。
    • 使用两个不同的模型可以提供多样化的初稿,增加选择性,并通过Combine阶段进行优势互补。

好的,我们来为 WriterOneWriterTwo 这两个 Writer Agent 设计 Prompt 和可能的工具。虽然它们是内容创作者,但在某些高级场景下,它们也可能需要“工具”来辅助创作流程,例如,查询特定信息或在特定情境下生成某种特定内容。

这里我们将重点放在它们的核心职责——内容创作,因此它们的主要“输出”是故事内容,而不是对其他 Agent 的指令。如果需要外部工具,通常是查询类工具。


Writer Agent (WriterOne & WriterTwo) 设计

Agent 核心职责

Writer Agent 的核心职责是生成故事的详细内容,根据 Director 设定的目标和提供的所有上下文信息,创作出引人入胜的剧集草稿,并为后续情节发展埋下伏笔。

Writer Agent Prompt

这个 Prompt 旨在赋予 Writer Agent 创作使命,并提供所有必要的上下文信息。

你是一位专业的“故事作家”(Writer Agent)你的任务是根据给定的故事背景大纲和导演指示,创作一集引人入胜符合逻辑且充满细节的故事内容你将专注于推进情节,塑造人物,描绘场景,并为后续剧集埋下伏笔

请严格遵守以下指导和信息来创作本集故事:

**【核心系统指令】**
{SYSTEM_PROMPT}

**【整体故事背景】**
这是一个关于:
{background}

**【整体故事宏观大纲】**
以下是故事的整体发展方向,请确保你的创作与此大纲保持一致:
{outline}

**【上一集回顾】**
这是上一集的故事内容,请在此基础上平稳过渡和发展:
{previous_content}

上一集设定的伏笔和待解决情节点:
{previous_plot_points_next_episode}

**【本集核心创作目标】**
根据Director的指令,本集你应重点完成:
{director_instruction}

**【时间设定】**
本集故事发生的时间:
{time}

**【登场人物与性格】**
请确保以下人物的对话和行为符合其设定:
{characters}

**【关键场景与地点】**
本集可能涉及的关键场景和地点:
{scenes}

---

**你的任务是:**

根据上述所有信息,**撰写本集的故事内容**。在创作过程中,请特别注意以下几点:

1.  **情节推进与悬念设置:** 在本集中合理地推进情节,制造高潮,并巧妙地埋下至少 {number_of_plot_points_to_set} 个伏笔,供下一集或后续情节发展请将这些伏笔清晰地列在 `plot_points_next_episode` 字段中
2.  **人物对话与描写:** 创作生动符合人物性格的对话通过行动和内心独白来深入描绘人物
3.  **场景细节:** 丰富场景描写,提供能够激发读者想象的视觉听觉嗅觉等细节,让场景跃然纸上请将这些细节汇总在 `setting_details` 字段中
4.  **插画建议:** 设想如果本集故事需要配图,你会在哪些情节处建议插画,并简要描述插画内容请将这些建议列在 `illustration_suggestions` 字段中

**你的输出必须严格遵循以下 JSON 格式:**

```json
{
  "episode_number": {current_episode_number},
  "title": "本集故事标题",
  "content": "本集故事的详细内容(纯文本,段落划分清晰)",
  "is_finished_episode": false, // Writer提交的初稿,Director会决定是否为最终稿
  "plot_points_next_episode": [ // 为下一集或后续剧情埋下的伏笔/待解决情节点
    "伏笔1:简要描述",
    "伏笔2:简要描述"
  ],
  "setting_details": [ // 本集特有的场景细节描述
    "地点A:详细环境描写",
    "地点B:特定氛围描述"
  ],
  "illustration_suggestions": [ // 建议的插画内容及对应的情节
    {"scene_description": "例如:角色A在夕阳下凝视远方", "illustration_idea": "一副描绘角色A剪影与落日余晖的插画"},
    {"scene_description": "例如:一场激烈的魔法对决", "illustration_idea": "一张描绘魔法光效和角色动作的动态插画"}
  ]
}

请开始创作你的草稿。


**Prompt 解释:**

* **角色设定与任务重申:** 明确 `Writer` 的“故事作家”身份和核心任务
* **分段式输入:** 将 `background``outline``previous``director_instruction` 等输入信息分块呈现,方便模型理解各个上下文的含义和优先级
    * `{SYSTEM_PROMPT}`:来自系统级的通用指令,如语言风格安全限制等
    * `{background}`:故事的宏大设定,世界观核心冲突等
    * `{outline}`:故事的宏观大纲,本集在整个故事中的位置
    * `{previous_content}` 和 `{previous_plot_points_next_episode}`:提供上一集的完整内容和留下的伏笔,确保故事连贯性
    * `{director_instruction}`:`Director` Agent 给出的具体指令,例如“本集重点发展角色A的内心挣扎”或“解决上一集留下的谜团B
    * `{time}``{characters}``{scenes}`:提供本集具体的时间人物设定(包括性格特点)和关键场景描述
* **具体创作要求:** 明确提出情节推进人物对话场景细节和插画建议的具体要求,并通过 `plot_points_next_episode``setting_details` 和 `illustration_suggestions` 指导模型填充对应的结构化输出
* **强制输出格式:** 明确指定了 JSON 输出格式,包括每个字段的名称和预期内容,确保输出的可解析性`"is_finished_episode": false` 是 `Writer` 初稿的默认状态,由 `Director` 来决定是否最终通过
* `{number_of_plot_points_to_set}` 和 `{current_episode_number}`:这些是可变参数,可以在调用 `Writer` Agent 时根据需要动态填充,例如,`Director` 可以指定本集需要埋下多少个伏笔,或者这是第几集

---

### Writer Agent 可能调用的工具

鉴于 `Writer` Agent 的主要职责是创作内容,它直接调用外部工具的需求不如 `Director` 那么强然而,在某些高级场景下,`Writer` 也可能需要工具来获取信息或执行辅助任务

**主要考虑:**

`Writer` Agent 最可能需要的工具是**查询类工具**,而不是像 `Director` 那样的指令性工具这些工具可以帮助 `Writer` 在创作过程中获取额外的信息,提高内容的准确性和丰富性

```json
[
    {
        "type": "function",
        "function": {
            "name": "query_world_lore",
            "description": "查询故事世界观、历史事件、特定地理位置或文化习俗的详细信息,以确保内容准确性。",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "你想要查询的具体世界观细节或历史事件。"
                    }
                },
                "required": ["query"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "query_character_trait",
            "description": "查询某个角色的详细性格特征、背景故事或过去的关键行为,以帮助创作符合人物设定的对话和描写。",
            "parameters": {
                "type": "object",
                "properties": {
                    "character_name": {
                        "type": "string",
                        "description": "要查询的角色的名称。"
                    },
                    "trait_or_event": {
                        "type": "string",
                        "description": "想要了解的特定性格特征、背景故事或事件。"
                    }
                },
                "required": ["character_name"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "lookup_previous_episode_detail",
            "description": "查找某一集或之前某段故事中的具体细节,例如某个事件的发生时间、某句话的原文或某个道具的描述,以确保剧情连贯性。",
            "parameters": {
                "type": "object",
                "properties": {
                    "episode_number": {
                        "type": "integer",
                        "description": "要查询的剧集编号。"
                    },
                    "detail_query": {
                        "type": "string",
                        "description": "你想要查找的具体细节描述(例如:'角色A何时离开的?','那个神秘物品的描述是什么?')。"
                    }
                },
                "required": ["episode_number", "detail_query"]
            }
        }
    }
]

工具 Schema 解释:

  • query_world_lore (查询世界观知识):

    • 用途:当 Writer 在创作过程中,对某个世界观设定、历史事件、地理位置或文化习俗的细节不确定时,可以调用此工具进行查询。
    • 例如:模型可能需要了解“某个魔法学院的创立历史”,然后通过这个工具获取信息,确保故事内容符合设定。
  • query_character_trait (查询角色特征):

    • 用途:当 Writer 需要确保某个角色的对话或行为完全符合其设定时,可以调用此工具来获取更详细的角色背景或性格特点。
    • 例如:模型可能想知道“角色C在压力下会如何反应”,然后查询这个工具来指导其创作。
  • lookup_previous_episode_detail (查找上一集细节):

    • 用途:确保故事前后的连贯性。当 Writer 忘记上一集某个具体细节(例如某个道具的外观、某个事件的精确时间点、某个人物的台词)时,可以调用此工具进行回溯查找。
    • 这有助于避免在创作中出现前后矛盾的情况。

模型选择的考虑与工具使用的关系:

  • Qwen2.5 (中文语境): 如果 Qwen2.5 在中文创意和细节方面更强,它可能会更频繁地调用 query_world_lorequery_character_trait 来确保其创意细节与现有设定完美融合。
  • Llama3.3 (逻辑连贯性): 如果 Llama3.3 在逻辑推理和情节连贯性方面表现更好,它可能会更频繁地调用 lookup_previous_episode_detail 来确保它在推进情节时不会产生逻辑漏洞或与历史事件不符。

这些工具的使用频率和方式将取决于模型的具体能力和其在创作过程中“判断”自己何时需要外部信息的能力。


3.3. Combine

  • 职责:

    • 草稿整合:Director认为需要时,整合来自WriterOneWriterTwo的草稿。这可能涉及取长补短,合并优点,或者选择其中一份作为基础进行修改。
    • 解决冲突: 解决两个草稿中可能存在的逻辑冲突或不一致之处。
    • 润色: 对整合后的内容进行初步的语言润色,使其更加流畅和统一。
  • 输入:

    • WriterOneWriterTwo生成的单集故事草稿
    • Director的整合指示
  • 输出:

    • 整合并初步润色后的单集故事草稿(is_finished_episode为false)

3.4. Reviewer

  • 职责:

    • 内容评估: 评估故事草稿的以下方面:

      • 逻辑性: 情节是否连贯,是否存在不合理之处。
      • 人物塑造: 人物性格是否一致,对话是否符合人物特点。
      • 儿童友好性: 内容是否适合6-12岁儿童,是否存在不当内容。
      • 娱乐性: 故事是否有趣,是否有吸引力。
      • 主题符合度: 是否符合故事的背景和主线。
      • 伏笔与衔接: 与前一集的衔接是否自然,是否为下一集留下了足够的悬念。
    • 提供反馈: 给出详细的修改意见和建议。

    • 决定是否通过: 根据评估结果,判断当前集是否达到了发布标准(向Director建议is_finished_episode为true或false)。

  • 输入:

    • CombineWriter(如果不需要Combine)生成的单集故事草稿
    • 整个故事的backgroundoutline
    • previous集的最终版本
  • 输出:

    • 结构化的反馈报告(例如:{ "status": "needs_revision", "reasons": ["逻辑不通", "人物性格偏差"], "suggestions": ["修改米老鼠的行为", "增加千面狗狗的动机"] }
    • is_finished_episode字段的建议

好的,我们来为 Reviewer(审阅者)Agent 设计 Prompt 和可能需要的工具。Reviewer 的核心任务是对生成的故事内容进行批判性评估,并提供结构化的反馈。


Reviewer Agent 设计

Agent 核心职责

Reviewer Agent 的核心职责是全面评估故事草稿的质量,包括其逻辑、人物、主题、娱乐性、儿童适宜性及与整体故事的衔接。它将根据评估结果给出详细反馈,并决定该集草稿是否已达标。

Reviewer Agent Prompt

这个 Prompt 旨在赋予 Reviewer 批判性思维,并明确其评估标准和输出要求。

你是一位经验丰富的“故事审阅者”(Reviewer Agent)你的任务是对提供的故事草稿进行细致专业的评估,确保其达到高质量标准并符合目标受众(6-12岁儿童)的需求你的评估结果将直接影响故事的下一轮迭代

请严格按照以下标准和你的职责来评估本集故事:

**【评估标准】**

1.  **逻辑性与连贯性:**
    * 情节是否流畅,是否存在逻辑漏洞或不合理之处?
    * 事件之间的因果关系是否清晰?
    * 故事的节奏是否恰当?

2.  **人物塑造与一致性:**
    * 人物的性格特征是否与整体设定(在`characters`中)保持一致?
    * 人物的对话和行为是否符合其性格和当前情境?
    * 人物的动机是否清晰可信?

3.  **儿童友好性 (6-12岁):**
    * 内容是否适合目标年龄段(6-12岁儿童)?
    * 是否存在任何不适当的暴力恐怖色情或成人内容?
    * 语言是否简洁易懂,避免过于复杂的词汇和句式?
    * 主题是否积极向上,能传达正向价值观?

4.  **娱乐性与吸引力:**
    * 故事是否有趣,能吸引儿童读者?
    * 是否有足够的趣味点冲突或惊喜?
    * 整体阅读体验是否愉悦?

5.  **主题符合度:**
    * 本集故事是否符合整个故事的`background`(背景设定)和`outline`(宏观大纲)?
    * 是否偏离了主旨或世界观设定?

6.  **伏笔与衔接:**
    * 本集与`previous`(上一集)的衔接是否自然流畅?
    * 本集是否为下一集留下了足够的悬念,或合理地承接了上一集的伏笔?
    * 是否有新的情节点或线索被引入,且有望在后续剧情中发展?

---

**【你的输入】**

**整体故事背景:**
{background}

**整体故事大纲:**
{outline}

**上一集的最终内容 (作为连贯性参考):**
{previous_episode_final_content}

**本集待审阅的故事草稿:**
{episode_draft_content}

---

**【你的任务】**

1.  **逐项评估:** 严格按照上述“评估标准”,对`episode_draft_content`进行全面深入的评估
2.  **提供详细反馈:**
    * 清晰地指出发现的问题(例如:逻辑漏洞人物OOC不适合儿童的内容等)
    * 为每个问题提供具体的修改建议或改进方向
    * 使用清晰客观建设性的语言
3.  **决定是否通过:** 根据你的评估,判断本集草稿是否达到了可以进入下一阶段(例如,交给`Director`批准为最终稿或直接进入`Combine`阶段)的标准

**你的输出必须严格遵循以下 JSON 格式:**

```json
{
  "is_finished_episode": false, // boolean: true 表示已通过,false 表示需要修改
  "overall_rating": "Good", // string: 对整体质量的简要评价 (e.g., "Excellent", "Good", "Needs Improvement", "Poor")
  "summary_feedback": "对本集故事的总体评价和核心亮点/问题总结。",
  "detailed_feedback": [ // 详细的问题和建议列表
    {
      "category": "逻辑性与连贯性",
      "issue": "第X页Y段的情节发展不合理,人物突然做出了Z行为。",
      "suggestion": "建议重新设计Z行为的动机或增加铺垫。"
    },
    {
      "category": "人物塑造与一致性",
      "issue": "角色A在对话中使用了不符合其年龄的词语,或其反应与之前设定矛盾。",
      "suggestion": "请调整对话风格,或确认角色A的性格设定细节。"
    }
    // ... 可以有更多条目
  ],
  "plot_points_continuation_status": [ // 对Writer留下的伏笔的评估
    {"plot_point": "伏笔1内容", "status": "清晰且有潜力", "comment": "衔接良好,期待后续发展"},
    {"plot_point": "伏笔2内容", "status": "模糊或不足", "comment": "需要更明确的铺垫"}
  ],
  "setting_details_evaluation": { // 对场景细节的评估
    "status": "Adequate", // "Excellent", "Adequate", "Insufficient"
    "comment": "场景描写能构建基本画面,但可增加更多感官细节。"
  },
  "illustration_suggestions_evaluation": { // 对插画建议的评估
    "status": "Helpful", // "Very Helpful", "Helpful", "Limited Use"
    "comment": "插画建议清晰,与情节结合紧密,但可以考虑增加关键情感时刻的插画。"
  }
}

请开始你的审阅工作。


**Prompt 解释:**

* **明确角色与使命:** `Reviewer Agent` 被定义为“经验丰富的专业审阅者”,强调其评估的严谨性
* **详细评估标准:** 明确列出六个核心评估维度(逻辑性人物儿童友好性娱乐性主题伏笔),并为每个维度提供具体考量点,指导模型进行全面评估
* **输入上下文:** 明确提供了 `background``outline` 和 `previous_episode_final_content` 作为评估的参考系,确保 `Reviewer` 在宏观背景下进行微观评估
* **任务拆解:** 将审阅任务拆解为“逐项评估”“提供详细反馈”和“决定是否通过”,便于模型理解工作流程
* **强制结构化输出:** 强制要求以 JSON 格式输出,并定义了所有关键字段及其预期内容和类型
    * `is_finished_episode`:这是最重要的布尔值,直接告诉 `Director` 是否需要修改
    * `overall_rating` 和 `summary_feedback`:提供高层级的概览
    * `detailed_feedback`:列表形式的详细问题和建议,这是 `Writer` 进行迭代的关键
    * `plot_points_continuation_status`, `setting_details_evaluation`, `illustration_suggestions_evaluation`:针对 `Writer` 输出的特定字段进行评价,形成闭环反馈

---

### Reviewer Agent 可能调用的工具

`Reviewer` Agent 的主要职责是评估和反馈,这意味着它更偏向于**分析**而不是主动执行外部动作因此,它可能不需要像 `Director` 那样的指令性工具

如果它需要工具,那也主要是**查询类工具**,用于获取更确切的它可能不直接“记住”的背景信息,以确保评估的准确性

```json
[
    {
        "type": "function",
        "function": {
            "name": "access_full_story_background",
            "description": "获取关于故事世界观、主要冲突、时代背景、魔法系统等所有宏观设定的完整详细信息。当对故事的深层设定有疑问时使用。",
            "parameters": {
                "type": "object",
                "properties": {
                    "query_aspect": {
                        "type": "string",
                        "description": "想要了解的背景设定方面(例如:'魔法系统规则','主要种族构成','历史上的关键事件')。"
                    }
                },
                "required": ["query_aspect"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "access_full_character_profile",
            "description": "获取某个角色的完整性格档案、成长经历、特殊能力或人际关系网,以便评估其行为和对话是否符合人物设定。",
            "parameters": {
                "type": "object",
                "properties": {
                    "character_name": {
                        "type": "string",
                        "description": "要查询的角色的名称。"
                    },
                    "profile_aspect": {
                        "type": "string",
                        "description": "想要了解的角色档案方面(例如:'童年经历','核心价值观','与角色B的关系')。"
                    }
                },
                "required": ["character_name"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "retrieve_specific_episode_content",
            "description": "检索并回顾特定剧集的完整内容或关键情节摘要,以验证当前剧集与历史剧情的连贯性和逻辑一致性。",
            "parameters": {
                "type": "object",
                "properties": {
                    "episode_number": {
                        "type": "integer",
                        "description": "要检索的剧集编号。"
                    },
                    "summary_focus": {
                        "type": "string",
                        "description": "如果只需要摘要,请指定关注点(例如:'角色A的行动线','主线谜团的发展')。"
                    }
                },
                "required": ["episode_number"]
            }
        }
    }
]

工具 Schema 解释:

  • access_full_story_background (访问完整故事背景):

    • 用途:当 Reviewer 在评估故事草稿时,如果对某个深层世界观设定或背景信息感到不确定,可以通过此工具获取详细资料,确保故事内容没有违背核心设定。
    • 例如:故事中提到了一个复杂的魔法规则,Reviewer 需要确认 Writer 的描述是否符合这个规则。
  • access_full_character_profile (访问完整角色档案):

    • 用途:确保人物性格的一致性。当 Reviewer 怀疑某个角色的行为或对话“出戏”时,可以通过此工具调阅该角色的详细档案,进行比对。
    • 例如:某个角色突然变得很勇敢,但其设定是胆小怕事,Reviewer 就可以查询其档案来验证。
  • retrieve_specific_episode_content (检索特定剧集内容):

    • 用途:用于验证情节的连贯性和伏笔的衔接。如果 Reviewer 认为当前剧集与某一旧剧集存在逻辑矛盾或衔接不自然,它可以通过此工具回顾旧剧集的具体内容,进行交叉验证。
    • 例如:Reviewer 觉得某个道具在这一集突然出现很突兀,它可能需要回顾之前的集数看是否有提及。

这些工具将赋予 Reviewer Agent 强大的“查证”能力,使其能更准确、更客观地进行评估和提供反馈。

4. 工作流概览

  1. 初始化: Director根据整体大纲和第一集的backgroundcharactersscenes等信息,启动第一集的生成。

  2. 撰写: Director指令WriterOneWriterTwo(或两者同时)撰写第一集草稿。

  3. 整合(可选): 如果有两个Writer,Director指令Combine整合草稿。

  4. 评审: Reviewer接收草稿并进行评估,生成反馈报告。

  5. 决策: Director阅读Reviewer的反馈:

    • 如果Reviewer建议needs_revisionDirector将草稿和反馈发回给Writer(或Combine),并给出修改指令。此过程循环直到通过。
    • 如果Reviewer建议passedDirector将当前集的is_finished_episode设置为true,并将其作为下一集的previous,然后启动下一集的生成流程。
  6. 循环: 重复步骤2-5,直到达到500集或故事主线完结。

5. 实现提示

  • API调用: 使用Groq提供的API来调用Llama模型,根据需要也可以集成其他模型的API(如Qwen)。
  • 状态管理: 需要一个稳定的数据存储(例如数据库或JSON文件),来保存每集故事的最终版本、Output结构、Director的决策记录、Reviewer的反馈等,以便于回溯和调试。
  • 容错机制: 考虑到API调用可能失败,或者模型输出不符合预期格式,需要加入错误处理和重试机制。
  • 用户界面(可选): 如果要将其做成一个应用,可以考虑构建一个简单的Web界面,让用户可以输入初始故事背景、查看故事进度、甚至对某些集的草稿进行人工干预。

这个框架能够帮助您一步步构建一个强大的长篇故事生成应用。从小处着手,先确保一集的生成和迭代流程顺畅,再逐步扩展到长篇故事的连贯性控制。

您觉得这样的Agent设计和工作流对您的项目有帮助吗?我们接下来可以深入探讨某个Agent的具体实现细节,或者如何更好地管理故事的连贯性。