预设冲突优先级 —— 多处设置同一配置项时谁说了算
完整优先级链
同一个 scalar 配置项被多处设置时,从低到高的优先级:
代码默认值
→ 全局设置手动填写
→ 对话配置手动填写
→ 全局预设栈(自上而下)
→ 角色 / 功能预设栈(自上而下)
→ 对话预设栈(自上而下)
- 越靠右优先级越高——最右的设置覆盖前面所有
- 栈内则是上面的赢——同一个栈里排第一的预设优先于排第二的
例子
假设对话模型被以下地方设置了:
| 设置层 | 值 |
|---|---|
| 代码默认 | deepseek-chat |
| 全局手动 | deepseek-chat |
| 角色栈(预设 B) | qwen-max |
| 对话栈(预设 A) | deepseek-v3 |
最终生效的是 deepseek-v3——对话栈的预设 A 排最右,优先级最高。
两个例外
listUnion 键(并集)
提示词分组、世界书挂载、知识书挂载——这些是并集语义,只加不减,不会互相覆盖。所有层挂的都会生效。
预设不修改原始值
预设只在发送时临时覆写,移除挂载即恢复原样。你的全局手动设置、角色设置等原始值不会被预设修改。
冲突排查
想知道某个配置项最终用了哪个值,看「上下文与思考日志」——日志里会显示预设解析后的实际生效值。
设计理念
这个优先级链的核心设计是:离当前这次请求越近的设置,优先级越高。对话栈离得最近(就是当前对话的设置),所以优先级最高。全局设置离得最远,所以作为兜底。
这样做的好处是:你可以用全局栈设好默认行为,给每个角色加专属调整,在个别对话里再灵活覆盖——三层叠加但互不打架。