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 目錄頁。

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

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

小夜