变量提示词#

变量提示词由三个部分组成:

变量列表

变量的当前值是多少、意义是什么?

变量更新规则

变量在什么情况下应该被更新、更新成什么值?

变量更新格式

AI 应该输出什么来更新变量?

这些都只是提示词, 写法只取决于你的想象. 以下只是给你一个概念, 请不要照抄.
这些都只是提示词, 写法只取决于你的想象. 以下只是给你一个概念, 请不要照抄.
这些都只是提示词, 写法只取决于你的想象. 以下只是给你一个概念, 请不要照抄.
你可以在门之主写卡助手中使用我的变量提示词模板, 另外有络络的手写 MVU 变量卡教你怎么写, 但我每张卡其实都使用了不同的变量提示词写法:

  • 所有变量提示词都在 D1

  • 补充一个 D0 recall 来稳定格式

../../../../_images/%E5%8F%98%E9%87%8F%E6%8F%90%E7%A4%BA%E8%AF%8D_%E6%97%A5%E8%AE%B0%E7%BB%9C%E7%BB%9C.png

变量列表#

如果需要 AI 更新变量, 则我们需要按照正确的变量结构在提示词里列出变量.

我的推荐做法是, 将需要 AI 更新的变量按结构一一列举出来, 利用变量的名称和 # 注释 来解释变量的意义:

---
角色:
  络络:
    好感度: {{get_message_variable::stat_data.角色.络络.好感度}} # 0-100
    心情: {{get_message_variable::stat_data.角色.络络.心情}} # 仅有开心、难过、哭泣、生气四种心情
  青空莉:
    好感度: {{get_message_variable::stat_data.角色.青空莉.好感度}}
    心情: {{get_message_variable::stat_data.角色.青空莉.心情}}
世界:
  日期: {{get_message_variable::stat_data.世界.日期}}
  时间: {{get_message_variable::stat_data.世界.时间}}

但是像好感度一类变量, 我们可能需要在另一个条目中更详细地解释其意义; 想必你见过我的角色阶段写法:

---
角色阶段:
  descritpion: 角色阶段基于各角色的`角色关键信息`和`角色详情`词条,描述了经过剧情发展后角色成长得到的新人设
  associated variable: 各角色的阶段关联有不同的变量,仅用于判断其角色阶段是否应该发生变化,不影响阶段的具体人设
  行为指导: 角色在这个阶段会采取的行为
  变化倾向: 随着associated variable接近下一阶段,角色逐渐发生的变化
心爱:
  associated variable: 心爱.好感度(<%= getvar('stat_data.心爱.好感度') _%>)
  stage name:
    阶段1: 羞涩抗拒(24以下)
    阶段2: 欲拒还迎(25~49)
    阶段3: 共犯默契(50~74)
    阶段4: 沉沦释放(75~99)
    阶段5: 灵肉相许(100以上)
  羞涩抗拒:
    行为指导:
      - 露出时总是躲在哥哥身后,却又嘴硬说不需要保护
      - ...
    变化倾向:
      - 在拍摄时尝试更富表现力的构图,但仍避免自己入镜
      - ...
  ...
  灵肉相许:
    行为指导:
      - ...

提示词中 associated variable (关联变量) 一般是好感度. 这段角色阶段即是列出了变量的当前值, 并用一大段提示词来解释变量在不同区间下的意义.

变量列表不能随意列举, 否则可能出现 AI 上一楼才更新了变量, 下一楼又更新变量的情况.
为了让 AI 知道变量列表中的值是最新的, 你有几种选择:

  • 将变量列表放在 D1, 这样的变量列表会置于之前所有 AI 输出之后 (也就是最新剧情之后), 因此 AI 能直接理解它是最新的

  • 将变量列表放在 D4 等位置, 然后精心设计变量更新格式及分析思维链提示词:

    • 告诉 AI 发送给它的变量是最新的: 一般变量列表会用 xml 标签包裹, 因此可以告诉 AI <标签> 里的变量是最新的, 甚至让 AI 在变量更新思维链里列一遍 我已经知道 `<标签>` 中的变量是最新的

    • 让 AI 仅基于当前回复更新变量: 玄学点可以在变量更新思维链里加一个 仅根据当前回复而不是之前的剧情来分析每个变量是否需要更新

  • (应最有效但很占 token) 取消对变量更新的“仅格式提示词”正则, 把变量更新情况发给 AI, 这样 AI 能知道变量更新过了; 为了减少 token, 你可以单独为变量更新中的思维链做一个“仅格式提示词”正则, 仅保留变量更新命令 (_.set(...) 等) 发给 AI

变量更新规则#

一些简单的变量可以直接由 AI 根据名称来理解如何更新, 无须专门编写变量更新规则提示词.

但你可能想对好感度一类变量自己限定一些更新规则:

---
角色:
  络络:
    好感度: {{get_message_variable::stat_data.角色.络络.好感度}} # 0-100
    心情: {{get_message_variable::stat_data.角色.络络.心情}} # 仅有开心、难过、哭泣、生气四种心情
  青空莉:
    好感度: {{get_message_variable::stat_data.角色.青空莉.好感度}}
    心情: {{get_message_variable::stat_data.角色.青空莉.心情}}
check:
  - 如果角色注意到了<user>的行为,根据他们的态度将'好感度'更新±(1~4)

或者更复杂地, 专门解释各种变量的类型、范围和更新要求:

---
变量更新规则:
  好感度:
    type: number
    range: 限定于0~100之间,如果达到了100则不再变化
    check: 如果角色注意到了<user>的行为,根据他们的态度将'好感度'更新±(1~4)
  药物依赖度:
    type: number
    range: 0~100
    check:
      - 每8分钟提升1点艾莉卡的药物依赖度
      - 每15分钟提升1点伊薇特和伊丽莎白的药物依赖度
      - 如果她们被注射苍白之夜,将她们的药物依赖度清零
  背包:
    type: |-
      z.array(z.object({
        物品: z.string(),
        数量: z.number().min(1).describe('物品数量少于1时应该移除物品'),
      }));
    

我的变量更新规则有一个核心字段——check. 通过它, 我们可以在其他提示词中引用变量更新规则, 例如 为我原封不动地输出好感度对应的`check`. (你可以在 组合和命名提示词中看到对这种写法更详细的解释.)

这样能够引用变量更新规则有什么用呢? 再回忆一下变量提示词:

变量列表

变量的当前值是多少、意义是什么?

变量更新规则

变量在什么情况下应该被更新、更新成什么值?

变量更新格式

AI 应该输出什么来更新变量?

变量之所以得到更新, 是因为 AI 根据变量更新格式输出了 MVU 所规定的 _.set(...) 等更新命令; 但就像 AI 可能在正文中出现常识、逻辑等错误, 它当然可能在更新变量时出现错误: 忘记更新某个变量、没按照要求正确更新某个变量……

我们是如何尽量避免 AI 在正文中出错的呢? 一些预设会提供思维链, 要求 AI 先在思维链里“打草稿”再输出正文, 从而提升正文的质量.
类似地, 我们也可以在 AI 输出实际的 _.set(...) 等更新命令之前, 要求 AI 先“打草稿”. 而这时, 我们就可以引用变量更新规则, 要求 AI 基于变量对应的`check`分析应该如何更新变量.

反过来说, 既然我们会在变量输出格式中引用变量更新规则, 那它就没必要放在 D1 这样占据注意力的位置, 而完全可以将它置于 D4 等位置——反正 AI 在输出变量更新前会在变量更新思维链里先回想它.

变量更新格式#

就像络络手写 MVU 变量卡教程中所说, AI 输出和用户输入中任意位置的 _.set(...) 都会被 MVU 脚本读取, 因此变量更新其实并没有固定的格式, 没必要必须放在 <UpdateVariable> 之类的块中统一更新.

但一般而言, 你会用上我在 2024/11/21 设计的一类变量更新格式提示词. 它最初的版本其实没有复杂思维链, 只在尾部有一个 reason 要求 AI 分析变量为什么该更新:

---
变量更新格式:
  rule: 你必须在每次回复的最底部,输出<UpdateVariable>包裹的变量更新命令
  format: |-
    <UpdateVariable>
    _.set('${path}', ${old value}, ${new value}); // ${reason}
    ...
    </UpdateVariable>

后来为了让 AI 更愿意更新变量, 我加入了思维链, 即 <Analysis> 块. 思维链不一定要在 AI 输出的开头, 这里的 <Analysis> 也是思维链, 即在实际输出前让 AI 先打草稿.

---
变量更新格式:
  rule: 你必须在每次回复的最底部,输出<UpdateVariable>包裹的变量更新命令
  format: |-
    <UpdateVariable>
    <Analysis>
    某些思维链...
    </Analysis>
    _.set('${path}', ${old value}, ${new value}); // ${reason}
    ...
    </UpdateVariable>

我喜欢加上的思维链项目有:

计算剧情时间变化#
- ${计算经过的时间: ...}
允许变量因剧情而发生剧烈变动 (好感度从 100 直接掉到 0)#
- ${根据当前情节是否足够特殊、时间跨度是否远超正常情况,判断是否允许变量值发生戏剧性变化: yes/no}
回忆变量更新所需的 check, 据此分析该如何更新#
- ${基于变量对应的`check`,仅根据当前回复而不是之前的剧情来分析每个变量是否需要更新: ...}

思维链或者所有提示词怎么写完全由你自己说了算, 你也许会得到:

不为变量编写任何 check 规则, 而是直接让 AI 自己搞定:

<update>
<update_analysis>$(IN ENGLISH, no more than 80 words)
- ${calculate time passed: ...}
- ${decide whether dramatic updates are allowed as it's in a special case or the time passed is more than usual: yes or no}
- ${what variables should be updated, accoring only to current reply instead of previous plots: ...}
</update_analysis>

_.set('${path}', ${old}, ${new}); // ${reason}
...
</update>

此外, 变量更新格式说白了也是额外输出格式, 因此完全可以放在 D4 而在 D1/D0 用变量更新格式强调来保证 AI 输出.