预设改了没反应?先看它有没有被发出去
预设改了措辞回复纹丝不动、世界书词条测试触发了正文里没有、示例对话从第一天起就没生效:三个症状的病根都在「点发送」到「请求发出」之间的装配一步。这篇按 SillyTavern 1.18 的真实装配语义逐条揭暗规则:块定义了不等于排进编排、停用的占位是丢弃而缺席的占位反而追加到 prompt 末尾、main 会被角色卡静默替换、示例块没有名字前缀一个字都不发。文末给一条三步自查路径。

三个场景,酒馆玩家多半撞过一个。你在预设里改了某个块的措辞,回复纹丝不动。世界书测试面板里词条明明亮了绿, 翻请求日志,正文里没有它。你给卡写了三组示例对话,模型从第一天起就没按那个腔调说过话。
三个症状指向同一个环节:从「点发送」到「请求发出」之间的装配。这一步酒馆基本不给你看,出了问题只能猜。 我们最近做装配透视台时把 SillyTavern 1.18 的装配代码逐函数读了一遍,这篇把里面的暗规则摊开,每一条都对应一批「玄学不生效」的真实病例。
先立骨架:一次发送是怎么拼出来的
Chat Completion 轨的一次发送,最终产物是一列带角色的消息。这列消息的顺序由预设的编排(prompt_order) 一锤定音:编排里块的次序就是发给模型的消息次序,没有第二套隐藏排序。
块分两种。字面块自带文本,main、越狱块(post-history instructions)都是。占位块(marker)只占位置, 内容在发送那一刻才填进来:角色卡的描述、性格、场景,玩家 persona,世界书前后两个注入位, 再加示例对话和聊天历史两个大区。1.18 的出厂编排从 main 起手,依次是世界书(前)、persona、卡描述、性格、 场景、辅助块、世界书(后)、示例对话、聊天历史,越狱块压轴。你手里那份预设的编排多半改过这个次序—— 这正是它值钱的地方,也是它出事的地方。
症状一:预设改了没反应
四个病根,按命中率排。
第一个也是最冤的:块根本不在编排里。定义池和编排是两张表,块躺在池里不等于排进了队伍。 没排进编排的字面块完全不参与装配,酒馆不报错、不提示、不置灰。改抄来的预设最容易踩: 原作者删了编排项留下了定义,你对着定义改了十遍,改的是一段从来没被发出去的文本。
第二个直白些:块在编排里,但被停用了。第三个藏得深:块被设成了深度注入(injection_position 改成绝对位置)。这种块脱离主干,插进聊天历史的倒数第 N 条:深度从最新一条消息往回数,0 是贴着最末。 你在编排列表里看到它排第二位,实际它在历史堆里,前后邻居全是聊天记录。
第四个最常被冤枉成「模型不听话」:main 被角色卡静默替换。「优先使用角色卡提示词」出厂默认开启, 只要卡的 system_prompt 字段非空,main 块的内容就被它顶掉,除非块勾了禁止覆盖, 或者卡作者用 {{original}} 宏把你的 main 拼了回去。你改 main 改到怀疑人生, 发出去的从来不是 main。越狱块与卡的 post-history instructions 字段是同一套机制。
症状二:世界书词条触发了,内容没进去
触发和送达是两回事,中间隔着好几道坎。
除了这一对,还有三道坎。深度注入的词条(含作者注)在装填前就插进历史池,跟历史同吃一个 token 预算, 预算耗尽先裁靠后的,深度越大越先死。编排里如果没有启用的聊天历史占位,深度注入连落点都没有, 历史和全部注入整体不发送。插进示例区的词条则依赖示例对话占位在场,而且内容必须带「名字:」前缀, 否则和症状三同款:静默丢弃。
落位规则也值得知道一句:同一深度、同一角色的注入最终并成一条消息发出,预设自己的绝对块占前排, 世界书词条和作者注跟在后面;作者注不动设置时固定落在第 4 层。世界书官方文档把触发讲透了, 落位这半边基本得读源码。
症状三:示例对话消失
病根几乎总是同一个:归属前缀。示例对话在 Chat Completion 轨会被切成一条条独立消息,切分依据是行首的用户名:和角色名:。整块示例里一个归属前缀都没有(比如写成了一段旁白式的示范文), 上游一个字不发,静默丢弃,没有任何警告。这是我们见过命中率最高的单条暗规则。
另外两个小病根:示例的装填顺位排在聊天历史之后,token 紧张时最先被牺牲;每个 <START> 块整块进整块丢,不拆半块。所以「聊了几十轮之后示例突然失效」不是玄学,是预算把它挤下了车。
三步自查
上面每条暗规则,装配透视台都做成了看得见的诊断。 把预设拖进去(卡和世界书可选),三步走完:先看块诊断,没排进编排的、停用的、被卡覆盖的直接点名; 再填一句测试消息跑一次装配,在按来源着色的消息流里找你的块落在哪;最后看词条下落报告和预算瀑布, 每条词条写明进了哪条消息、没进的卡在哪道坎。语义对齐 1.18,全程浏览器本地,预设和卡不上传。
回到开头的三个症状。它们的共同点是:你以为自己在调内容,实际问题出在装配。下次预设「不生效」, 先别改第十一遍措辞,花两分钟确认那段文本有没有被发出去、发到了哪个位置。多数病例到这一步就破了。
常见问题
预设里定义了的块,为什么会完全不生效?
因为块的定义池和编排(prompt_order)是两张表。一个块可以躺在定义池里但没被排进编排,按酒馆语义它就完全不参与装配,不报错也不提示。改抄来的预设最容易踩:作者删编排时留下了定义,你以为改了内容就会生效,其实那个块从来没被发出去过。
停用一个占位(marker)和把它从编排里删掉,效果一样吗?
方向相反。停用等于丢弃:世界书占位被停用时,激活词条的内容整个不发送。缺席等于追加:占位不在编排里时,酒馆不丢内容,而是把它追加到整个 prompt 的末尾,排在压轴的越狱块之后。想关掉某类内容用停用,删占位反而把它挪到了一个更奇怪的位置。
@深度注入的词条会被裁掉吗?
会。深度注入的消息在装填前就插进了聊天历史池,和历史消息同吃一个 token 预算。装填从最新一条往回装,预算耗尽即停。深度设得越大(离最新消息越远),排队越靠后,token 紧张时越先被裁。词条测试面板亮绿只代表触发,不代表送达。
装配透视台的结果和真实发送完全一致吗?
主干语义按 SillyTavern 1.18 源码逐函数移植:编排顺序、占位填充、卡覆盖 main、世界书全部注入位、宏展开、预算装填顺序。有几层如实声明不模拟:世界书自身的预算裁剪(超水位会提示)、正则脚本、跨轮 sticky/cooldown、群聊和 continue 等特殊生成类型;token 数是估算不是真分词器。全程浏览器本地,文件不上传。