世界书

世界书(World Info,也称为 Lorebooks 或 Memory Books)是 ST 中可用的强大工具,能够将提示词动态地插入到你的对话中,帮助引导 AI 的回复。

通常,世界书(World Info,简称 WI)用于增强 AI 对你虚构世界中细节的理解,但你也可以使用世界书条目插入任何希望加入提示词的内容。

它的工作方式类似一个动态字典:只有当消息文本中出现与条目关联的关键词时,才会把世界书条目中的相关信息插入进来。

SillyTavern 引擎会激活并将合适的世界书无缝整合进提示词,为 AI 提供背景信息。

需要注意的是,虽然世界书能够引导 AI 朝向期望的内容,但它并不能保证这些内容一定出现在生成的输出消息中。这取决于你的模型在利用附加信息方面有多强!

进阶技巧

  • 世界书引擎是非常强大的提示词管理工具。不要只盯着添加角色世界书,尽管放手尝试。
  • 激活关键词、标题以及其他不在 Content 字段中的信息不会被插入到上下文中,因此每个世界书条目都应有完整、可独立成篇的描述。
  • 要创建丰富、详尽的世界设定,可以通过递归激活让条目相互链接、相互引用。详见下方的递归
  • SillyTavern 为插入的背景信息提供了灵活的上下文预算控制。为节省提示词 token,建议保持条目内容简洁。

延伸阅读

  • World Info Encyclopedia:关于世界书与 Lorebooks 的详尽深入指南。作者:kingbri、Alicat、Trappu。

特定上下文来源

除了全局世界书选择器之外,世界书还可以被分配到特定的上下文——某个角色、某个人格或某一条对话。当对应的角色、人格或对话处于活动状态时,这些特定上下文来源会自动激活。

角色世界书

可选地,可以将世界书文件分配给某个角色,作为与该角色所有对话(包括群聊)共享的专属世界书来源。

一个主世界书可以绑定到角色。为此,前往角色管理面板并点击地球图标按钮,然后从下拉列表中选择世界书并点击“Ok”。导出角色时,该文件也会被嵌入到角色卡数据中。

如需解绑、更改世界书文件,或分配额外的世界书文件作为角色世界书,请 Shift+点击地球图标按钮,或点击“More...”然后点击“Link World Info”。注意,只有主世界书文件会随角色一起导出。

重命名世界书文件时,系统会提示你选择是否在引用该世界书的所有角色中重新链接。这能确保重命名后已有的角色世界书绑定保持不变。

人格世界书

可以将世界书文件分配给当前活动的人格。只要选中了该人格,无论打开哪个角色或对话,该世界书中的条目都会被激活。

要将世界书分配给人格,请打开 Persona Management 面板,点击 Persona Lore 按钮。从下拉列表中选择一个世界书文件。如果已绑定了世界书,点击该按钮会直接打开世界书编辑器。

对话世界书

也可以将世界书文件分配给单条对话。对话绑定的世界书条目仅在该条特定对话中生效,不会延续到与同一角色的其他对话。

要将世界书分配给某条对话,请在角色管理面板中点击 Chat Lore 按钮。从下拉列表中选择一个世界书文件。如果已绑定了世界书,点击该按钮会直接打开世界书编辑器。

世界书插入策略

在生成 AI 回复时,来自角色世界书及其他辅助来源的条目会与来自全局世界书选择器的条目合并。默认情况下,条目会按以下顺序插入:

  • 对话世界书
  • 人格世界书
  • 角色世界书或全局世界书,采用以下策略之一:

均匀排序(默认)

所有条目都会按其插入顺序排序,就像它们是同一个大文件中的一部分,忽略来源。

角色世界书优先

角色世界书的条目会先按其插入顺序纳入,然后才是全局世界书的条目。

全局世界书优先

全局世界书的条目会先按其插入顺序纳入,然后才是角色世界书的条目。

世界书条目

键(关键词)

触发世界书条目激活的关键词列表。默认情况下,键不区分大小写(此设置可配置)。

正则表达式(Regex)作为键

键通过支持正则表达式提供了更灵活的匹配方式。这使得配合可选的单词或字符、空格以及正则表达式提供的所有其他工具来匹配更动态的内容成为可能。
如果某个已定义的键是一个有效的正则表达式(JavaScript regex 风格,以 / 作为分隔符,允许所有标志),那么在检查条目是否应被触发时,会将其作为正则处理。多个正则表达式可作为独立的键输入,并彼此协同工作。正则表达式内部可以使用逗号。纯文本键不支持逗号,因为逗号被视为键分隔符。

高级正则匹配的使用示例:
当角色进行与天气相关的动作时应插入的条目/指令

/(?:{{char}}|he|she) (?:is talking about|is noticing|is checking whether|observes) (?:the )?(rainy weather|heavy wind|it is going to rain|cloudy sky)/i

关于正则表达式语法与可能性的更多信息:Regular expressions - JavaScript | MDN

高级正则的逐消息匹配

ST 会在 WI 扫描缓冲区中将每条聊天消息以 character name: 作为前缀,并且在 v1.12.6 之后会使用字符值 1(\x01)来前置。
这意味着你可以使用与该分隔字符绑定的正则表达式,匹配来自某个特定角色的输入或输出。

例如,要仅匹配用户说“hello”,可以使用以下正则表达式:

/\x01{{user}}:[^\x01]*?hello/

键输入

有两种输入关键词的模式,各自的 UI 略有不同。在 ⌨️ 纯文本模式(默认)中,键可以在单个文本框中以逗号分隔的列表形式输入。也可以包含正则表达式,但不会有特殊高亮。在 花式模式 中,键会显示为独立的元素,正则表达式也会被相应高亮。该控件支持编辑和删除键。可通过输入控件内的内联按钮切换模式。

可选过滤器

与主键配合使用的附加关键词的逗号分隔列表。 如果未提供任何参数,则忽略此标志。 支持 AND ANY、NOT ANY 或 NOT ALL 逻辑。

  1. AND ANY = 仅当主键和任意一个可选过滤器键都在扫描上下文中时,才激活该条目。
  2. AND ALL = 仅当主键和所有可选过滤器键都存在时,才激活该条目。
  3. NOT ANY = 仅当主键存在、且所有可选过滤器键都不在扫描上下文中时,才激活该条目。
  4. NOT ALL = 即使主键被触发,只要所有可选过滤器都在扫描上下文中,就阻止该条目激活。

这些键也支持正则表达式

条目内容

条目激活时插入到提示词中的文本。

插入顺序

数值。用于定义当多个条目同时激活时该条目的优先级。顺序数值越大的条目会插入到更接近上下文末尾的位置,因为它们对输出的影响更大。例如,顺序值为 100 的条目会出现在顺序值为 250 的条目之前。

插入位置

  • Before Char Defs: 世界书条目插入在角色描述和场景之前。对对话有中等程度的影响。
  • After Char Defs: 世界书条目插入在角色描述和场景之后。对对话有更大的影响。
  • Before Example Messages: 世界书条目被解析为对话示例块,插入在角色卡提供的示例之前。
  • After Example Messages: 世界书条目被解析为对话示例块,插入在角色卡提供的示例之后。
  • Top of AN: 世界书条目插入在作者备注内容的顶部。影响程度视作者备注的位置而定。
  • Bottom of AN: 世界书条目插入在作者备注内容的底部。影响程度视作者备注的位置而定。
  • @ D: 世界书条目插入到对话中的特定深度(深度 0 即提示词的底部)。
    • ⚙️ - 作为系统角色消息
    • 👤 - 作为用户角色消息
    • 🤖 - 作为助手角色消息
  • Outlet: 世界书条目不会被自动注入。相反,其内容会存储在一个命名的出口下,你可以通过调用 {{outlet::Name}}来精确决定它在提示词中出现的位置。

对话示例条目会按照提示词构建设置进行格式化:指令模式或聊天补全的提示词管理器。它们也遵循对话示例行为规则:在上下文占满时被逐渐挤出、始终保留或完全禁用。

如果你的作者备注被禁用(插入频率 = 0),处于 A/N 位置的世界书条目将被忽略!

出口名称

当选择了 Outlet 插入位置时,条目会出现一个额外的 Outlet Name 字段。你在此处提供的名称会将条目分组,并定义你用于手动将它们拉入提示词的 token。

提示词管理器高级格式化 的提示词字段中使用 {{outlet::YourName}} 宏。构建提示词时,该宏会被替换为所有共享同一出口名称的世界书条目的合并内容,内容之间以换行符分隔,并按其插入顺序值排序。

如果某个出口条目缺少名称,它在生成时会被跳过,因此务必填写该字段。出口名称支持基于你已使用过的名称进行自动补全,便于复用一致的标签。

限制与注意事项

  • 不支持在世界书条目内部放置出口宏,这样做出不起作用。这与世界书的求值顺序冲突,可能导致无限循环。
  • 不支持嵌套出口。你不能在另一个出口的内容中放置出口宏。原因同上,可能导致无限循环。
  • 角色卡字段(描述、人格、场景等)无法展开出口。这些字段会被提前解析,以便它们可以作为世界书触发器的附加匹配来源,这意味着在处理它们的文本时,出口尚不可用。如果你需要将出口内容放入提示词主体中,请使用其他感知宏的字段。
  • 作者备注编辑器也无法解析出口。要在作者备注周围放置出口内容,请将条目分配给 Top of ANBottom of AN 插入位置,而不要依赖宏。
  • 出口名称区分大小写。{{outlet::}} 宏必须与条目的 Outlet Name 使用完全相同的大小写,否则不会返回任何内容。
  • 调用宏时会忽略出口名称中的前导或尾随空格,因此带额外空白保存的名称将无法匹配。避免为名称填充空白,以便其能被正确解析。
  • 没有分配内容的出口宏会被替换为空字符串。

条目标题/备注

一个便于你为条目加标签的文本字段,AI 或任何触发逻辑都不会使用它。

如果为空,可通过点击“Fill empty memos”按钮,用条目的第一个键来回填。

策略

  1. 🔵(蓝圈)= 该条目不需要任何关键词,无论内容如何都会触发。
  2. 🟢(绿圈)= 该条目仅当存在关键词时才会被触发。
  3. 🔗(链条)= 该条目允许通过嵌入相似度被插入。

每个条目还有一个开关,允许你启用或禁用该条目。

概率(触发 %)

该值相当于一个附加过滤器,在条目以任何方式(常驻、主键、递归)被激活时,为其不被插入增加一定的概率。

  1. 概率 = 100 表示该条目在每次激活时都会被插入。
  2. 概率 = 50 表示该条目以 1:1 的概率被插入。
  3. 概率 = 0 表示该条目不会被插入(实质上等同于禁用)。

可利用此设置在对话中创建随机事件。例如,每条消息可以在其文本提及某个名字时有 1% 的概率唤醒一位远古邪神。

包含组

包含组用于控制当多个具有相同组标签的条目同时被触发时如何选择条目。如果多个具有相同组标签的条目被激活,则只有其中一个会被插入到提示词中。

默认情况下,所选条目会根据其组权重(默认为 100 点)随机选择——数值越高,被选中的概率越大。这样可以在被触发的条目中随机选择,为交互增添惊喜和多样性。

如果将单个条目定义为以逗号分隔的列表,它可以属于多个包含组。上述逻辑同样适用。如果该条目被触发,它会禁用属于其任一组的所有其他条目。因此,只要其任一组被激活,该条目就不会被激活。

优先包含

为了对通过包含组激活的条目提供更多控制,你可以使用“Prioritize Inclusion”设置。此选项允许你确定性地指定选择哪个条目,而不是随机滚动组权重概率。

如果多个具有相同组标签且开启了此设置的条目被激活,则会选择“Order”值最高的那一个。这对于通过包含组创建回退序列非常有用。例如,对低深度条目赋予更高优先级,或在两个都有效的场景设定指令之间优先选择某一个。

使用组评分

当全局或逐条目启用此设置时,激活的条目键的数量决定了组获胜者的选择。只有键匹配数最多的组内子集会留下来由组权重或包含优先级激活——其余的会被停用并从组中移除。

利用此设置可以为大型组中的单个条目提供更高的特异性。例如,它们可以有一个公共键和一个特定键。当未提供特定键时会插入一个随机条目,反之亦然。

主键的评分计算逻辑是 1 次匹配 = 1 分。

对于辅助键,交互方式取决于所选的选择性逻辑:

  1. AND ANY:1 次辅助匹配 = 1 分。
  2. AND ALL:如果所有辅助键都匹配,每个辅助键记 1 分。
  3. NOT ANY 和 NOT ALL:无变化。

示例:

  • 条目 1。键:song、sing、Black Cat。组:songs
  • 条目 2。键:song、sing、Ghosts。组:songs

输入 sing me a song 可以激活任一条目(两者都激活了 2 个键),但 sing me a song about Ghosts 只会激活条目 2(激活了 3 个键)。

Automation ID

允许将世界书条目与快捷回复扩展中的 STscripts 集成。如果快捷回复命令与 WI 条目具有相同的 Automation ID,那么当具有匹配 ID 的条目被激活时,该命令会自动执行。

自动化按其触发的顺序执行,遵循你指定的排序策略,将角色世界书插入策略与“Priority”排序相结合。这导致蓝圈条目先被处理,随后是其他条目按其指定的“Order”处理。递归触发的条目会按相同顺序随后处理。

如果多个具有相同 Automation ID 的条目被激活,脚本命令只会运行一次。

角色过滤器

一个可激活该条目的角色名称列表。如果此列表不为空,该条目只会对名称在列表中的角色激活。当选中某个标签时,该条目只会对具有该特定标签的角色激活。

“Exclude”模式会反转过滤器,意味着该条目会对除添加到列表中的角色或具有所选标签的角色之外的所有角色激活。

触发条件

可激活该世界书条目的生成类型。如果未选择任何内容,该条目可对所有生成类型激活。如果选择了一个或多个,该条目将仅对这些特定生成类型激活:

  • Normal: 常规消息生成请求。
  • Continue: 当按下继续按钮时。
  • Impersonate: 当按下扮演按钮时。
  • Swipe: 当通过滑动触发生成时。
  • Regenerate: 当在单聊中按下重新生成按钮时。
  • Quiet: 后台生成请求,通常由扩展STscript 命令触发。

附加匹配来源

默认情况下,世界书条目只与当前对话的内容进行匹配。这些选项允许你将条目与不出现在对话中的不同角色信息,甚至人格信息进行匹配。当你希望拥有一组在多个角色之间复用的大量条目,而又不想管理庞大的标签列表,或不想每次新建条目都要更新角色过滤器列表时,这非常有用。这还允许你基于当前活动的人格来匹配条目。

  • Character Description: 与角色描述进行匹配。
  • Character Personality: 与角色人格摘要(位于高级定义下)进行匹配。
  • Scenario: 与角色指定的场景(位于高级定义下)进行匹配。
  • Persona Description: 与当前选中人格的描述进行匹配。
  • Character's Note: 与角色备注(可在高级定义下找到)进行匹配。
  • Creator's Notes: 与角色创作者备注(可在高级定义下找到)进行匹配。创作者备注通常不会包含在提示词中。

向量存储匹配

向量存储扩展通过使用最近聊天消息与世界书条目内容之间的相似度,提供了一种替代关键词匹配的方式。

要启用并使用此功能,需满足以下先决条件:

  1. 向量存储扩展已启用,并已配置为使用可用的嵌入来源之一。
  2. 在向量存储扩展设置中勾选了“Enable for World Info”复选框。
  3. 允许进行无键匹配的世界书条目具有“Vectorized”(🔗)状态,或者在向量存储设置中勾选了“Enabled for all entries”选项。

扩展中向量化模型的选择以及“embeddings(嵌入)”一词背后的理论含义在此不作展开。如果你需要关于此主题的更多信息,请查阅 数据银行 指南。

向量存储匹配遵循以下规则集:

  • 允许通过向量存储匹配的条目最大数量可通过“Max Entries”设置调整。此数字仅设置上限,不影响世界书激活设置中设定的 token 预算。所有预算规则仍然适用。
  • 此功能仅替代对关键词的检查。要插入条目,所有附加检查仍须满足:触发 %、角色过滤器、包含组等。
  • 不使用激活设置或条目覆盖中的“Scan Depth”设置。而是使用向量存储的“Query messages”值来获取要进行匹配的文本。这使得类似将“Scan Depth”设为 0 这样的配置成为可能——即不会进行常规关键词匹配,但条目仍可通过向量被激活。
  • “Vectorized”状态只是一个附加标记。该条目仍会像正常的、已启用的、非常驻记录那样运作,如果设置了关键词,仍会被关键词激活。如果你希望条目仅通过向量激活,请移除关键词。

定时效果

通常,世界书求值是无状态的,即求值结果仅取决于当前对话上下文,结果相同。然而,随着定时效果的引入,你可以创建具有激活延迟、被触发后保持活动状态,或在激活后无法再被触发的条目。

定时效果规则

  1. 效果的时间范围以消息数(而非消息对/消息交互对)为单位计量,0 表示无效果。
  2. 效果仅在条目被激活的那条对话中生效。分支继承父对话的状态。
  3. 如果对话未推进,则活动的定时效果会被移除,例如最后一条消息被滑动或删除。
  4. 对当前处于定时效果中的条目进行任何更改,都会导致该效果被强制移除。
  5. 如果效果已处于活动状态,后续的关键词触发不会刷新效果的持续时间。

定时效果类型

  1. Sticky - 条目在被激活后会保持活动 N 条消息。粘滞条目在过期之前的后续扫描中会忽略概率检查。
  2. Cooldown - 条目在被激活后 N 条消息内无法被激活。可与 Sticky 配合使用:条目在粘滞持续时间结束时进入冷却。
  3. Delay - 条目在求值时,除非对话中至少有 N 条消息,否则无法被激活。
    • Delay = 0 -> 条目可随时被激活。
    • Delay = 1 -> 如果对话为空(无开场白),条目无法被激活。
    • Delay = 2 -> 如果对话中有零条或仅一条消息,条目无法被激活,以此类推。

定时效果示例

条目配置:sticky = 3,cooldown = 2,delay = 2。

Message 0: delay
Message 1: entry activated
Message 2: sticky
Message 3: sticky
Message 4: sticky
Message 5: cooldown
Message 6: cooldown
Message 7: entry can be activated again

激活设置

世界书界面顶部的可折叠菜单。

扫描深度

可在条目级别覆盖。

定义应在聊天历史中扫描多少条消息以查找世界书键。

  • 如果设为 0,则只对递归条目和作者备注进行求值。
  • 如果设为 1,则 SillyTavern 只扫描最后一条消息。
  • 2 = 最后两条消息,以此类推。

包含名称

定义对话参与者的名称是否应作为消息前缀包含在扫描文本缓冲区中。这样无需在消息中直接提及名称,即可激活以名称作为关键词的条目。

假设对话参与者名为 Alice 和 Bob,下方是要扫描文本的示例。

启用(默认):

Alice: Hello! Good to see you.
Bob: How is the weather today?

禁用:

Hello! Good to see you.
How is the weather today?

上下文百分比 / 预算

定义世界书条目一次最多可使用多少 token。 你可以定义相对于 API 最大上下文设置的阈值(上下文百分比),或一个客观的 token 阈值(预算)。

如果预算已耗尽,即使提示词中存在键,也不会再激活更多条目。

常驻条目会最先插入。然后是顺序数值较大的条目。

通过直接提及其键而插入的条目,优先级高于在其他条目内容中被提及的条目。

最少激活数

此设置与最大递归步数互斥。

最少激活数:如果设为非零值,将忽略“扫描深度”的限制,从最新消息开始向后搜索整个聊天记录中的关键词,直到触发最少激活数所指定的条目数量。这仍会受最大深度设置或你的总体预算上限限制。

由最少激活数触发的额外扫描步骤不会检查前序步骤中通过递归添加的条目。只有聊天消息和扩展提示词能触发这些额外激活。不过,由最少激活数激活的条目可以照常触发其他条目。

最大深度

使用最少激活数设置时要扫描的最大深度。

递归扫描

递归扫描允许条目激活其他条目或被其他条目激活,从而实现不同世界书条目之间复杂的交互和依赖。此功能可以显著增强你创意场景的动态性。
递归扫描是否启用可通过全局设置 Recursive Scan 控制。
针对每个条目,有三个选项可用于控制递归:

8 Non-recursable:勾选此复选框后,该条目将不会被其他条目激活。这对于不应改变或不应受其他世界书条目影响的静态信息非常有用。

  • Prevent further recursion:选择此选项可确保一旦此条目被激活,它就不会再触发任何其他条目。这有助于避免意外的激活链。

  • Delay until recursion:此条目仅在递归检查期间被激活,这意味着它不会在初始遍历中被触发,但可以被其他启用了递归的条目激活。现在,通过为这些延迟新增的 Recursion Level,条目会按层级分组。最初,只有第一层(最小数字)会参与匹配。一旦找不到匹配项,下一层就变得可匹配,重复该过程直到检查完所有层级。这样可以对递归过程中更深层信息如何以及何时被揭示进行更精细的控制,尤其是在与 NOT ANY 或 NOT ALL 键匹配组合使用时。

条目可以通过在内容文本中提及其他条目的关键词来激活它们。

例如,如果你的世界书包含两个条目:

Entry #1
Keyword: Bessie
Content: Bessie is a cow and is friends with Rufus.
Entry #2
Keyword: Rufus
Content: Rufus is a dog.

如果消息文本只提到了 Bessie,这两个条目都会被拉入上下文。

最大递归步数

此设置与最少激活数互斥。

当设为零时,递归嵌套仅受你的提示词预算限制。当设为非零值时,会将扫描步骤总数限制为期望的最大“嵌套层级”。

示例值:

  • 1 实际上会禁用递归,因为检查在第一步之后就会停止。
  • 2 只能激活递归条目一次。
  • 3 可以触发递归两次……

区分大小写的键

可在条目级别覆盖。

要被拉入上下文,条目键需要与世界书条目中定义的大小写完全匹配。

当你的键是常用单词或常用单词的一部分时,这很有用。

例如,当此设置启用时,键 'rose' 和 'Rose' 会根据输入被区别对待。

全词匹配

可在条目级别覆盖。

键只包含单个单词的条目,仅当整个单词出现在搜索文本中时才会匹配。默认启用。

例如,如果设置已启用且条目键为“king”,那么类似“long live the king”的文本会被匹配,而“it's not to my liking”则不会。

重要提示: 当用于不使用空格分隔单词的语言(例如日语或中文)时,此设置可能会产生不利影响。如果你用这些语言编写条目,建议将其关闭。

超出预算时警告

当被激活的世界书超出分配的 token 预算时显示警告。