额外输出格式#

我们会经常遇到不仅需要 AI 理解提示词, 还需要 AI 按要求输出内容的情况, 例如思维链、时间框、摘要总结、文字状态栏、变量更新格式等. 但输出内容中, 有的部分是应该原封不动输出出来的, 有的部分则是需要 AI 根据要求填充的.

为了让 AI 更好区分这些, 我研究了一套针对额外输出格式的提示词写法.

特殊语法#

为了区分哪些是 AI 应该原封不动输出的格式, 哪些是 AI 需要根据要求填充的格式, 我采用了 AI 能听懂的几种特殊语法:

  • ${描述}: AI 需要根据 "描述" 将它替换为对应的内容. 例如衣着: ${具体描述角色当前衣着} 可能输出衣着: 粉金色宽松T恤睡裙;

  • /*要求*/: AI 仅会听从 "要求" 而不对它进行输出. 例如 /*以下内容应该按英文输出*/ 会让 AI 更倾向于用英文输出之后的内容;

  • ...: AI 需要仿照之前给定的规则和内容补充输出. 例如其他角色: ... 会让 AI 根据前面给定的络络输出格式, 补充其他角色的输出;

  • 其他内容原封不动地进行输出.

以角色状态栏为例, 我们可以这样写:

■ ${角色名称,仅显示当前剧情中占比最多的一名角色}:
   心情: ${用↑↓→来表示角色对<user>的好感度变化}(${变化原因})
   衣着: ${具体描述角色当前衣着,最多20字}
   身体: ${具体描述,注重人体每个部位的细节描写,包括声、形、色、味、感的整体表现,赋予真实体验感。用词淫靡,不低于40字,不超过60字}
   行动: ...
   计划: ...

■ 周围角色:
   - ${周围某个没有和<user>互动的角色}: ${简要描述这个角色正在做什么}

则 AI 可能输出:

■ 心语:
   心情: →(观望姐姐)
   衣着: 粉金色宽松T恤睡裙
   身材: 修长美腿随意交叠,浑圆的臀部若隐若现,琥珀色眼眸中闪烁着狡黠的光芒,嘴角挂着意味深长的笑容
   行动: 思考姐姐的反常
   计划: 暗中观察姐姐的动向

■ 周围角色:
   - 千枝子: 准备就寝

整体格式#

而为了让 AI 知道某部分提示词是要用于输出的, 我采用 format: |- 来标记:

---
状态栏:
  rule: 你必须在回复末尾插入<status_block>块来显示状态栏
  format: |-
    <status_block>
    ■ ${角色名称,仅显示当前剧情中占比最多的一名角色}:
       心情: ${用↑↓→来表示角色对<user>的好感度变化}(${变化原因})
       衣着: ${具体描述角色当前衣着,最多20字}
       身体: ${具体描述,注重人体每个部位的细节描写,包括声、形、色、味、感的整体表现,赋予真实体验感。用词淫靡,不低于40字,不超过60字}
       行动: ...
       计划: ...

    ■ 周围角色:
       - ${周围某个没有和<user>互动的角色}: ${简要描述这个角色正在做什么}
    </status_block>

这里, 我将状态栏用 <status_block> 块包裹, 便于我们可能希望用正则处理状态栏. 例如用 最小深度: 8仅格式提示词 正则将状态栏替换为空, 从而不发送过早的状态栏, 节省 token 和 AI 注意力.

考虑插入深度#

在此我给的状态栏例子比较简单, 但你可能需要输出露出系统Galgame 界面等更为复杂的格式.

我们显然不希望将这些东西一股脑插入到 D1/D0, 这很容易让 AI 失去对末尾剧情的连贯理解.

为此, 通常的做法是, 将完整的输出提示词放在 D4 等位置, 而在 D1/D0 位置仅利用输出格式的 <tag> 来提醒 AI 输出:

---
状态栏强调:
  rule: 你必须在回复末尾插入<status_block>块来显示状态栏
  format: |-
    <status_block>
    ...
    </status_block>

嵌套输出内容#

${描述} 不仅可以是文字描述, 还可以是其他提示词.

假设我们要实现多角色状态栏, 每个角色不仅有共同的 "好感度"、"衣着" 等内容, 还可能在状态栏中有自己独有的信息. 通过我的提示词写法, 你会很容易写出这样的状态栏:

---
状态栏:
  rule: 你必须在每次回复的最底部,输出<status_block>包裹的状态栏
  format:
    basic: |-
      <status_block>
      <character>
      名称: ${角色名称}
      心情: ${用↑↓→来表示角色对<user>的好感度变化}(${变化原因})
      衣着: ${具体描述角色当前衣着,最多20字}
      ${special status}
      </character>
      ...
      </status_block>
    special status:
      心爱: |-
        路人视角: ${考虑穿着、外在遮掩和角度,来判断非<user>角色能够看到什么样子的心爱}
        露出程度: ${当前露出程度数值}
      心语: |-
        约会模拟次数: ${约会模拟次数}

上面的提示词中, 我们在 basic 部分定义所有角色共同的状态栏内容, 而在 special status 部分定义每个角色独有的状态栏内容. basic 内我们用 ${special status} 来引用 special status 部分内容, 从而指示 AI 输出.

我在妹妹请求你保护她露出中就是这么做的.