分组聊天让多个角色出现在同一个对话里。它要解决的核心问题只有一个: 每一轮该由谁开口。酒馆提供四种策略,默认那种每轮掷骰,一次可能选中好几个人, 这就是群聊有时会连着跳出三条回复的原因。
四种发言顺序策略
取值定义在
group_activation_strategy
(group-chats.js:122):
| 值 | 名称 | 怎么选人 | 一轮几个 |
|---|---|---|---|
0 | NATURAL | 默认。先看你的输入里点了谁的名字,再按 talkativeness 逐个掷骰 | 1 个到全员 |
1 | LIST | 启用的成员全部入选,按成员列表顺序依次发言 | 全员 |
2 | MANUAL | 你打字时谁都不说;由其他方式触发生成时随机抽一个 | 0 或 1 个 |
3 | POOLED | 在还没开口的人里随机抽一个 | 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_mode
(group-chats.js:129)决定,三种取值。拼接发生在描述、性格、场景、对话示例
这四个字段上,逐字段把各成员的内容用换行连起来。
| 值 | 名称 | 行为 |
|---|---|---|
0 | SWAP | 默认。只放当前发言者的角色卡,轮到谁换成谁 |
1 | APPEND | 把所有启用成员的角色卡拼在一起 |
2 | APPEND_DISABLED | 拼接时把被停用的成员也算进去 |
取舍很直接。SWAP 省上下文,但发言者不知道其他人的设定,容易出现「同处一室
却互相不认识」。APPEND 让所有人互相知晓,代价是上下文消耗随成员数线性增长:
四个角色各 800 token,光角色卡就是 3200 token。
两种 APPEND 模式还多两个输入框,Join Prefix 和 Join Suffix,用来给每段内容加包裹文字,
里面可以写 <FIELDNAME> 占位符和角色名宏。不填的话各段就是裸着换行相接,
模型分不清哪句描述属于谁,这是 APPEND 效果不好时最先该查的地方。
在手机上跑端侧模型时,上下文窗口本来就小,APPEND 加三四个成员很容易把聊天
历史挤没。群聊人数控制在两三个,或者改用 SWAP,会比调
采样参数管用。
群聊里的世界书和作者注释
角色自带的世界书会随该角色一起生效,全局世界书对整个 群聊生效。作者注释是聊天级别的,对群里所有成员都一样, 想给单个角色加约束应该写进那个角色的角色卡或它自己的 世界书。
角色深度提示词(Character's Note)也受拼接模式影响:SWAP 下只有当前发言者的
那条生效,两种 APPEND 模式下全体启用成员的都会被收进去,各自按自己卡里写的深度插入。