dsh-zh-thinking:用常驻 system prompt 让 DSH 模型用简体中文思考与作答

前言

在 DeepSeek Harness(DSH)里希望模型全程用简体中文做内部推理(thinking / reasoning)并回复用户,常见做法是在 AGENTS.md 里写「请用中文思考」。这条路径会随会话变长而失效:AGENTS.md 经 agent-instructions 以 user 角色注入,只在文件被读/写/编辑时刷新;注入内容进入对话历史,会被 compaction 压缩遮蔽;模型推理语言还容易被最近一条英文工具输出拉回英文。README 中的实测数据是:注入后前两块推理的中文字符占比约 64.8% / 64.5%,同一会话跑到第 89 块时完全回退英文,长会话整体只剩 5%–25%。

下面介绍社区插件 dsh-zh-thinking(维护者 programerror233,分类:模型推理)。它通过向系统提示注册常驻 section,让规则在每一步 assemble() + renderPrompt() 时都在模型眼前,不进入历史、不被压缩丢弃,并对所有会话、工作区与子代理生效。

这是什么

dsh-zh-thinking 是发布在 npm 的包(当前版本 0.1.0,MIT 许可),面向 DSH 用户:强制 Harness 中的模型用简体中文书写内部推理与面向用户的最终回复。安装后热加载立即生效,正在运行的会话无需重启。

插件页:SkillHub 目录
源码与说明:GitHub programerror233/dsh-zh-thinking

DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

原理简述

DSH 的 dsh-agent-loop 每一步都会重新组装并渲染 prompt;SystemPromptProjection.project 在文本不变时可零提交。写进 system prompt 的规则因此:

  1. 每一步都生效,不是「提醒一次然后衰减」;
  2. 不进入对话历史;
  3. 不会被 compaction 压缩(压缩只处理 surface 节点 0 之后的节点)。

插件使用独立 section 名 zh:reasoning-language,避免被各 agent preset 里已有的 persona 相关 section 遮蔽,从而对全局所有 agent(含子代理)生效。order: 1 使其紧跟人格前缀(order: 0)之后、排在工具说明之前,属于身份级指令。

安装与启用

官方推荐通过 DSH 的 plugin 命令安装(命令来自 README,请替换为你的 profile 名):

dsh plugin --profile <你的 profile 名> add dsh-zh-thinking

例如 profile 名为 desktop:

dsh plugin --profile desktop add dsh-zh-thinking

安装后 dsh 会把它列入 profile 的 dsh.profile.bundles,bundle 补丁层自动挂载。

注意: 插件以当前 dsh 进程权限运行;安装前建议在 GitHub 上查看源码与 LICENSE(MIT),确认符合你的安全与合规要求。

手动安装(不走 npm)

README 说明可将仓库放到本地,在 profile 的 cordis.patch.yml 末尾追加(路径需改为你的绝对路径;Windows 请用 file:/// 形式,裸盘符路径会报 ERR_UNSUPPORTED_ESM_URL_SCHEME):

- insert:
    - id: zh-thinking
      name: file:///绝对路径/dsh-zh-thinking/lib/index.js

npm 安装与上述手动 insert 不能同时存在(同一 section 名会触发 prompt section "zh:reasoning-language" is already registered)。迁移时需先删掉手动那段,再执行 dsh plugin ... add dsh-zh-thinking。

配置(可选)

可在 profile 的 cordis.patch.yml 里覆盖插件项:

- id: zh-thinking
  name: dsh-zh-thinking
  config:
    sectionName: zh:reasoning-language   # section 名,改它没有实际必要
    order: 1                             # 越小越靠前;0 是 persona-prefix
    text: |-                             # 完全自定义提示正文
      你的语言要求正文。
字段 类型 默认值 说明
sectionName string "zh:reasoning-language" 须为新名字,避免被 preset 同名 section 覆盖。
order number 1 0 为 deployment:persona-prefix,10200 为 deployment:persona-suffix。
text string 见 README 勿包含 {{,否则会被当成提示变量引用而抛错;插件会回落内置文本并打印警告。

默认正文要点:内部推理与最终回复均用简体中文,优先于示例语言与英文任务描述/工具输出;代码标识符、路径、API 名等可保留 ASCII,但需用中文说明包围;若发现用英文思考,应先用中文重写再继续。

典型用法与验证

安装后无需额外操作即可全局生效。若要确认 section 已注入,可在任意会话启动后查看日志里的 system/message 事件(可用 dsh 的 inspect 能力或直接读会话 JSONL),正文中应出现 # 语言要求(最高优先级) 等默认或自定义文本。

README 记载的实测(Windows 上原始版本):本会话 system/message 长度从不含语言要求的 8016 变为 8297,语言要求位于第 116 字符处;注入后连续 12 块推理的中文字符占比均值 46.2%,注入前同一会话 239 块均值 3.6%。新派子代理的 system/message 同样包含该规则,子代理推理块占比示例为 28.8% / 50.9% / 56.5% / 81.8%,最终回复为纯中文。

成本与兼容性

常驻规则约 300 token,每一步命中 prompt 缓存。README 按中文约 0.7 token/字估算:235 步会话约 7 万 cacheRead token,占该会话总 cacheRead 的 0.62%。对比每步追加 60 字提醒消息,累计约 9870 token 且会被 compaction 丢弃,更贵也更不可靠。

  • 零 import,不依赖 profile node_modules 解析矩阵;
  • 仅依赖公开 API ctx.systemPrompt.section()(dsh-system-prompt);
  • 要求 Node >= 20(见 package.json)。

适用场景与已知边界

适合: 长期在 DSH 中开发、希望 thinking 与用户回复稳定使用简体中文,且不愿依赖会衰减的 AGENTS.md 提示的团队或个人。

边界(README 原文):

  • 同一 section 名只能注册一次;与其他注册 zh:reasoning-language 的插件冲突时需改 config.sectionName 或只保留一个。
  • 只影响此后新产生的推理,历史英文 reasoning 不会改写。
  • 不能强制 100% 中文字符占比(路径、命令、API 名等按设计保留 ASCII)。
  • 模型仍可能偶尔夹杂英文短语;规则是概率性约束,不是硬编码。

卸载

dsh plugin --profile <你的 profile 名> remove dsh-zh-thinking

结尾

dsh-zh-thinking 把「用简体中文思考与作答」从易衰减的历史消息,改成每步都存在的 system prompt section,覆盖主会话与子代理,并支持可选自定义正文。需要安装命令、手动补丁与配置字段时,以 GitHub README 为准;目录索引见 SkillHub。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜