dsh-language-guard:在长会话里锁住 DSH 智能体的思考与回复语言

前言

在 DeepSeek Harness(DSH)里跑智能体时,system prompt 会拼出身份、策略、交付物引用等很多 section,其中体量最大的是英文写的工具说明,而且落在提示词中间。官方 README 在 DSH 0.2.1-rc.2 上实测:order 50 之后的内容里,约 98.1% 的字符来自英文工具说明,首段与末段之间隔着 5.7K–14K 字符。短会话里在顶端写一句「请用中文回答」往往够用;一旦连续调工具、读长文件或做长链推理,内部推理和回复就容易滑回英文,而你的设置并没有变。

dsh-language-guard(语言守卫)是社区维护者 58fly 发布的 DSH 插件,分类属于模型推理。它在 system prompt 的首、中、尾三处注入语言约束,并提供三档强度、设置面板与侧栏快速切换。插件零运行时依赖、无需构建,改动配置后下一条消息即生效。本文基于其 GitHub 仓库 说明整理安装与用法;插件目录页见 SkillHub(社区目录,与 DeepSeek / 幻方无官方从属关系)。

这是什么

一句话:dsh-language-guard 通过常驻的 system prompt section,把内部推理、用户可见回复、计划类文本,以及工具调用 description 参数(含 PTC 模式下 run_code 的卡片标题)约束到你选定的目标语言;默认目标为简体中文(zh-CN),默认强度为「强化」(C)。

与在对话里反复提醒「用中文」不同,本插件针对的是「英文工具说明把模型拉回英文」这一根因:除首尾约束外,强化档与周期档还会在全部工具说明(tools:sdk,order 5000)之后插入一段重申(language-guard:mid,order 5100)。

核心机制与三档强度

插件通过 ctx.systemPrompt.section() 注册三个永不注销的 section,切档只改文本:

section 名 order 位置 B C D
language-guard:head -2000 最前 ✅ ✅ ✅
language-guard:mid 5100 工具说明之后 ❌ ✅ ✅
language-guard:tail 11200 最后 ✅ ✅ ✅

README 给出的常驻字符开销(简体中文文案):B 档约 1022 字符/步,C 档约 1168 字符/步;C/D 档每次多出的中段约 146 字符。

设置面板上的三档说明与文档一致:

档位 配置值 说明
基础 B 只在提示词首尾各放一段语言约束,成本最低,适合短会话。
强化 C 在基础之上,于工具说明之后补一段重申,抵消英文工具说明带来的语言漂移,推荐默认。
周期 D 在强化之上,每 N 轮在当轮开头追加一条语言自检提醒,适合长会话;提醒会出现在会话日志中。

周期档的间隔字段 injectEveryNRounds 默认 8,取值 3–50;提醒在命中轮的第一个 step 注入,重启或恢复会话后轮次计数不归零。

安装与启用

环境要求:DSH >= 0.2.1-rc.2,Node ^22.19.0 || >=24.0.0。dependencies 为空,peer 依赖均为 optional。

图形界面(推荐)

  1. 打开侧栏「插件」页。
  2. 点「添加插件」,粘贴包名 dsh-language-guard。
  3. 安装完成后点「立即启用」。

命令行

dsh plugin add dsh-language-guard

团队或 CI 可固定版本(README 示例):

dsh plugin add dsh-language-guard@0.2.1

npm 不可达时可从 GitHub 安装:

dsh plugin add https://github.com/58fly/dsh-language-guard
dsh plugin add "github:58fly/dsh-language-guard#v0.2.1"

确认启用成功:侧栏底部、设置旁出现语言图标(较宽时显示「简体中文 ▾」);插件页已安装列表中有 dsh-language-guard 且能打开配置卡片。若看不到任何控件,通常是插件未启用——配置 UI 仅在插件启用时注册。

安装前请自行阅读仓库源码与 MIT 许可证。插件在当前 DSH 进程权限下运行,与宿主共享对配置与会话数据的访问能力。

配置项

七个字段均为 volatile:保存后无需重启 DSH,下一条消息即使用新配置。

字段 类型 默认值 说明
languageMode "" \| "auto" \| "manual" "" auto 跟随界面语言,manual 固定 targetLanguage
targetLanguage string "zh-CN" BCP-47 标签;预设含 zh-CN、zh-TW、en、ja、ko
strength "B" \| "C" \| "D" "C" 强度档位
injectEveryNRounds number 8 仅 D 档生效,3–50
preserveCodeTerms boolean true 为 true 时保留代码、路径、标识符等原文
extraRules string "" 追加到内置规则之后
overrideHead string "" 非空则完全替换内置首段(高级)

手写 cordis.patch.yml 时需注意:patch 对 config 是整体替换,须写全字段,例如:

- id: dsh-language-guard
  name: dsh-language-guard
  config:
    languageMode: auto
    targetLanguage: zh-CN
    strength: C
    injectEveryNRounds: 8

自动模式下,目标语言优先来自 DSH「设置 → General → Language」的界面语言;读不到时用 targetLanguage 兜底。标准安装下界面语言多为 zh 或 en,zh 会映射为 zh-CN;需要繁体、日语、韩语等请切到手动模式并选择对应标签。

典型用法

设置面板

路径:侧栏插件页 → 已安装 → dsh-language-guard。可在此选择自动/手动、三档强度、目标语言、是否保留代码术语原文,以及附加规则等。保存提示为「已保存 · 无需重启,下一条消息即生效」。

侧栏快速切换

侧栏底部语言按钮打开下拉菜单:第一项为「自动」(跟随界面语言),其后为五个预设语言。选择后立即写入配置;选具体语言会同时将模式设为手动。

/language 命令

仅影响本次运行的内存覆盖,不写盘:

/language          报告当前语言与配置值
/language ja       本次运行切到日语
/language reset    清除覆盖,回到配置值
/language default  等同 reset

优先级:内存覆盖 > 配置值 > 默认值。

验证是否注入成功

发一条消息后,可从会话日志 ~/.dsh/sessions/.../session.v4.jsonl.zstd 中检查 system/message 是否包含「【语言锁定 · 最高优先级】」等标记;强化档应命中 head、mid、tail 三段。仓库提供 node scripts/verify-installed.mjs 做一键自检(需系统有 zstd)。

适用场景与注意

适合:需要长时间用同一目标语言做推理与回复的 DSH 会话;希望工具调用描述、计划与子智能体说明也统一语言;不想依赖外部翻译服务、希望约束在生成层完成。

与其他插件:若同时使用 dsh-context 的 promptPrefix / promptSuffix,会与本插件在相同 order 处重复写语言约束,文档建议清空或停用 dsh-context。官方的 cot-translation 做的是渲染层翻译且会联网;本插件不读会话内容、不发起网络请求,两者定位不同,可按需并存。

已知边界(节选):约束文案模板为写死的简体中文,仅替换语言名与代码;不改写 API tools 参数里的英文 schema;绝对锁定设计下,单轮「这次用英文答」不会临时绕过插件;周期提醒在界面上以「上下文注入 · language-guard · 语言自检」形式可见。

DSH 生态主张「一切皆插件」;dsh-language-guard 用三处 system prompt 锚点对抗长会话中的语言漂移,并以面板与侧栏把切换成本压到「下一条消息生效」。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。

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

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

Xiaoye