在 SillyTavern 里改角色卡或预设时,经常遇到写进去的变量被原样念出来、条件块整段失效,或者换个人设就全乱套。问题多半不在模型,而在模板语法没写对。这篇按符号、变量、条件、调试顺序把常见写法过一遍,每个部分都给你一个可以照着抄的结构,也说明哪些写法换到别的客户端就不认。
在 SillyTavern 里改角色卡或者预设,十有八九不是模型不听话,而是模板语法没写对。表现都很有辨识度:你写的人设变量被原样念出来,条件段落明明该出现却整段消失,换个角色卡布局全乱。这类问题跟模型能力强弱关系不大,把模板当代码看一遍基本都能定位。
这篇按符号分层、变量取值、条件循环、排查顺序四步走,每步都给一个能照着抄的结构。需要提醒的是,不同客户端对模板语法的支持范围不一样,同一套写法换到别的工具里可能不认,所以改动前先把原始模板备份一份,别边改边覆盖。
先分清模板里两层符号:哪个是壳,哪个是变量
最容易踩的坑,是把「模板自己用的符号」和「模型最终看到的文字」当成一回事。模板文件里有占位符、有条件判断、有转义,这些是给客户端解析的壳;模型收到的是解析完之后的纯文本。如果你把变量写在壳该在的位置,或者把壳写进了正文里,结果就是变量名被原样朗读出来,模型一脸茫然。
- 取值类符号
- 用来把某个变量的值插进正文,写错位置就会输出变量名本身
- 流程类符号
- 控制某段渲染还是不渲染、循环几次,写错会整段消失或重复
- 转义类符号
- 让特殊字符按字面输出,缺了它符号会被当语法吃掉
- 普通文本
- 就是模型真正会读到的内容,不该出现任何占位符痕迹
- 动手前先把角色卡或预设导出备份,命名带上改动日期之外的标识比如「原始版」,避免回滚时找不到
- 把模板逐行标注用途:这行是取值、这行是条件、这行是纯文本,标不清的先别改
- 确认客户端版本是否变了,升级后部分写法可能失效,改之前先到 /guides 看当时的兼容说明
- 改完一处就渲染一次,别攒一批再试,出问题不好定位是哪一行
变量怎么取值、怎么给默认值
变量按来源大致分几类:角色属性类、聊天上下文类、时间与随机数类。取法差异主要在作用域,角色卡里定义的变量不一定在预设里能直接读到,预设里的变量也未必能被角色卡覆盖。写之前先确认这个变量到底属于哪一层,跨层引用经常取空。
| 变量来源 | 典型用途 | 取不到时的表现 |
|---|---|---|
| 角色属性类 | 人设里的名字、称呼、设定项 | 输出空白或原样显示占位符 |
| 聊天上下文类 | 当前话题、历史轮次、用户输入 | 条件判断直接走 else 分支 |
| 时间与随机数类 | 按时间变化的问候、随机事件 | 每次刷新结果不一致,难以复现 |
| 自定义开关类 | 是否开启某段设定 | 整段跳过,看起来像模板丢了 |
- 先确认作用域在角色卡里能读到的变量,换到预设里可能读不到。先用一个最小模板只输出这个变量,看渲染结果里有没有值。
- 加兜底值给每个可能取空的变量配一个默认文本,这样取不到时顶多显示默认内容,不会整段变空白或者报错。
- 再试拼接变量之间拼接时注意分隔符和空格,大小写也要跟定义处保持一致,很多「取到空值」其实是拼错了一个字母。
条件与循环:什么时候显示、什么时候整段跳过
条件块的价值在于让同一份模板适配不同角色和不同聊天进度。判断依据一般有三种:一个开关变量、某个角色设定项、当前聊天到了第几轮。三种可以混用,但嵌套别太深,超过两三层就该拆成多个模板片段分别维护。
- 用开关控制段落:开关为真时渲染这段,为假时整段不输出,适合可选设定和隐藏信息
- 用角色设定控制语气:同一个模板给不同角色卡用,靠设定项切换称呼和口吻
- 用聊天进度控制内容:前期只给背景,中期加互动提示,后期才放收束段落
- 循环生成列表时统一在元素之间加分隔符,别在末尾补,否则容易多出尾逗号或空行
- 条件里不要写太长的比较表达式,拆成两个简单条件更好排查
循环那块最常见的翻车是多一个尾分隔符,模型会把它当成句子的一部分。稳妥做法是把分隔符放在元素前面,第一个元素前不输出,后面每个元素前都输出一次。多行列表还要注意空行处理,渲染完可以先跑一遍看有没有连续空行。
写完不生效时的排查顺序
模板不生效时,不要盯着原始文件看,那样看不出问题。第一步永远是看渲染后的最终提示词,也就是模型实际收到的那段文本。变量有没有被替换、条件块有没有展开、符号有没有被转义吃掉,在这一步全都现形。
- 看渲染结果找到客户端里查看最终提示词的地方,逐行比对原始模板和渲染文本,先确认差异出现在哪一段。
- 核对变量名把渲染文本里没被替换的占位符圈出来,回到模板逐个对变量名的拼写、大小写、作用域。
- 查转义如果符号被当成了普通文字或者反过来被吃掉了,检查转义写法是不是多写或漏写了一层。
- 最小片段复现新建一个只包含出问题那一行的模板,确认它单独能不能跑通,再一行一行加回去,定位到具体是哪一行断的。
- 另存稳定版找出可用版本后立刻另存一份,后续再改都基于副本,别把能用的那版覆盖掉。
这些写法哪些在别的客户端通用、哪些只在本客户端生效,各家支持范围不一样,想知道具体差异可以到站内资料库对照。价格、模型能力这类会变的数字,也别凭记忆判断,到站内页面核对当时的数字更稳。
下一步改模板前先去工具目录和指南中心把当前客户端的语法支持范围过一遍,再动手,能省掉大半返工。→常见问题
为什么我写的变量在对话里被原样念出来了?
多半是写在了模型能直接读到的正文层,而不是模板渲染层。先确认这个变量属于客户端解析的语法,再检查是否被转义字符包住导致不解析。最直接的办法是看渲染后的最终提示词里,那段内容到底变成了什么。
SillyTavern 的模板能直接搬到别的客户端用吗?
一般不行。各家的占位符命名、条件语法、变量来源都不一样,硬搬的结果通常是变量取不到值。可行的做法是把模板里的业务逻辑抄过去,符号部分按目标客户端重写,并重新跑一遍排查顺序。
模板越复杂效果越好吗?
不是。条件层数和变量越多,出错的点越多,模型读到的上下文也更碎。建议把变化频繁的部分做成开关,稳定不变的部分写死成纯文本,复杂逻辑拆成几段短模板,比堆在一个大模板里好维护。