# 世界书

世界书是一组按关键词触发的背景设定条目。当对话中出现某个关键词时,对应的设定会被自动注入到 AI 的上下文里——不占用固定篇幅,只在需要时出现。适合存放世界观、地点、组织、事件等"提到才需要"的知识。

与「知识书」的区别:世界书靠关键词精确触发,知识书靠语义向量检索。人名地名等确定性设定用世界书,大段资料用知识书。

# 入口

  • 管理:设置 → 高级设置 → 世界书
  • 绑定角色:角色编辑页 → 世界书区块(勾选后随角色生效)
  • 对话内临时启停:对话管理 → Prompt 标签 → 世界书区块

# 获取世界书

三种方式:

  1. 导入文件:世界书页右上角「导入」按钮,选择世界书 JSON 文件(支持多选批量;SillyTavern 的独立世界书与角色卡内嵌世界书两种格式都能识别)。也可以直接在「角色」页 + → 导入里混着角色卡一起丢进来,会自动识别。
  2. 随角色卡导入:导入带内嵌世界书的角色卡时,会询问是否「导入为世界书」并自动绑定该角色。
  3. 手动新建:世界书页右上角「+」,输入名字后进入详情页逐条添加。

# 编辑条目

进入某本世界书后,点击条目编辑,右滑删除,右上角「+」新建条目。每个条目可设置:

字段 说明
关键词 逗号分隔,命中任意一个即触发(受触发逻辑影响)
次要关键词 配合触发逻辑做「与/非」组合
触发逻辑 andAny(默认)/ notAll / notAny / andAll
位置 角色设定前 / 角色设定后 / 按深度插入聊天记录
深度 位置为「按深度」时,从最新消息往回数的插入位置
顺序 同位置多条目的排序权重(大的在前)
概率 % 触发后按概率决定是否真正注入
常驻 打开后无视关键词,每次都注入
  • 扫描窗口:只扫「参与本次请求的历史消息 + 你正要发送的这条」。太久之前提过的关键词不会触发。
  • 递归:某条目被激活后,它的内容里如果包含其他条目的关键词,会引发第二轮激活(可有多轮,直到没有新增)。个别条目可设「不参与递归/不触发递归」。
  • 时效:条目支持 sticky(触发后持续 N 条消息)、cooldown(触发后冷却 N 条)、delay(对话不满 N 条消息前不触发)。
  • 预算:所有激活条目的总字数受预算限制,超出时按顺序权重丢弃低优先级条目(思考日志里会显示丢弃数量)。
  • 预设也能挂世界书:预设的「世界书挂载」键与角色绑定的书取并集

以下内容供 AI 助手回答问题时参考,普通用户可跳过。

flowchart TD
    A[收集扫描窗口文本<br>裁剪后历史+当前消息] --> B[第1轮: 常驻条目 + 关键词匹配]
    B --> C{按触发逻辑判定}
    C --> D[概率过滤 probability]
    D --> E[时效过滤 sticky/cooldown/delay]
    E --> F{递归: 已激活内容中<br>出现新关键词?}
    F -- 是 --> B
    F -- 否 --> G[按 order 排序 + 预算裁剪]
    G --> H[分三桶输出<br>beforeChar / afterChar / atDepth]
# 模块: worldbook engine — 触发逻辑判定  (verified: v1.9.7)
def entry_matches(entry, window_text):
    primary = any_key_in(entry.keys, window_text)
    secondary = any_key_in(entry.secondary_keys, window_text)
    if entry.logic == "andAny":  return primary                      # 主关键词命中即可
    if entry.logic == "andAll":  return primary and all_keys_in(...) # 主+次全部命中
    if entry.logic == "notAny":  return primary and not secondary    # 主命中且次一个都没有
    if entry.logic == "notAll":  return primary and not all_keys_in(...)  # 主命中且次不全命中

# 递归按轮进行:每轮用「上一轮结束时已激活的内容」作为附加扫描文本,
# 本轮新激活的条目下一轮才对别人可见;一轮无新增即停止。
# 时效状态(sticky/cooldown 计数)按对话持久化,跨消息生效。

三桶的消费位置见 聊天上下文管线 第⑤⑨⑪步。