#
预设解析机制
本页面向 AI 助手(小M)与深度用户:预设栈如何合并、每个可预设键覆写到哪里、在哪个环节被消费。回答用户时请转成通俗语言。
#
1. 概念模型
- 预设 = 一组稀疏的配置覆盖项。每个键有独立开关:开=参与合并,关=保留值但不生效。
- 挂载栈 = 某个作用域上的有序预设列表。越靠上优先级越高,每条有启停开关。
- 作用域 四种:
global(全局)、role(角色)、chat(单个对话)、app(内置功能:story故事 /moments朋友圈)。 - 门禁:整个数据库没有任何挂载时,解析直接返回空 → 所有消费点走原有配置,行为与无预设系统时完全一致。
#
2. 解析算法
flowchart LR
subgraph 聊天场景
G[global 栈] --> R[role 栈] --> C[chat 栈]
end
subgraph 故事/朋友圈
G2[global 栈] --> A[app 栈]
end
C --> M[合并结果<br>后应用者覆盖先应用者]
A --> M# 模块: preset resolver
def resolve(scope_chain): # 聊天: [global, role, chat]; 故事: [global, app:story]
if not has_any_mounts(): # 门禁:全库无挂载
return None
layers = []
for scope in scope_chain: # 低优先作用域在前
stack = get_stack(scope) # 按 sort_index 升序(=界面从上到下)
# 栈内翻转:底部先应用、顶部最后应用 → 顶部覆盖底部
layers += [p.overlay for p in reversed(stack) if p.enabled]
result = {}
for layer in layers: # 依次应用,后来者按合并策略处理
for key, entry in layer.items():
if not entry.on: # 键级开关关闭 → 跳过
continue
if strategy(key) == "scalar":
result[key] = entry.value # 直接覆盖
elif strategy(key) == "listUnion":
result[key] = union(result.get(key, []), entry.value) # 并集
return result
优先级总结(同一个键被多处设置时):
代码默认值 < 全局手填 < 对话手填 < global 栈底…栈顶 < role/app 栈底…栈顶 < chat 栈底…栈顶
- scalar 键(模型/温度/系统提示词等):高优先级直接覆盖。
- listUnion 键(提示词分组/世界书挂载/知识书):各层取并集,不互相覆盖。
#
3. 键面与覆写落点(全量)
#
4. 消费点清单(预设在哪些地方生效)
编辑栈(增删/排序/启停)即时写库,不需要保存按钮;生效时机见上表第三列。
#
5. 常见问题的机制解释
- 「两个预设都设了温度,用哪个?」 同一栈内位置靠上的赢;不同作用域时 chat 栈赢过 role 栈赢过 global 栈。
- 「预设挂了世界书,会顶掉角色绑定的书吗?」 不会。世界书/知识书/提示词分组是并集语义,只加不减。
- 「关掉预设里的某一项会怎样?」 该键退出合并,值保留(下次打开还在);下层或手填值重新接管。
- 「移除挂载和关闭启停开关的区别?」 效果相同(都不参与合并),启停开关是为了临时切换不丢顺序。
- 「预设改了模型,为什么当前对话的 API 配置页没变?」 覆写只作用在发送时的副本上,不改动你的原始配置——移除预设即恢复原样。