SOP · 强制中文思考(prompt_hint 重新启用)¶
主题:prompt-hint-cn-20261011
日期:2026-10-11
类型:C 类变更(改 config.yaml → 需 备份 + 离线验证 + 重启代理)
1. 背景¶
思考(reasoning)占输出约 71%,按 ¥4/百万 计费,却常输出英文——用户付费却看不懂(原话「我钱呢」)。本机既已长期开着思考(用户手动档 获得与神的对话,见 logs/state/thinking_levels.json 的 manual: "on"),那就必须让它可读——这是纯浪费的止血点。
thinking.prompt_hint 正是现成杠杆:把一段固定文本追加到首条 system 消息末尾。它在 2026-10-06 因「降思考无收益」被关闭,本次目的已变(不是降思考,而是强制中文思考)。
2. 目标¶
- 每条请求的 system 消息都带上固定中文约束,思考与正文均出中文。
- 文本固定不变(I7 硬要求,见第 5 章坑);启用只付一次性全量前缀重建。
3. 前置条件¶
venv存在(离线验证脚本用./venv/bin/python)。- 代理可重启(
rule-agent-efficiency口径:重启共享服务可直接重启、不打断输出流)。 - 启动代理须用 venv 解释器:
PYTHON_BIN="$PWD/venv/bin/python" ./run.sh …(历史进程即用 venv 启动,默认python3会因绑定占用/依赖差异失败)。
4. 影响范围¶
- 单机、无需停服;重启只中断约 1 秒(旧进程
TERM退出 → 新进程绑定)。 - 触及:
config.yaml(thinking.prompt_hint由""改为固定文本)。 - 一切经本代理的请求都受影响;
prompt_hint变化即 system 消息变化 → 一次性全量前缀重建。
5. 分步操作¶
步骤 1:改 config.yaml 的 thinking.prompt_hint¶
注意事项与坑:
- 文本必须固定不变(config 注释 + proxy.py 头注 I10 都写死):随请求变化 → 每次前缀失效、反而更贵。
- 只对首条 system 消息生效;无 system 消息的请求不改(apply_prompt_hint 返回 False)。
- 幂等:已在位不重复追加;每请求从客户端消息重建,不累积。
cd ~/Documents/services/token_proxy
# 备份(先做)
cp -p config.yaml prompt-hint-cn-20261011/backup/config.yaml.bak.$(date +%Y%m%d-%H%M%S)
# 改(用编辑工具把 prompt_hint 由 "" 改为固定文本);核对 YAML 可解析
python3 -c "import yaml;c=yaml.safe_load(open('config.yaml',encoding='utf-8'));h=c['thinking']['prompt_hint'];print(bool(h and h.strip()), repr(h))"
预期:True '【硬性要求】思考(reasoning)与回答一律使用简体中文,禁止使用英文思考或作答。'。
失败判断:YAML 解析报错 → 文本含未转义字符,改用双引号块标量。
步骤 2:离线验证(假上游 + 临时端口)¶
./venv/bin/python prompt-hint-cn-20261011/verify_prompt_hint_cn.py
预期:A1–A6、C1–C2、B1–B9 全过(含「上游 system 含 hint」「hint 只 1 次」「thinking/effort 仍注入」)。
失败判断:B8 失败 → 临时 config 的 schema 过期(应为 default_effort / escalated,非旧的 stage_efforts)。
步骤 3:重启代理¶
坑:旧进程若不是 run.sh 启的(无 logs/proxy.pid),./run.sh restart 会「跳过停止」→ 新进程绑定失败(Errno 98 Address already in use)。须先按 PID 停掉旧进程。
ps -eo pid,cmd | grep -E '[p]roxy\.py' # 找旧 PID
kill <旧PID>; sleep 2 # 未退出则 kill -9
PYTHON_BIN="$PWD/venv/bin/python" ./run.sh start
./run.sh status
预期:[运行中] PID=…。
6. 验证¶
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8788/healthz # 预期 200
python3 -c "
import json
for l in open('logs/usage.jsonl',encoding='utf-8'):
r=json.loads(l)
if r['ts']>='<重启时刻>': print(r['ts'][11:], r['prompt_tokens'], r['cache_miss_tokens'])
"
实测(2026-10-11):
- 离线:A/C/B 全过(C 项给出 prompt_hint 指纹 sha256[:12]=af6cfce64aae)。
- healthz → 200。
- 生效证据:重启后首个请求 16:59:15 prompt=287,141 miss=282,917(98.5% = 一次性全量重建,≈¥0.28);紧接 16:59:21 miss=335 回到正常 → 说明 hint 已进入并被缓存。
- 「思考是否真出中文」需人工观察下一轮思考(脚本判不了)。
7. 回滚¶
备份位置:prompt-hint-cn-20261011/backup/,逐条登记见 backup/README.md。
cd ~/Documents/services/token_proxy
cp -p prompt-hint-cn-20261011/backup/config.yaml.bak.<TS> config.yaml
ps -eo pid,cmd | grep -E '[p]roxy\.py' # 停旧,再用 venv 启新
kill <旧PID>; PYTHON_BIN="$PWD/venv/bin/python" ./run.sh start
回滚后验证:python3 -c 读 config.yaml 的 prompt_hint 应为 "";且回滚本身又是一次全量重建(约 ¥0.28)——故除非确有问题,不要来回切。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
| 文本一改就整段重建(¥0.2~0.3/次) | 文本写成常量、写进规则;确需改时明确这是花钱操作 |
| 模型未必听(仍出英文) | 观察 1~2 轮;无效则置空回滚(又是一次重建),并改走别的路子 |
| 重启占用端口失败 | 先按 PID 停旧进程;用 venv 解释器启动 |
与 reasoning_effort 冲突 |
离线 B7/B8 已验 thinking 与 effort 仍正常注入 |
附录 · 交付物与回滚点¶
| 交付物 | 路径 | 说明 |
|---|---|---|
| 中文思考约束 | config.yaml → thinking.prompt_hint |
固定文本,追加到首条 system 消息 |
| 离线验证 | prompt-hint-cn-20261011/verify_prompt_hint_cn.py |
对齐新 schema + 核真实 config |
| 口径修正 | SKILL.md 红线 8 / lessons-and-retractions.md §8 / skill-edit-guard 头注 |
区分「改文本」与「增删 skill」 |
| 回滚点 | prompt-hint-cn-20261011/backup/ |
台账 backup/README.md |
来源:
/home/rain/Documents/services/token_proxy/prompt-hint-cn-20261011/SOP.md| 最后更新:2026-10-11 17:00(由build/sync.py同步,请勿在站点侧修改)