dsh-think-zh:用系统提示词固定 Agent 的中文推理

前言

在 DeepSeek Harness(DSH)里,模型的「思考过程 / Thinking」和最终回答来自同一次生成步骤,API 上没有单独的「思考语言」字段。常见做法是全程用中文提问,希望推理也跟着中文走;一旦对话里混入英文系统说明、工具输出或代码报错,推理语言很容易漂回英文。

下面介绍 maintainer lance808 维护的 bundle 插件 dsh-think-zh(社区目录分类:模型推理)。它在系统提示词中注入一段高优先级语言规则,要求 Agent 在作答前用指定语言(默认简体中文)做内部推理,并可在 Harness Web 的插件页对整个 profile 一键开关。插件零依赖、零构建,MIT 许可,当前 GitHub 星标为 0。

这是什么

dsh-think-zh 是 DSH 宿主插件:通过 ctx.systemPrompt.section() 向系统提示词贡献名为 agent:reasoning-language 的 section(bundle 行 id 仍为 think-in-chinese,与改名前的身份一致,避免已安装配置变成未加载死行)。

推理内容不是独立请求,能影响它的杠杆只有该步骤开始时模型看到的提示词。本插件不读取、不改写落盘的 reasoning 块,只影响生成时的提示词;属于提示词层面的引导,不是硬约束。

核心功能

  1. 默认只约束推理:target: think 时,最终回复语言仍跟随用户;推理通道固定为配置的语言。
  2. 可选约束回答:target: all 时,推理与回答都使用配置语言(用户明确要求换语言除外)。
  3. 原文保留:verbatim: true(默认)时,指令要求代码、命令、路径、URL、标识符、工具参数等保持原文,避免把报错和代码一并翻译进思考。
  4. 完全自定义文案:instruction 非空时替换按上述字段生成的内置指令。
  5. 真关闭:enabled: false 或插件页关闭后,不注册 section(不是注册空文本)。
  6. 作用域:行挂在 Host 平面,对该 profile 下所有 Agent(含子代理、workflow、fork)生效;不支持按会话单独开关。

section 使用显式 order: 480,排在人设之后、plan 策略与工具引导之前,避免语言规则被埋在数千 token 的工具文档后面而失去效果。

安装与启用

插件以当前 DSH 进程权限加载本地 bundle;安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。

方式一:Harness Web

在 Harness Web 的 插件(Plugins) 页面安装该 bundle,用页面开关启用或关闭。改动对整个 profile 的所有会话生效,重启后仍保留。

方式二:plugin_manager

具备 plugin_manager 工具权限的会话,对插件目录(或克隆后的目录)执行:

plugin_manager({ action: "install_bundle", target: "<本目录或克隆后的绝对路径>" })

从 GitHub 获取源码后,README 给出的安装方式为克隆仓库,再对克隆路径执行同一条 install_bundle(资料原文如此,无 dsh plugin add github:… 类命令)。

安装完成后可在插件页切换 think-in-chinese 这一行;卸载示例:

plugin_manager({ action: "remove_bundle", target: "dsh-think-zh" })

命令行确认是否加载:执行 plugin_manager({ action: "list_bundles" }),应看到 rows[0].rowId = think-in-chinese 且带有 entryId;有 rowId 无 entryId 通常表示模块未激活(例如导入失败)。

注意:本地修改 bundle 的 index.js 后,卸载重装或插件页禁用再启用不会加载新代码(ESM 按文件 URL 缓存模块),需重启 Harness 进程才会生效。

配置

用户层配置写在 cordis.patch.yml(用户 patch 优先级更高,升级不丢)。包内默认行示例:

- id: think-in-chinese
  config:
    language: 简体中文          # 思考所用语言
    target: think              # think(只约束思考)| all(思考与回答都用该语言)
    verbatim: true             # 是否加入"代码/命令/路径保持原文"的约束
    enabled: true              # 关闭后完全不注册 section
    instruction: ''            # 非空时完全替换内置指令文本
字段 默认值 含义
language 简体中文 思考语言名称,可为 繁體中文、English、日本語 等
target think think 仅推理;all 推理与回答
verbatim true 是否加入原文保留约束
enabled true 关闭时不注册 section
instruction '' 自定义指令全文,非空则取代自动生成文本

字段校验在 profile 加载时进行:target 仅 think / all,enabled 与 verbatim 须为布尔值,未知字段会报 unknown field 并给出路径,不会静默忽略。

典型用法与生效确认

肉眼确认

观察回复上方的「思考过程 / Thinking」折叠区,内容应为中文(或你配置的 language)。

用会话日志量化

推理块以 reasoning 类型写入压缩会话日志。README 给出解压与统计中文字符占比的示例:

# 日志是 zstd 压缩的 JSONL
zstd -d -c "$DSH_HOME/sessions/<workspace>/<session-id>/session.v4.jsonl.zstd" > session.jsonl
// 统计每个 reasoning 块的中文字符比
const events = readFileSync('session.jsonl', 'utf8').split('\n').filter(Boolean).map(JSON.parse)
for (const e of events) {
  if (e.type !== 'assistant/message') continue
  for (const b of e.data?.message?.content ?? []) {
    if (b.type !== 'reasoning') continue
    const cjk = (b.text.match(/[\u4e00-\u9fff]/g) ?? []).length
    const latin = (b.text.match(/[A-Za-z]/g) ?? []).length
    console.log(e.seq, (cjk / (cjk + latin || 1)).toFixed(3), b.text.slice(0, 40))
  }
}

作者在单会话抽样中报告:30 个非空推理块里 25 个中文占比达标(约 83%);长分析块(≥400 字符)全部为中文,紧跟工具调用后的短决策块仍可能漂回英文(诱因多为英文工具输出)。这是已知边界,不是改一两句文案就能完全消除的。

调整行为

  • 只希望思考中文、回答跟用户语言:保持默认 target: think。
  • 希望回答也固定中文:设 target: all。
  • 工具返回英文后仍想强化语言:可设自定义 instruction,针对「工具返回后先用目标语言复述」等场景(需自行撰写全文)。

适用场景与注意

适合:在 DSH 中长期使用支持 reasoning 通道的模型,希望推理过程稳定使用中文(或其他配置语言),又需要代码、路径、命令在思考里保持原文的场景。

注意:

  • 插件运行在 DSH 宿主进程内,安装前请审查源码与许可;社区目录 SkillHub 插件页 与 GitHub 无 DeepSeek / 幻方官方应用商店关系,DSH 生态本身是「一切皆插件」的扩展模型。
  • 约束是提示词引导,个别步骤仍可能用其他语言推理。
  • 若只对某类 Agent 生效,应把配置行放到对应 agent preset,而不是依赖 Host 平面全局开关。
  • 包版本 0.1.0,要求 Node ≥ 18;本地可运行 node test.js 做零依赖断言(schema、默认文案、注册与卸载语义等)。

结尾

dsh-think-zh 用一条常驻、排序靠前的系统提示词 section,把「内部推理用什么语言」从碰运气的上下文漂移,变成可配置、可开关的 profile 级策略。需要了解详情、提交 issue 或查看英文 README,请访问 GitHub:lance808/dsh-think-zh;在社区浏览同类插件可打开 SkillHub 目录页。

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

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

小夜