SillyTavern 世界信息百科全书

本文译自 World Info Encyclopedia

世界信息百科全书

本页面由 kingbri 编写

kingbri, Alicat, Trappu 参与贡献

需要帮助?在 Discord 服务器上 @kingbri !我的私信已关闭。如果你想贡献内容,请联系我我,我会把你的名字加入贡献者名单!

世界信息对于为你的角色建立环境和世界至关重要。如果你计划创建一个共享世界的群聊,或者只是拥有来自同一世界观的多个角色,这一点尤其重要。

这不是一个关于如何写角色的指南。 如果你想创建一个新角色并了解 PLists 和 Ali:Chat 的基础知识,请查看 Pygmalion 的 Wiki。然后,回来这里阅读更多关于世界信息的内容。

首先,让我们澄清一些由于网络上词语误用而产生的误解:

  • 世界信息(world info,缩写 WI)是一个包含全局环境的文件。它适用于所有角色。
  • 知识书(lorebook,缩写 LB)包含角色的背景故事。它适用于与知识书相关联的特定角色。

我将把世界信息和知识书都称为 “世界信息”,因为它们在本质上具有相同的结构。除非特别指明知识书,否则 “世界信息” 等同于世界信息和知识书。

用到的的角色

要遵循本指南,你可以在此处找到一个示例世界信息和一个带有嵌入知识书的简单 PList 角色。请确保在提示时导入嵌入的知识书,或者在 SillyTavern 的角色卡面板中点击地球图标。

除非你在学习那部分,否则不要使用 PList-base 文件夹中的角色。

SillyTavern 设置

下面是一张显示世界信息各种配置选项的图片(以及编辑器):

photo20231001011243 2jpg
photo20231001011243 2jpg

这是一张显示角色知识书选择的图片(可以通过角色的选项下拉菜单访问链接到世界书):

photo20231001011243jpg
photo20231001011243jpg

基础知识

首先,你需要了解一个叫做键 / 值对的概念。每个键唯一对应一个值。多个键可以指向同一个值。当在提示词中提到该键时,值会被注入其中。

现在理解了这个概念,让我们来看一下创建键值对的各种方法。总体上有两种类型:

  • 环境 - 简单的 PList

  • 知识 - PList 和 Ali:Chat 的组合

这个结构基于 PList + Ali:Chat 角色。如果你有一个不同格式的角色,请以该格式编写值!例如,纯文本角色应该有纯文本格式的值(但这并不总是正确的。请查看高级部分了解更多信息)。

环境

这些键值对由区域和物体组成,例如地点、建筑物、地标,甚至房屋。你主要需要一个简化的 PList 描述,涵盖该区域的所有特征。

例如,来看一下 Farlandia 的一个小镇。以下是它在世界信息中的样子:

  • [Mossford(The town of Moss): town, mossy buildings, moss used for(magic, power), has(tavern, bank, inn, castle), kind people, wealthy] - 这里,Mossford 强烈关联于 / 别名为 (The town of Moss) 这个昵称 ,并包含小镇景观的 PList 条目。

对于键来说,放入任何与该地点关联的内容。例如 Mossford 的键可以是 Mossford,town,moss。尽管这些键看起来很通用,但它们都与 Mossford 相关,因此每当需要时,它们会被引入到上下文中。无需担心在逗号间加入空格,SillyTavern 会自动去除多余的空格!

如果你对一个地点只有一个词的描述,建议使用强关联。例如,仅称呼 Mossford 为小镇时,可以写成 Mossford(town),而不是浪费额外的 token 写一个完整的 PList。

知识

这些键值对可以由 PList 和 Ali:Chat 条目组成,理想情况下放置在知识书中。PList 用于通用描述,而 Ali:Chat 用于展示角色对知识书条目的看法。

角色对世界信息中的全局对象做出反应时是一个例外。由于全局对象已经有一个 PList,只有当该对象被认为非常重要时,才需要编写 Ali:Chat 反应。

以下是 Shizuru 对史莱姆(一个全局世界信息对象)的感受示例:

  • PList(来自 Farlandia 的世界信息) - [slime: enemy, slimeball, made of gelatin, bounces to move, annoyance]

  • Ali:Chat (位于 Shizuru's 的知识书中) -

    • {{user}}: Slime?
      {{char}}: "Oh... Those things." She looks down and slightly blushes in embarrassment. "I remember first fighting those things. They're so quick that it's hard to get a good strike on them." Shizuru brushes away the memory. "Anyways, let's keep going. There's more places to explore."

在这种情况下,PList 包含了一个关于史莱姆的条目,而 Ali:Chat 提供了 Shizuru 对它们的感受。对于任何其他针对特定角色的背景故事,请遵循相同的模板。

服装? 如果你希望你的角色根据场景更换服装,请在知识书中同时添加 PList 和 Ali:Chat 条目。

对于键,遵循与环境键值对相同的原则,考虑用户会使用什么来触发这个键值对的注入。对于触发史莱姆,我使用了 slime,slimes,因为当对话与史莱姆相关时就会出现这些词。开始时,PList 和 Ali:Chat 使用相同的键,但可以根据需要在任一处添加更多键。

插入位置

世界信息编辑器还提供了插入位置选项。在提示词中,有两个地方可以注入世界信息:

  • 角色定义之前 - 在角色描述之前(在故事字符串中为 wiBefore)

  • 角色定义之后 - 在角色描述之后(在故事字符串中为 wiAfter)

  • 作者注释之前 - 作者注释的顶部

  • 作者注释之后 - 作者注释的底部

  • 特定深度 - 在上下文中的特定深度,从底部开始,随着深度增加向上移动。深度越低,信息在提示词中越重要。

这些位置是根据提示词中某事物的重要性来确定的。如果你认为某事物更重要,那么将其放置在提示词的更下方。深度是最有用的选项,因为条目可以放置在任何地方。

对于 Shizuru 和 Farlandia 的世界信息,我将 PList 放置在深度为 5 的位置(在作者注释 / 角色 PList 世界信息条目之上),而 Ali:Chat 放置在 角色定义之后 的位置。

不要过度强调重要性! 作为作者,你可能认为一切对你的角色都很重要。事实并非如此,应避免这种情况以防止可能的信息泄漏。相反,考虑在与角色对话时最重要的部分。 例如,城市的描述可以放在角色描述之前,因为它不会在对话中被特别强调,但角色知道它。

扫描深度

扫描深度决定了要扫描多少聊天消息以获取世界信息。通常,应保持默认值 2,除非你希望扫描更多消息以进行注入。我使用 4

上下文百分比

世界信息在上下文中所占的最大百分比。保持默认值 25%,除非你希望世界信息在上下文注入中的最大比例更高。我使用 45%

Token 预算

如果你不喜欢使用百分比,你也可以设置世界信息的最大 Token 预算。确保将上下文百分比设置为 100%,然后从那里调整预算。

你是冒险者吗? 设置一个高扫描深度和上下文百分比 / 预算!冒险模式需要更多的世界信息,因此需要更多的预算和扫描。我使用 15 的扫描深度和 1800 的预算(随着模型上下文大小的增加,你可以增加这些值)。

禁用选择器

译者注 新版本中下面三个选项被 🔵 常量 🟢 正常 🔗 矢量化 代替,参见 SillyTavern 文档

一个条目可以标记为 常量条件禁用。在 SillyTavern 中,这些在选择下拉菜单中分别表示为绿色、黄色和红色。以下是每种颜色的含义:

  • 绿色:常量

  • 黄色:条件(依赖于键激活)。这是默认选项。

  • 红色:禁用

具体性

如果世界信息中的某个条目专注于特定角色,该怎么办?在这种情况下,主键和次键之间的下拉菜单有 ANDNOT 选项。对于 AND,此条件要求提示词中同时出现主键和次键,才能触发世界信息的注入。NOT 则相反,次键的存在将不会触发注入。让我们来看一个使用 AND 条件的示例,涉及 Shizuru 的前住所:

  • 值: [Shizuru's house: house(Japanese, traditional), located in Japan, sliding doors, tatami mats, futons, lived with {{user}}, no longer accessible]

  • 键:

    • 主键: house,home

    • 次键: your,yours,she,her,our,ours

主键和次键的包含意味着两者都必须出现才能触发条目注入。比如,句子 Let's go to your home 会触发关键词 homeyour

如果你想基于角色的名字触发条目,请将 Shizuru 添加到次键中。如果 始终将角色名称添加到提示词 选项开启,角色的名字会包含在提示词中。然而,知识书也能实现同样的效果,所以只有在你要将特定条目包含在世界信息中时才需要这样做。

替换作者注释

你可能还记得在 Pygmalion 指南中,角色的 PList 包含诸如个性和外貌等部分,通常放置在 角色的作者注释 中。有了知识书,这不再是必要的!角色 PList 现在可以放置在具有特定深度的知识书中,最棒的是,这样做可以让作者注释真正成为一个在任何提示深度添加信息的快速便捷的地方。

要实现这一点:

  • 为你的角色创建一个新的知识书(如果还没有的话)

  • 创建一个新条目并添加角色 PList

  • 将条目标记为 常量

  • 选择 深度 并设置为 4(或你之前设置作者注释的深度)

  • 将知识书与角色卡关联

  • 从 SillyTavern 导出包含嵌入知识书的角色卡

SillyTavern 会在导入角色后提示用户导入嵌入的知识书。请务必执行此操作。

现在,我将角色的个性保存在知识书条目中,并在深度为 1 的作者注释中放置 [类型; 标签; 场景]

我建议更多人切换到这种方法,因为它对最终用户来说更容易。

高级概念

这些概念是…… 进阶的。如果你掌握了基础知识,可以继续阅读。

随着新功能的创建和更多想法的分享,本节正在更新。请保持关注! 如果你感到困惑,请在 Discord 上询问!我不会咬人的。

递归扫描

递归扫描,或递归,是一种 “如果满足条件就再次执行某操作” 的高级方式。你也可以将其看作一种循环。在世界信息中,递归以键和子键的形式出现。

假设你想给 Farlandia 的怪物分类:

  1. 键 - monsters;值 - [Farlandia 的怪物: slimes]

  2. 键 - slimes;值 - [slime: enemy, slimeball, made of gelatin, bounces to move, annoyance]

启用递归扫描后,在聊天中提到 monsters 这个词会将 monstersslimes 都注入到上下文中。

递归会搜索父对中的词,并查找与这些词匹配的子键。在这种情况下,monsters 的值包含 slimes,并且找到了 slimes 的对并注入到上下文中。

递归的原理可以用来为复杂的背景故事创建完整的键值对树和子对树。这将有助于进一步定义和扩展你的世界。

有时,你可能希望避免某些条目的递归。这在处理替换服装或特定建筑物时尤为重要。在编辑世界信息条目时,你可以在 SillyTavern 中启用 Non-Recursable 选项。

递归扩展性

在创建世界信息时,扩展性非常重要。虽然你可以设置上下文限制的百分比,但在发送消息时用完世界信息预算是很糟糕的。

让我们从编辑 Farlandia 的世界信息开始。我想要有一个怪物类别,并递归地创建一个树结构,直到所有怪物都被提取到上下文中。主要问题是,怪物越多,协调所有这些 token 就越困难,因为每个怪物都会有一个 PList 和 Ali:Chat 条目与之关联。

所以这里有一个算法可以实现这一点。PList 总是被注入和递归,因为它们理想情况下是怪物的一个小片段。然而,除非在上下文中明确提到特定怪物的键,否则不会提取 Ali:Chat。下面提供了算法的图示:

IMG0537jpg
IMG0537jpg

要实现这个算法,请在 Ali:Chat 知识书条目上启用 Non-Recursable

但是,如果所有这些怪物都有一个共同的属性,并且角色对这个属性有特定的感觉呢?例如,Shizuru 将 史莱姆 都视为敌人。在这种情况下,算法将需要扩展,如下图所示:

IMG0536jpg
IMG0536jpg

要实现这个修改,请创建一个关于角色对多个项目感觉的通用 Ali:Chat,并确保它是可递归的。

PList 为基础的世界

多个 PList 可能会导致括号泄漏。如果你看到泄漏情况,这个基础世界可以帮助将所有 PList 信息根据每个世界信息插入深度和位置压缩到一个 PList 中,(例如,在角色之后或深度为 5 时)。

  1. 首先,创建一个新世界并添加两个条目。一个条目包含 [,另一个条目包含 ]。这些是 PList 的方括号边界。

  2. 接下来,将第一个条目的插入顺序设为 2,第二个条目的插入顺序设为 998。这确保了在这些顺序之间的任何内容都将嵌套在 PList 中。

  3. 最后,将这两个条目都标记为 常量 并选择放置位置。两个条目需要放在相同的位置(或深度),否则你会得到非常奇怪的响应!

  4. 对任何其他放置位置重复上述步骤。

在全局信息中选择你的 PList 基础世界后,删除所有相关世界中的 PList 条目中的 [] 并在每个条目的末尾添加一个 ;

将每个 Ali:Chat 条目的插入顺序设置为 1 或 999。这将确保这些示例对话在大型 PList 之前或之后插入。

这是一个构建的 WI Plist 提示示例 [ Farlandia's monsters: slimes, dragons; slime: enemy, slimeball, made of gelatin, bounces to move, annoyance;]

模板 如果你不想自己创建这个世界,可以在这里找到一个快速启动 JSON。只需禁用你不想看到的条目。在全局世界信息中选择这个世界,它将在插入位置 2998 注入方括号。最后,按照上述步骤将旧的 PList 条目转换为兼容 PList 基础的条目。

修改后的 Shizuru 你还可以在这里找到修改后的 Shizuru 角色和世界,作为如何为 PList 基础调整角色的更具体示例。

知识书叠加

有时,你编写的角色可能是基于一个基础角色的变体。最常见的叠加用例是基于一个 SFW 角色构建一个 NSFW 角色。然而,为了保持本指南的一致性,我将使用两个 Shizuru 角色的示例。

角色如下:

  1. Shizuru:一个与用户一起掉入另一个世界的武士
  2. Shizuru:一个与用户一起掉入另一个世界的江户时代公主

现在,这两个角色都需要一个知识书,但最好基于一个 “核心” 知识书进行构建。核心将包含武士 Shizuru 的条目,并为公主 Shizuru 创建一个扩展知识书。通过这种架构,核心和扩展知识书可以独立更新。

要在 SillyTavern 中添加扩展 / 辅助知识书,只需进入角色的知识书选择界面,并在 辅助知识书 下添加名称。

角色过滤器

假设你有一个世界信息条目,并且只希望某个角色触发它。现在可以通过 SillyTavern 中的 应用到角色 框实现这一点。

举个例子,假设有两个角色,分别叫 JamieBill。示例条目如下:[Skytree: skyscraper, large building, located in Tokyo]。我们希望 Jamie 知道 Skytree,但其他人不应该知道。这是她的秘密地点。在这种情况下,将 Jamie 添加到过滤列表中。现在 Jamie 知道 Skytree,但其他人不知道。

如果你不希望某些角色触发某个条目,该怎么办?这也是可以实现的。在 SillyTavern 中,勾选 反选角色 框,过滤列表中的所有角色将被排除在触发该条目之外。

对于 Jamie 和 Bill 的例子,只需将 Jamie 移除并在 反选角色 框中添加 Bill。现在 Bill 不知道 Skytree 是什么,但 Jamie 和其他任何角色都知道!

这个功能更适用于知识书,特别是当你创建一个叠加知识书的角色时。有时核心角色的条目不应该泄露到其他角色中(例如个性 PList)!

混合格式

我明白,人都很懒。你导入了一个大型的纯文本世界信息又不想格式化它。但你还是想使用这些世界信息。你该怎么办?

嗯…… 格式可以混合使用,但它们应该放在上下文的更上方。主要原因是格式化不会让 AI 认为世界信息是对话。

假设你有一个 PList + Ali:Chat 格式的角色,但世界信息是纯文本的。你应该将世界信息条目放在角色定义之前。这样,世界信息就不太可能让 AI 感到困惑,因为它不会被视为动作或对话(取决于角色的格式化风格)。

另一种可能性是使用 PList 基础世界,并将纯文本世界信息放在其中。这会将所有纯文本世界信息包裹在方括号格式中。这样,AI 就会知道注入的信息不是对话或动作的一部分。但这可能会导致意想不到的副作用。

总的来说,对于一个外来的世界信息书,最好的解决方案是重新格式化它。

总结

世界信息和知识书是自定义角色和扩展 AI 可用的整体宇宙的非常强大的资源,同时节省永久 token!


SillyTavern 世界信息百科全书
http://blog.qzink.me/posts/SillyTavern-世界信息百科全书/
作者
Qzink
发布于
2024年11月5日
许可协议