SOP:思考档位控制(默认关思考 + 三类升档)¶
主题目录:
thinking-mode-control-20261010/;变更日期 2026-10-10。改动对象:config.yaml、proxy.py。
1. 背景¶
代理原先对 DeepSeek 注入显式思考(default: enabled、reasoning_effort: high),实测思考占输出 62.7%(2026-09-12 至 2026-10-10、23226 次请求),且 10 月已升到约 68%。同时 DeepSeek 官方文档明确:带 tools 时历史轮次的思维链会回传并计入上下文,故开思考在输入侧还要再背一份成本。
对本机任务形态的核对结论:9034 个带工具名的步里,本地「读 / 改 / 跑」三类占 92.7%,外网检索仅 0.7%、1502 轮中只有 3.3% 用到。任务以确定性执行为主,长思维链价值低,故改为默认关思考、只在三类信号下升档。
2. 目标¶
- 默认每步注入
{"thinking":{"type":"disabled"}},不注入reasoning_effort; - 三类信号升档到
enabled+high:窗口内工具执行失败 3 次、疑难关键词命中、手动提档口令; - 每步落盘档位与触发原因,可事后统计各原因触发频次;
- 子代理(不同 conv_key)不继承档位;重启不丢档位状态。
2.1 子代理不继承思考链(设计约束,须保持)¶
这是有意为之,不是缺陷。机制:档位状态按 conv_key 分槽存储,conv_key 取自本会话首条真实用户输入(_extract_turn_meta);主代理与子代理的请求首条输入不同 → 各自独立,不互相继承。
配置依赖(改动时须守住):
escalate段必须留在thinking下,且不得在thinking或escalate里引入任何「全局 / 会话无关」的开关或时间窗(一旦引入,子代理会一起命中,约束即被破坏);- 手动档口令只对说出该口令的会话生效:主代理说「获得与神的对话」,子代理(取数用)仍走默认
off,符合预期; - 子代理的失败计数独立累加,不影响主代理档位。
复验方式(离线已覆盖 U11r:新会话不继承旧会话档位;如后续改动触碰此处,须重跑):
cd /home/rain/Documents/services/token_proxy
./venv/bin/python thinking-mode-control-20261010/offline_verify.py
预期:U11r 反例:新会话不继承旧档位 为 PASS。
3. 前置条件¶
- 可写的
config.yaml与proxy.py,备份已生成(见第 7 章); ./venv/bin/python可用;离线验证不占用线上 8788 端口。
4. 影响范围¶
- 组件:
token-proxy(systemd --user 服务,监听 0.0.0.0:8788); - 不停服即可重启(约 2 秒);重启会造成一次前缀重建(既有代价,与本次改动无关);
- 影响面:所有经
/ds路由的 DeepSeek 请求的思考开关;/glm、/mi由skip_models原样放行,不受影响。
5. 分步操作¶
步骤 0:备份(脚手架一次做完)¶
docgen/backup_ledger.py 建主题目录、按相对项目根备份并登记台账。
cd /home/rain/Documents/services/token_proxy
python3 docgen/backup_ledger.py thinking-mode-control-20261010 --backup config.yaml proxy.py
预期:输出两行「备份 …」;thinking-mode-control-20261010/backup/README.md 增加两行登记。
步骤 1:改配置(config.yaml 的 thinking 段)¶
把默认档改为 disabled、新增 escalated、删去 stage_efforts、新增 escalate 段。
cd /home/rain/Documents/services/token_proxy
cp config.yaml config.yaml.bak.$(date +%Y%m%d-%H%M%S) # 已由步骤 0 完成时跳过
python3 -c "import yaml,sys; yaml.safe_load(open('config.yaml')); print('YAML_OK')"
预期:YAML_OK。关键字段:thinking.default.type=disabled、thinking.escalated.type=enabled、thinking.reasoning_effort=high、thinking.escalate.{failure_threshold:3, window_steps:8, hold_steps:10, hints:[…12 词], manual_on:[获得与神的对话], manual_off:[无量天尊]}。
步骤 2:改实现体(proxy.py)¶
新增档位状态与判定,覆盖 thinking_stages 旧路径。要点:
- 状态文件
logs/state/thinking_levels.json({"<conv_key>":{manual,fails,hold_until,step,last_fail}}),SIGTERM 时随阶段一并落盘; - 判定函数
_apply_thinking_signals:优先级 manual_off > manual_on > 失败窗口 > 疑难关键词 > 保持期 > off; - 失败信号复用既有
_last_tool_result,只认命令类工具的显式退出码,非命令类恒为 None,故文件正文里的报错字样不会误判;同一结果指纹只计一次; - 注入:off 档写
disabled且清掉reasoning_effort;high 档写enabled+high; - 每步在
usage.jsonl增thinking_level/thinking_reason两键,旧记录保持可读。
cd /home/rain/Documents/services/token_proxy
./venv/bin/python -m py_compile proxy.py && echo COMPILE_OK
预期:COMPILE_OK。
步骤 3:离线验证(假上游 + 临时端口)¶
不触碰线上代理:临时配置在 /tmp/thinking_level_test,假上游 18990、代理 18789。
cd /home/rain/Documents/services/token_proxy
./venv/bin/python thinking-mode-control-20261010/offline_verify.py
预期:16/16 通过(含 5 条反例:排障/根因不触发、失败不足阈值、非命令类报错不计数、失败分散、新会话不继承)。失败判断:任一 FAIL 即按第 7 章回滚。
步骤 4:重启生效¶
systemctl --user restart token-proxy ; sleep 2 ; systemctl --user is-active token-proxy
预期:active。
6. 验证¶
- 启动日志(
logs/proxy.log)应含:思考注入=默认={"type": "disabled"} | 升档={"type": "enabled"}/high | 触发=失败3次/8步·保持10步·疑难12词·手动1上1下; - 之后每步在
logs/usage.jsonl的thinking_level/thinking_reason应可读,默认步为off/default; - 跑 3 天(2026-10-10 12:53 起至 2026-10-13)后,用
cost_audit复核思考占输出应由 62.7% 降到 10% 以下,返工次数不上升;同时看thinking_reason分布,统计failure/hint/manual_on三类升档的触发次数与误触情况(误触高则收hints、调failure_threshold/window_steps)。
cd /home/rain/Documents/services/token_proxy && python3 cost_audit/selfcheck.py --last 3
观察期结束判据(三条同时成立才算达标):① 思考占输出 <10%;② 返工次数与改动前可比;③ 疑难关键词误触(事后判为不必 high 的步)占比可接受(<10%)。任一不达标 → 按第 7 章回滚或收窄参数。
7. 回滚¶
- 备份位置与台账:
thinking-mode-control-20261010/backup/README.md; - 文件:
config.yaml.bak.20261010-124932、proxy.py.bak.20261010-124932; - 步骤:
cd /home/rain/Documents/services/token_proxy
cp thinking-mode-control-20261010/backup/config.yaml.bak.20261010-124932 config.yaml
cp thinking-mode-control-20261010/backup/proxy.py.bak.20261010-124932 proxy.py
/usr/bin/rm -f logs/state/thinking_levels.json
systemctl --user restart token-proxy ; sleep 2 ; systemctl --user is-active token-proxy
- 回滚触发判据(任一即回滚):① 启动日志不含上述摘要或服务非
active;② 离线验证未达16/16;③ 统计到明显误拦或任务质量下降;④ 思考占输出未降反升。 - 一键停用升档(保留默认档):把
config.yaml的thinking.escalate.failure_threshold置一个极大值、清空hints与manual_on,重启即可。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
| 失败误判把成本拉回高 | 只认命令类显式退出码;非命令类不判;同一结果指纹只计一次(离线 U9r 覆盖) |
| 疑难关键词误触 | 只收「描述难定位」的词,排除排障/根因/失败等运维高频词;每步记 thinking_reason,可按原因统计后再收词 |
| 提档后不降持续烧钱 | 保持期 hold_steps=10 步,窗口内无失败自动回落(离线 U8 覆盖);手动档可用「无量天尊」解除 |
| 重启丢档位 | 状态落盘 thinking_levels.json,启动恢复(U11r 覆盖不继承语义,落盘由 SIGTERM 钩子保证) |
| 与缓存探测冲突 | 无交互:本次只改请求体注入值,_probe_* 路径未动,离线脚本亦未启用探测 |
9. 复盘:收尾块格式问题(2026-10-10)¶
现象:收尾自查块在答复里不渲染成表格,**效率分析** 显示为字面星号,长行被截断。
根因:助手把收尾块包进了代码围栏,违反规则「把输出原样贴进答复(不得包进代码块)」。与思考开关无关。两条独立证据:
- 「获得与神的对话」手动提档(thinking=high)那一轮同样坏,说明不是关思考引起;
- 受控对照 12 次零差异:变体 A(单轮无工具)与变体 B(带 tools 两轮)各 3 次 × 2 臂,disabled 与 enabled 均
0/3 打坏分隔符、0/3 包代码块、3/3 逐字未改,脚本见format_ab_test.py。
处置:把规则 rule-agent-efficiency.md 的收尾自查改为每轮必出(原仅多步执行类),并明确禁止用代码围栏包裹;本条结论替代此前「关思考导致格式坏」的推断(该推断作废)。
边界:代理不落响应正文,出错那一轮的原始文本无法回溯,故结论限定为「单轮与带工具多轮两种条件下均未复现」,不外推到全场景。
10. 结论:档位切换与上下文精简无因果(2026-10-10)¶
现象:实盘「无量天尊」降档那一轮,prompt 从 242,629 掉到 173,801(-28%),与档位 high→off 同一时刻,疑似档位变化触发上下文精简。
结论:无因果。档位切换只改 thinking 参数,不动 messages;prompt 骤降由新提问引发的上下文重写(话题切换)造成,与档位无关。
受控验证(离线上游,两遍同结果,脚本 level_vs_compress_test.py):
- A 组(唯一变量=档位):同一条消息序列(4568 字符)分别在
off/high/off三种档位下发,规模恒为 4568 → 档位切换不改上下文;同时确认 off 与 high 均真实出现(排除假阴性); - B 组(唯一变量=话题):档位恒
off,仅追加一条新用户消息,规模 4568 → 4632 → 只有追加消息才使规模变化。
复跑:./venv/bin/python thinking-mode-control-20261010/level_vs_compress_test.py,退出码 0 = 结论成立。
附录:交付物清单¶
| 文件 | 说明 |
|---|---|
offline_verify.py |
离线验证脚本,16 用例(11 正例 + 5 反例),可重复执行 |
format_ab_test.py |
格式对照脚本:变体 A(单轮无工具)/ B(带 tools 两轮),验证思考开关是否打坏分隔符;./venv/bin/python …/format_ab_test.py 3 B |
level_vs_compress_test.py |
档位 vs 上下文精简对照:A 组锁消息序列只切档位、B 组锁档位只换话题;两遍同结果 |
backup/config.yaml.bak.20261010-124932 |
改前配置 |
backup/proxy.py.bak.20261010-124932 |
改前实现体 |
backup/README.md |
备份台账 |
来源:
/home/rain/Documents/services/token_proxy/thinking-mode-control-20261010/SOP.md| 最后更新:2026-10-10 14:12(由build/sync.py同步,请勿在站点侧修改)