前言¶
在 DeepSeek Harness (DSH) 的开发中,ask_user_question 工具常用于向用户发起交互。如果不对工具的描述做约束,模型在生成选项时容易产生视角漂移:同一个选项里,标签可能是“我”(用户视角),而描述却变成了“我”(AI视角),导致用户无法判断当前正在执行动作的是谁。
dsh-narrative-voice 插件通过在 prompt-assembly 阶段重写工具描述,强制 ask_user_question 中的问题、选项保持统一的叙述视角,解决这一问题。
这是什么¶
这是一个 DSH bundle 插件,由 TellToday 维护。它会在 DSH 构建系统提示词时介入,重写 ask_user_question 工具的 questions.description 字段,植入固定的代词规则。
插件支持两种叙述模式,并通过 /voice 命令实时切换。它不依赖其他第三方库,采用 MIT 许可证。
核心功能¶
-
视角重写
插件在SystemPrompt.assemble()阶段监听system-prompt/assemble事件,找到ask_user_question工具,修改其参数描述。它只处理代词出现的地方,不强制修改不需要代词的内容。 -
双模式支持
根据配置,支持两种叙述方案:- Scheme A (
voice: "ai"):选项由 AI 叙述,内部使用“我”指代 AI,“你”指代用户。 - Scheme B (
voice: "user"):选项由用户叙述,内部使用“我”指代用户,“你”指代 AI。这是默认模式。
- Scheme A (
-
运行时控制
通过/voice命令可以开启、关闭或切换模式。该命令由宿主的commands服务处理,无需重启进程即可生效。
安装¶
安装前需确保系统中 pnpm 和 git 已在 PATH 中。
dsh plugin --profile <profile> add "github:TellToday/dsh-narrative-voice#main"
安装完成后,必须重启 profile 的进程。对于 Web profile,请使用 dsh web 重启。
典型用法¶
通过 /voice 命令控制插件行为。命令列表如下:
| 命令 | 效果 |
|---|---|
/voice on |
启用重写(从下一条消息开始生效) |
/voice off |
禁用重写(恢复原始工具描述) |
/voice user |
切换至 Scheme B(用户叙述)并启用 |
/voice ai |
切换至 Scheme A(AI 叙述)并启用 |
/voice |
显示当前状态(开启/关闭 + 激活的方案) |
配置与默认值¶
插件的默认配置在安装时已激活,可通过 profile 的 patch 文件覆盖。
| 配置项 | 默认值 | 含义 |
|---|---|---|
voice |
user |
使用的叙述方案:user 或 ai |
defaultActive |
true |
是否默认启用 |
若要修改默认配置,需编辑 $DSH_HOME/profiles/<profile>/cordis.patch.yml,完整替换配置段:
- id: narrative-voice
config:
voice: user # user (方案B: 用户叙述) | ai (方案A: AI叙述)
defaultActive: true # false = 默认禁用,需手动 /voice on
插件使用无依赖的 Standard Schema 实现进行配置校验,无效配置会在加载时报错。
适用场景与注意事项¶
- 适用场景:仅当你的应用大量使用
ask_user_question工具,且对交互视角的一致性有较高要求时适用。 - 作用范围:插件仅影响
ask_user_question工具,不会干预其他工具或普通回复。 - 依赖:插件本身无运行时依赖,但安装和运行需要宿主环境具备
pnpm和git。
结语¶
dsh-narrative-voice 是一个解决大模型视角漂移问题的轻量级插件。通过在 prompt assembly 层面介入,它确保了交互中代词的一致性。更多细节及源码可参考:GitHub