首页 中文文档 分组聊天

分组聊天:谁来接话,由什么决定

基于 SillyTavern 1.18.0最后更新:2026-07-26
非官方文档。本站由 PokiTavern 维护,与 SillyTavern 开源项目没有隶属关系, 内容也未经该项目审核。文中的行为描述以 SillyTavern 1.18.0 源码为准,并附出处链接。

分组聊天让多个角色出现在同一个对话里。它要解决的核心问题只有一个: 每一轮该由谁开口。酒馆提供四种策略,默认那种每轮掷骰,一次可能选中好几个人, 这就是群聊有时会连着跳出三条回复的原因。

四种发言顺序策略

取值定义在 group_activation_strategygroup-chats.js:122):

名称怎么选人一轮几个
0NATURAL默认。先看你的输入里点了谁的名字,再按 talkativeness 逐个掷骰1 个到全员
1LIST启用的成员全部入选,按成员列表顺序依次发言全员
2MANUAL你打字时谁都不说;由其他方式触发生成时随机抽一个0 或 1 个
3POOLED在还没开口的人里随机抽一个1 个

不管选哪种,在成员列表里点某个角色的「发言」按钮都是另一条路径:它带上 force_chid 直接指定角色,四种策略一概不参与。

NATURAL 到底怎么挑人

两步。第一步把你的输入拆成词,逐词比对成员名字,被点到名的直接入选。第二步把成员 打乱顺序,逐个用 Math.random() 掷一次骰,talkativeness 大于等于骰值的就入选。 两步下来一个都没选中时,再从 talkativeness 大于 0 的人里随机补一个。

名字比对走的是分词后的完整词匹配(extractAllWords),不是子串匹配。名字里 带空格的角色,任意一个词被提到都算点名。

还有一条约束:上一条消息的发言者本轮不能再说,除非群设置里打开了允许 自我回复。源码里这个变量叫 bannedUser,实现见 activateNaturalOrder()group-chats.js:1242)。

这条禁令只在不是你打字触发的那些轮次生效。你每发一条消息,禁令就解除一次, 所以刚回完话的角色接你的话是正常的;而自动模式下连着跑几轮时,同一个人不会连着开口。

某个角色老是不出场,多半是 talkativeness 太低;只要他不是上一条的发言者,点到名就一定 会来,因为点名走的是第一步、不掷骰。

talkativeness 是概率不是优先级

它是每轮独立的掷骰阈值,不是排序权重, 默认值 0.5。 设成 0.5 不代表「一半的轮次会说话」,而是「每一轮有一半概率入选」。每个成员各掷各的骰, 因此多人同时入选很常见。想要安静的角色调低它,想要话痨调高,但它控制不了节奏。

调到 0 的角色基本不会主动开口,补位那一步也会先绕开他(只要群里还有别人大于 0), 但点名和「发言」按钮仍然叫得动。

POOLED 是怎么轮换的

activatePooledOrder() 从最新一条消息往回扫,扫到你的发言就停,把这期间开过口的人记下来,再从剩下的人里 随机抽一个。人都说过一遍了就重新洗牌,只排除上一条消息的发言者。

有一点容易误会:你亲自打字触发的那一轮,回扫会立刻中止,所有成员都算「还没开口」, 于是从全员里随机抽。轮换只发生在你不说话、让角色们自己往下接的那些轮次里。

三种角色卡拼接模式

多个角色的卡片要怎么塞进同一段提示词,由 group_generation_modegroup-chats.js:129)决定,三种取值。拼接发生在描述、性格、场景、对话示例 这四个字段上,逐字段把各成员的内容用换行连起来。

名称行为
0SWAP默认。只放当前发言者的角色卡,轮到谁换成谁
1APPEND把所有启用成员的角色卡拼在一起
2APPEND_DISABLED拼接时把被停用的成员也算进去

取舍很直接。SWAP 省上下文,但发言者不知道其他人的设定,容易出现「同处一室 却互相不认识」。APPEND 让所有人互相知晓,代价是上下文消耗随成员数线性增长: 四个角色各 800 token,光角色卡就是 3200 token。

两种 APPEND 模式还多两个输入框,Join Prefix 和 Join Suffix,用来给每段内容加包裹文字, 里面可以写 <FIELDNAME> 占位符和角色名宏。不填的话各段就是裸着换行相接, 模型分不清哪句描述属于谁,这是 APPEND 效果不好时最先该查的地方。

在手机上跑端侧模型时,上下文窗口本来就小,APPEND 加三四个成员很容易把聊天 历史挤没。群聊人数控制在两三个,或者改用 SWAP,会比调 采样参数管用。

群聊里的世界书和作者注释

角色自带的世界书会随该角色一起生效,全局世界书对整个 群聊生效。作者注释是聊天级别的,对群里所有成员都一样, 想给单个角色加约束应该写进那个角色的角色卡或它自己的 世界书。

角色深度提示词(Character's Note)也受拼接模式影响:SWAP 下只有当前发言者的 那条生效,两种 APPEND 模式下全体启用成员的都会被收进去,各自按自己卡里写的深度插入。

本文讲的功能,在 PokiTavern 的安卓端可以直接用:它内嵌了一个 SillyTavern 兼容服务端,不用 Termux、不用电脑。项目开源在 GitHub