dsh-self-review:在送达前用独立复核拦住最终回答

前言

在 DeepSeek Harness(DSH)里跑智能体时,模型往往会在一轮结束时给出一段「最终回答」。常见做法是事后人工改稿,或在提示词里要求模型自检——后者仍占用主上下文,且用户往往已经看到第一版草稿。社区插件 dsh-self-review(维护者 XiaoOu2024,分类:工作流)走另一条路:把最终回答先扣在 llm/stream 瀑布层,用一次上下文极小的独立模型调用做二次校验,只把校验后的文本送到浏览器;草稿对用户不可见。

下面介绍它的定位、工作方式、安装配置与使用时的代价。

这是什么

dsh-self-review(仓库 XiaoOu2024/dsh-self-review,目录页 SkillHub)的中文 README 标题为「隐式自检」。英文摘要说明:在回答到达浏览器之前先 hold 住,交给一次 independent、minimal-context 的模型调用复核,仅释放 verified 文本;用户 never sees the draft。

运行时唯一依赖 @deepseek-ai/schemastery(纯 JS、无构建步骤)。许可证 MIT,当前 npm 版本 0.4.2(以 package.json 为准)。

和 agent/turn-stopping 方案的区别

网上常见做法是监听 agent/turn-stopping 并改写 turn.modelOutput。在 DSH 里这条路走不通:

  • agent/turn-stopping 载荷只有 { agent, turn, signal },拿不到本轮草稿,也没有 modelOutput;
  • 触发时本轮 assistant/message 已提交并通过 agent/assistant-stream 推给前端,已显示的内容改不动。

能在「送达之前」截住字节的是 llm/stream 瀑布:每个 chunk 都经过插件;本插件在这一层缓冲 text 块。

核心功能与工作方式

模型流进入 llm/stream 瀑布 后:

  • reasoning / tool-call / 其它块:直接放行;
  • text 块:先扣住;
  • 若出现 tool-call:立刻放行已扣文本,本步转为透传(不是最终回答);
  • 当 finish=stop:发起二次调用复核;ok 放行原草稿,fix 放行修正稿(草稿从未发出)。

判定为「最终回答」的条件包括:finish.reason = stop、没有 tool-call、只有一个文本块、长度在配置的 minChars~maxChars 之间。工具步骤在第一个 tool-call-delta 到达时解冻,不额外等待。

复核上下文刻意做小:只发用户请求、草稿、以及可选的工具调用摘要(最多 digestChars 字符),不重放主会话历史、系统提示或 reasoning。复核模型只在能指出具体缺陷时返回 fix,并要求保持原结构;拿不准返回 ok。异常、超时、协议不符一律 fail-open,草稿原样放行。复核请求是手工构造的,无 sessionId/toolHistory,不会递归触发本插件。

Host 提供只读状态路由 GET /dsh-self-review/state,返回 {reviewing, startedAt, draftChars},仅本机回环 + 同源,不含回答正文。Web 客户端在 conversation.input.activity 注册 UI:会话 running 时每 350ms 轮询;Host 报告正在复核时显示旋转环与「自检中」,复核结束自动消失。

安装与启用

安装与卸载命令来自官方 README,针对 web profile:

dsh plugin --profile web add dsh-self-review

安装后刷新页面。卸载:

dsh plugin --profile web remove dsh-self-review

兼容性(重要)

package.json 中 engines.dsh 为 =0.2.1-rc.2,插件仅在当前该 dsh 版本上验证过(README 写明 verified against dsh 0.2.1-rc.2):

  • dsh 版本不满足时,plugin_manager 拒绝安装并提示;
  • 已安装但 dsh 升级后,启动时该 bundle 会被跳过,插件表现为「消失」;
  • 市场卡片会显示不兼容。

在其它 dsh 版本实测通过后再放宽限制,见仓库 PUBLISHING.md。

配置

九个字段在 schemastery Config 中声明;Web 上在 Plugins 页 → dsh-self-review 包,描述下方直接渲染表单(key dsh-self-review#self-review)。字段均为 volatile:改动写入 profile 的 cordis.patch.yml,立即生效,不打断正在被扣住的回答。

键 默认 含义
enabled true 总开关
minChars 120 短于此的回答不复核
maxChars 30000 长于此原样放行
reviewModel '' "provider/model";空 = 与回答同路由
digestChars 4000 工具证据字符预算,0 关闭
timeoutMs 60000 复核超时,超时放行草稿
subagents false 是否也复核子代理最终回答
debug false 每次复核写一行 JSON 日志
debugFile 系统临时目录 dsh-self-review.log 日志路径

无 Web 表单的 headless 等宿主仍读同一份 schema,需手写 profile patch。

隐私、成本与延迟

  • 隐私:复核会把本次问题、模型草稿、以及最多 digestChars 的工具摘要发给同一模型服务商(或 reviewModel 指定路由)。与正常对话同链路,但回答正文会再发一次;不需要时可设 enabled 为 false。
  • 成本:每条被复核的回答多 一次模型请求;输入约问题 + 回答 + 证据摘要;输出在「没问题」时约十几 token,发现缺陷时可能接近回答长度(需完整修正稿)。
  • 延迟:最终回答在复核结束前不显示,通常多 2~12 秒;推理过程仍实时流式。

典型用法与自测

日常用法即:在兼容的 dsh web profile 安装插件、按需改配置,正常对话即可;短于 minChars 的回答不会走复核。

仓库内测试脚本(不在 npm 包内)包括:

node test.mjs
node test-client.mjs

端到端需模型时,可在 headless profile 按 README 使用 test-llm-patch.yml 与 dsh headless 做验证,并查看 debugFile 日志。

适用场景与注意

适合:希望在 UI 层自动做一轮轻量文本复核、又不想把整段对话历史再塞进主上下文的 DSH 用户;算术、逻辑、自相矛盾、忽略约束、明显编造等文本层问题命中率相对较高。

限制(README 明确写出):

  • 最终回答在复核结束前没有逐字流式,观感是「思考 → 停顿 → 整段回答」;
  • 复核无法替代跑代码或查外部资料才能确认的事实;
  • 复核模型仍可能过度修正;可换更强的 reviewModel 或提高 minChars;
  • 只能校验已生成的最终文本 + 工具证据,撤不回链路中间已发生的错误。

DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。插件以当前 dsh 进程权限运行,安装前请自行查看 源码与 MIT 许可证。

结尾

dsh-self-review 在 llm/stream 层扣住最终文本,用最小上下文的二次调用做隐式自检,fail-open 保证可用性,并用 Web UI 提示「自检中」。若你的 dsh 版本为 0.2.1-rc.2 且接受额外一次请求与数秒延迟,可在 web profile 按官方命令安装试用。

  • 目录页:https://www.skillhub.cn/plugins/XiaoOu2024/dsh-self-review
  • GitHub:https://github.com/XiaoOu2024/dsh-self-review
羽毛球分组比赛记分
小程序二维码

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

小夜