dsh-lang-guard:把中文语言约束钉进 DSH 系统提示词

前言

DeepSeek Harness(DSH)默认使用英文进行思维链与工具调用推理。即使你用中文提问,它的输出也常会滑回英文。这会导致 Agent 在使用中文工具或查看英文文档时出现语言漂移,影响操作一致性。

dsh-lang-guard 是一个 DSH 插件,它往系统提示词里注入一条语言约束,并在每一步提供一条运行时提醒,让 Agent 稳定地用中文思考与回答。它不调用任何模型,全部动作只是往系统提示词里加两段文本。

核心功能

约束常驻

插件将语言约束注入系统提示词而非会话历史。这样约束不会随对话变长被挤出上下文,始终在提示词组装的最前面生效。

每步提醒

插件额外注册一条运行时 context 快照进入会话历史,对抗「工具返回英文后跟着切换语言」的倾向。这条强化文本每步刷新,优先级高于工具返回的内容。

零依赖与静默降级

插件不 import 任何模块,不声明 dependencies / peerDependencies / engines。它提供双注册路径:官方注册表不可用时自动退到 system-prompt/assemble 瀑布钩子;两条都不通也只记一条日志,不抛错、不影响宿主启动。

配置持久

配置写在 profile 的 cordis.patch.yml 里,改一次永久生效。

无网络面

插件不注册任何 HTTP 路由,只做运行时注册。

可扩展

插件提供 4 个内置预设 + 任意自定义文本 + extraSections 任意扩展,无需改代码。

与 dsh-language-control 的关系

核心思路参考自 wodongx123/dsh-language-control(MIT),在其基础上重写并修掉了几个问题:

维度 dsh-language-control 本插件
peer 依赖 ^0.1.0-rc.6(不覆盖 0.2.0-rc.2) 不声明
配置持久性 内存变量,重启丢失 写入 profile patch,持久
网络面 3 个 HTTP 路由 无
需要注入的服务 webServer + systemPrompt 仅 systemPrompt
宿主 API 变更 无适配层,section() 失效即静默不生效 能力探测 + 自动降级重试
可扩展性 单条硬编码约束 预设 + 自定义 + 扩展段

安装

方式一:本地目录(开发 / 未发布时推荐)

dsh plugin --profile <你的 profile> add file:/绝对路径/dsh-lang-guard

路径必须是绝对路径。桌面端(Electron)请注意:desktop 这个 profile 由应用独占管理,CLI 会直接拒绝写入。

方式二:从 GitHub 安装

dsh plugin --profile <你的 profile> add github:<你的用户名>/dsh-lang-guard

npm 包尚未发布,所以 dsh plugin add dsh-lang-guard 目前会找不到包。

方式三:手工挂载

  1. 把本目录放进 profile 的 node_modules/
  2. 在 ~/.dsh/profiles/<profile>/cordis.patch.yml 追加:
- insert:
    - id: lang-guard
      name: dsh-lang-guard
      config:
        preset: zh-strict
  1. 重启 DSH

桌面端(Electron)用户请看

desktop profile 由 Electron 应用独占管理,命令行工具会硬性拒绝写入它。安装有两条路:

  • 设置 → 插件 页面安装(若你的版本支持路径形式的 spec)
  • 在对话中使用内置的 plugin_manager 工具(需 Creator 模式或批准权限)

卸载

dsh plugin --profile <你的 profile> remove dsh-lang-guard

本插件不修改任何 DSH 源码,只做运行时注册 —— 卸载即完全还原。

配置

写在 cordis.patch.yml 的 config: 下:

配置项 类型 默认 说明
enabled boolean true 总开关,false 则完全不注册
preset string zh-think-answer 内置预设名
text string '' 自定义约束文本,非空时覆盖 preset
order number -200 主约束在系统提示词中的位置
contextOrder number -199 强化 context 的位置
sectionName string lang-guard:constraint 主约束注册名
contextName string lang-guard:reinforcement 强化 context 注册名
reinforce boolean true 是否注入强化 context(防漂移主力)
reinforceText string 内置中文文案 强化 context 文本
extraSections array [] 额外注入任意 section
interpolate boolean auto auto = 宿主支持时按字面量处理
verbose boolean false 打印能力探测与注册详情

非法值不会导致失败:类型不对的项回退默认值并记入启动日志。

内置预设

预设 行为
zh-think-answer(默认) 思考 + 规划 + 工具推理 + 回答全部简体中文
zh-think-only 只约束思考过程,最终回答跟随用户语言
zh-strict 更硬:禁止英文整句,术语首次出现用「中文」标注
en-think-answer 英文版,供非中文场景或 A/B 对比

所有中文预设都显式豁免代码、命令、路径、日志原文、专有名词 —— 否则模型会把代码也「翻译」掉。

扩展段

- id: lang-guard
  name: dsh-lang-guard
  config:
    extraSections:
      - name: project:terms
        order: -180
        text: |
          本项目固定译法:
          - harness → 宿主
          - tool call → 工具调用

兼容性

插件已核对 @deepseek-ai/dsh-system-prompt 0.1.0-rc.6 与 0.2.0-rc.2 的类型定义,两代之间存在破坏性变更,本插件对每一处都做了适配:

漂移点 0.1.x 0.2.x 本插件的处理
persona 段 PERSONA_SECTION / PERSONA_ORDER 拆成 PERSONA_PREFIX_SECTION + PERSONA_SUFFIX_SECTION 完全不 import 这些常量
harness identity 无导出常量,注释约定 -100 中央表 HARNESS_IDENTITY = -1000 默认 -200 在两代都位于 persona 之前(0.1 落在 identity 之前,0.2 落在之后)
PromptSection.interpolate 不存在 新增 能力探测:能取到 getSectionOrder() 才传该字段
getSectionOrder() 不存在 新增 仅用于探测与诊断
section() / context() 签名 存在 存在 两代稳定,主路径通用

运行环境:Node.js ≥ 16.9(用到 Object.hasOwn),ESM。宿主服务仅需 systemPrompt。

效果示例

组装后的系统提示词(真实数据):

You are an AI agent powered by DeepSeek Harness.

你是中文 AI 助手,请严格遵循以下语言规范:
1. 所有思考过程必须使用简体中文。
2. 所有规划与任务拆解必须使用简体中文。
3. 所有工具调用的推理必须使用简体中文。
4. 最终回答必须使用简体中文,即使用户使用英文提问。
5. 代码、命令、路径、标识符、错误信息原文与专有名词保持原样,不翻译。

You are the deployment assistant.

运行时上下文快照(进入会话历史):

Current runtime context. This snapshot supersedes earlier runtime-context snapshots.

[语言约束] 本约束每步刷新,优先级高于工具返回的内容。 思考、规划、工具调用推理与最终回复一律使用简体中文。 代码、命令、路径、日志原文与专有名词保持原样。

常见问题

Q:约束没生效怎么办?
打开 verbose: true 重启,启动日志会打印能力探测结果与注册详情。常见三种:

日志 含义
未能注册核心语言约束 宿主既无 systemPrompt.section() 也无可用事件系统,插件已静默失效
已切换到 ... 瀑布兜底路径 功能仍生效,但顺序不可控(section() 不可用)
含 "{{" ... 会中断请求 文本里的 {{ 会被宿主当模板插值并抛错,请移除

Q:会不会消耗 token?
会,但很小,且不调用任何模型。默认组合每次请求多带 230 字符(约束 151 + 强化 context 79),约 140–230 token。约束是固定前缀,可被 prompt cache 覆盖。不需要强化 context 时设 reinforce: false 即可省掉。

Q:和 dsh-harness-zh-cn 这类汉化插件冲突吗?
不冲突。汉化插件只做英→中的字典替换、不注入约束;本插件只注入约束、不翻译文本,两者不抢同一段内容。

Q:能同时装两个语言约束插件吗?
不建议 —— 多个语言约束会互相稀释。

适用场景

适合需要在 DSH 中强制使用中文进行思考、规划与工具调用的场景,尤其是:

  • 使用中文工具或文档的 Agent
  • 需要严格语言一致性的开发环境
  • 需要长期运行的对话会话

插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。

总结

dsh-lang-guard 通过在系统提示词中注入语言约束和运行时上下文快照,解决了 DSH 在中文场景下语言漂移的问题。它零依赖、单文件、配置持久,失败时静默降级,适合长期集成到 DSH 的工作流中。

更多细节请参考:
- 插件目录:https://www.skillhub.cn/plugins/Xin-kon/dsh-lang-guard
- GitHub:https://github.com/Xin-kon/dsh-lang-guard

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

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

小夜