Skip to content

dsh-mimic

Verified

dsh-mimic · v0.1.3 · MIT · Web UI

A DSH host plugin that learns one real person's speaking style from QQ group messages, then lets a bot talk like a human instead of a chatbot.

Install

dsh plugin add dsh-mimic

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

dsh-mimic · 让 AI 学会像个人一样说话

DSH Plugin   OneBot 11   License

把一个 AI 拉进 QQ 群,让它默默学一个人的说话方式,然后像真人一样聊天。

不训练模型、不微调权重。 学到的是这个人的口癖、句子长度、标点习惯、表情包偏好——以及最重要的,他什么都不说。


这个插件解决什么

大模型有个很难除掉的毛病:它说话太完整了。它会分点、会总结、会在结尾祝你顺利、会每句都答。

你要它"像真人一点",它只会变得更礼貌——因为那正是它被训出来的平均脸。

这个插件的做法是:找一个人给它当坐标系。人味不在优点里,在缺陷里——说话没头没尾、懒得解释、句子打到一半、对某些问题干脆不回。


效果

默认状态(没开模仿):

群友:今天又加班到十点 机器人:加班到这么晚确实很辛苦,建议你注意休息,保持规律的作息,长期熬夜对身体的危害是很大的。

模仿模式开启后:

群友:今天又加班到十点 机器人:啊? 机器人:你们公司还没倒啊

区别不在用词,在它没有把话说完整。


功能

  • 静默采样:只听不说,把指定人的发言按人切片落盘,连带保留前一句别人的话当语境
  • 冷启动:进群就能拉群历史(能不能拉到取决于后端,拉不到会落盘原因)
  • 表情包库:收到即下载(QQ 图片 URL 带 rkey 会过期,只存链接必废)+ 按语境检索
  • 结构化画像:不是一段散文式人设,是可校验、可手改的数字和清单
  • 续写式模仿:不写"请你扮演一个人",而是把真实对话铺好让它接着说
  • 风格校验:生成后过一道规则打分,翻车成客服腔就重写
  • 发言时机:深夜装死、概率性装没看见、有自己的冷却
  • 盲测:真假混排让你猜,这是唯一的成败标准

快速开始

pnpm dsh plugin --profile web add dsh-mimic

重启 dsh web,进入 设置 → 人格蒸馏。

五步上手

  1. 填 OneBot WS 地址(默认 ws://127.0.0.1:3001)和 机器人自己的 QQ 号
  2. 打开 启用插件 + 开始采样,填 监听对象 QQ 和 采样群号
  3. 让它待在群里攒语料(后台静默,一句话都不发)
  4. 点 生成人格 → 得到画像
  5. 打开 模仿 → 在群里 @ 它试试

采样和模仿是两个独立开关。可以只采样不模仿。


只依赖一个 WebSocket 地址

这个插件不绑定任何具体的 QQ 后端。它只认:

  • 一个 OneBot 11 正向 WebSocket 地址
  • 标准 JSON 帧

底层是 NapCat、Lagrange 还是别的实现,插件都不关心。

这也意味着不需要本插件去装任何东西。 你的 QQ 后端自己跑着就行。

⚠️ 注意:NapCat 是官方 QQ 客户端的插件(source-available,许可证禁止商用与再分发)。本插件不打包它、不改它,只调它的 WS 接口——这是干净的用法。但请勿把 NapCat 打进你自己的安装包。


配置项

通用

项 默认 说明
启用插件 false 总开关
机器人自己的 QQ 0 填 0 表示任意 @ 都当成在叫它
WS 地址 ws://127.0.0.1:3001 OneBot 11 正向 WS
Access Token 空 后端配了才填

采样

项 默认 说明
开始采样 false 只记录不发言
监听对象 QQ 0 学谁
采样群号 [] 空=不限
冷启动拉历史 true 调 get_group_msg_history
群历史条数 200 上限由后端决定
本地保留条数 3000 超出按时间淘汰
采集表情包 true
连别人的表情也采 true 表情包通常是通用的

模仿

项 默认 说明
开启模仿 false
只在被 @ 时说话 true 没人叫它就别插话
装没看见的概率 0.15 真人不会每条都回
最多分几条 3 真人一句一个气泡
单条最大字数 200
发表情包 true
风格校验 true 不合格重写
冒充身份 false 默认禁止,只学语气

盲测:唯一的验收标准

点「开始盲测」生成 10 道题——5 条真人原话、5 条 AI 生成,打乱顺序,逐条猜哪句是真的。

猜对 结论
8+ 太假,一眼看出来,回去调画像
5 左右 达标
4 及以下 已经骗过你了

这个数字比任何"风格相似度打分"都准。而且一分钱不花。


数据与隐私

所有数据存在本机 ~/.dsh/mimic/:

corpus/<qq>/samples.jsonl     语料,一行一条
corpus/<qq>/meta.json         采样元信息
stickers/<qq>/index.json      表情索引
stickers/<qq>/*.png           表情原图
personas/<qq>.json            画像(可手改)
  • 不上传云端,代码里没有这条路径
  • 一键清空:设置页「清空所有数据」会删掉语料、画像、表情
  • 可手改画像:觉得哪个口癖抓错了,直接改文件

使用边界

这个工具会采集群里别人的发言。请:

  • 只在自己有权限的群里使用
  • 尊重被采样者,被要求删除时立即用「清空所有数据」
  • 不要用它做冒充、诈骗或任何损害他人的事

插件默认不冒充身份:说话的始终是机器人自己的号,只是语气像。请不要用「冒充身份」之外的方式去骗人——技术是中立的,用的人不是。


明确不做

不做 原因
微调模型 / 训练权重 每人一份权重不现实,迭代以天计
自己写 QQ 协议栈 比用现成后端重一百倍,且签名风控极难
打包 NapCat 其许可证禁止再分发
数据上传 群里的话不出本机
冒充特定人身份 默认关闭,需显式开启

技术要点

为什么产物不是权重,是"画像 + 范例库"

微调需要每人几千条高质量样本 + 一次训练 + 一次部署。收集要三个月,迭代以天计,一个人一份权重根本管不过来。

结构化画像 + 真实原文 few-shot,当天就能见效,改一个字段立刻生效。

为什么画像是数字而不是形容词

告诉模型"这个人说话简短",它会输出一句结构完整的短话——长度对了,味道全错。

告诉它"平均 7 个字、85% 不带句号、12% 只回一个字、从不用'首先其次'"——这些是可执行约束。

为什么用"续写"而不是"扮演"

把真实对话记录铺好让它接着说,模型的内部状态从「我在完成任务」变成「我在接着聊」。它会自然继承前面的句子长度和语气。这一招不需要训练、不需要微调。

为什么必须有负向清单

AI 的默认行为恰好就是最不像人的那些:分点、总结、每句都答、无条件礼貌。

学"不做什么"比学"会做什么"更能骗过人。所以画像里有一整块 avoid。


开发

npm install
npm run build      # tsc + client bundle
npm test           # 186 个用例

目录

src/
  config.ts              配置(zod)
  settings.ts            设置页 schema(schemastery)
  plugin.ts              Cordis 插件入口 + 运行时
  rpc.ts                 设置页 HTTP 路由
  engine.ts              蒸馏引擎(不依赖 DSH,可离线跑)
  collector.ts           消息采集
  corpus.ts              语料落盘
  profile.ts             画像生成 + prompt 渲染
  profile-store.ts       画像持久化
  style-check.ts         风格校验
  imitation.ts           模仿决策 + prompt + 分段
  stickers.ts            表情库
  blind-test.ts          盲测
  onebot/                OneBot 11 通信层
  handlers/              DSH agent 驱动
  client.js              Web 设置页(无构建,直接是 bundle)

许可

MIT。

OneBot 通信层的设计参考了 dsh-qq-bridge(MIT)。详见 THIRD_PARTY_NOTICES.md。