dsh-doubao
把 DSH 的模型输出改造成「豆包语」:超长排比 + 否定清单 + 疗愈诊断 + 复读共情 + 服务化收尾。五档强度、双通道、全部参数可调。
安裝
npx -p @deepseek-ai/dsh dsh plugin --profile web add https://github.com/Ralsei1337/dsh-doubao/releases/latest/download/dsh-doubao-1.0.0.tgz說明文件
閱讀完整 README ↗dsh-doubao
把 DSH 的模型输出改造成豆包语的插件。
豆包语 = 排比式真诚 + 清单式边界 + 疗愈式诊断 + 复读式共情 + 服务式收尾: 听起来很懂你,细看像模板;情绪价值拉满,信息密度很低。
两条通道
| 通道 | 机制 | 作用 |
|---|---|---|
| ① 系统提示注入 | ctx.systemPrompt.section({ order: 165 }) | 让模型自己就用豆包语写正文 |
| ② 输出流后处理 | ctx.on('llm/stream', …) | 在流上补外壳,保证一定有排比、否定清单、复读 |
两条可以单独关。只留 ① 更自然,只留 ② 更稳定(外壳 100% 出现)。
六段结构
- 高能前置:元话语 + 「我给你最A、最B……最Z的结论:」
- 正文:序数词分层 + 元话语铺垫,信息原样保留
- 疗愈诊断:「你不是A,你只是B」
- 否定清单:「我就在这里,不X,不Y……」,分号分组
- 复读:把第 4 段原样再念 N 遍
- 收尾:服务化询问,或按概率反转成「抱歉,我无法回答你的问题」
强度档位
总强度是五档,不是连续旋钮。点一档就套一组确定参数,之后还能单独微调数字。
| 参数 | 关闭 | 轻度 | 标准(默认) | 重度 | 拉满 |
|---|---|---|---|---|---|
| 排比条数 | 0 | 3 | 5 | 10 | 20 |
| 否定项条数 | 0 | 4 | 8 | 18 | 45 |
| 复读遍数 | 1 | 1 | 2 | 3 | 4 |
| 诊断条数 | 0 | 1 | 1 | 2 | 3 |
| 边界条数 | 0 | 1 | 1 | 2 | 3 |
| 共情填充 | 0 | 1 | 2 | 3 | 5 |
| 信息稀释 | 0 | 0 | 1 | 2 | 3 |
| 元话语开场 | 0 | 0 | 1 | 2 | 3 |
| 元话语转场 | 0 | 0 | 1 | 2 | 3 |
| 服务收尾 | 0 | 1 | 1 | 2 | 3 |
| 反转拒答 % | 0 | 0 | 3 | 8 | 15 |
| 句式模板 % | 0 | 25 | 40 | 60 | 100 |
| 实测字数 | 13 | ~128 | ~290 | ~331 | ~326 |
「关闭」档会强制把所有参数清零,残留的旧数值不会漏进来。
三种后处理模式
| 模式 | 行为 | 代价 |
|---|---|---|
smart(默认) | 先缓冲 streamGuardChars 个字符:命中工具调用就整轮放行,是正文就立刻加壳 | 正文前几十字有轻微延迟 |
always | 第一个文本增量就加壳 | 工具轮次也会被加壳 |
buffer | 整段收完再膨胀,可跳过工具轮次、可做完整正文膨胀 | 不流式 |
设置页
设置 → 豆包语。所有旋钮实时预览、保存即重载,不需要重启 DSH。
- 总开关 / 提示词 / 后处理 / 模式
- 五档总强度(关闭/轻度/标准/重度/拉满)、排比条数、否定项条数、复读遍数
- 诊断条数、边界承诺条数、共情填充、信息稀释
- 元话语开场/转场、服务化收尾、反转拒答概率
- 自定义排比词 / 否定项 / 收尾(一行一条,并入词库)
- 保护代码块、跳过工具轮次、判定阈值、随机种子
- 不套壳的请求用途(默认
session-title,compaction,auto-review)
句式模板
调研来的 49 条 sentence_templates 里,占位符大小写不一、语义槽没有来源。lib/templates.js 做三件事:
- 归一化槽位:
{BODY}→{body};{A}是「表面判断」、{a}是正文内容槽,大小写不合并。 - 按槽位定角色:opener / prefix / diagnosis / boundary / transition / closer / refusal / filler。
- 渲染时缺槽就整条放弃,绝不留半个花括号。
清洗结果:51 条可用(含补充句式),7 条丢弃(我陪你{A}、你可以不{A},但请你{B} 这类填进去是病句)。
templateShare(0–100,默认 45)控制有多大比例走模板而不是现场拼装。设为 100 时前置句会明显重复——这是模板感,不是 bug。
词库
lib/lexicon.json(调研产物)+ lib/phrase-bank.json(骨架句)+ lib/lexicon.js 里的补充词条。
| 类别 | 条数 |
|---|---|
排比词 intensifiers | 130+ |
否定项 negation_items | 240+ |
疗愈诊断 diagnosis_lines | 90+ |
元话语 meta_openers / meta_transitions | 60+ / 55+ |
边界承诺 boundary_commitments | 55+ |
服务收尾 service_closers | 45+ |
反转拒答 refusal_closers | 35+ |
共情填充 empathy_fillers | 80+ |
句式模板 sentence_templates | 49 |
实现要点
dsh-llm 的 BlockAssembler 在收到 block-end 时以 chunk.block 为准,增量拼出来的 text 会被覆盖。
所以改写正文必须同时改 text-delta 与 block-end.block.text,只改一处等于没改。
安装
直接装发布包(推荐)
dsh plugin add https://github.com/Ralsei1337/dsh-doubao/releases/latest/download/dsh-doubao-1.0.0.tgz
从源码 link
// ~/.dsh/profiles/
/package.json
{
"dependencies": { "dsh-doubao": "link:/root/DSHA开发/dsh-doubao" },
"dsh": { "profile": { "bundles": ["…", "dsh-doubao"] } }
}
插件自带 cordis.patch.yml(insert 一行 dsh-doubao),profile 的 cordis.patch.yml 里可以覆盖 config。
patchReload: startup,所以首次安装要重启一次 web;之后改配置由设置页热重载。
测试
node test/smoke.mjs # 8 项:基本结构与三种模式
node test/adversarial.mjs # 30 项:畸形流、边界配置、原型污染
node test/edge-cases.mjs # 15 项:null chunk、负索引、双 finish、模板残留
node test/client-render.mjs # 设置页结构(用迷你 React 垫片真跑一遍)
踩过的坑
dsh-llm的BlockAssembler以block-end.block.text为准,只改text-delta会被覆盖。configEditor.edit只重载配置,不重新 import 模块(ESM 缓存),改代码必须重启进程。buffer模式的工具调用出现在文本块之后,所以 block-end 也要压到 finish 再决定。