前言¶
在 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