跳转至

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. 目标

  1. 默认每步注入 {"thinking":{"type":"disabled"}},不注入 reasoning_effort;
  2. 三类信号升档到 enabled + high:窗口内工具执行失败 3 次、疑难关键词命中、手动提档口令;
  3. 每步落盘档位与触发原因,可事后统计各原因触发频次;
  4. 子代理(不同 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. 验证

  1. 启动日志(logs/proxy.log)应含:思考注入=默认={"type": "disabled"} | 升档={"type": "enabled"}/high | 触发=失败3次/8步·保持10步·疑难12词·手动1上1下;
  2. 之后每步在 logs/usage.jsonl 的 thinking_level / thinking_reason 应可读,默认步为 off/default;
  3. 跑 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)

现象:收尾自查块在答复里不渲染成表格,**效率分析** 显示为字面星号,长行被截断。

根因:助手把收尾块包进了代码围栏,违反规则「把输出原样贴进答复(不得包进代码块)」。与思考开关无关。两条独立证据:

  1. 「获得与神的对话」手动提档(thinking=high)那一轮同样坏,说明不是关思考引起;
  2. 受控对照 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 同步,请勿在站点侧修改)