dsh-mimic
Verifieddsh-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 学会像个人一样说话
把一个 AI 拉进 QQ 群,让它默默学一个人的说话方式,然后像真人一样聊天。
不训练模型、不微调权重。 学到的是这个人的口癖、句子长度、标点习惯、表情包偏好——以及最重要的,他什么都不说。
这个插件解决什么
大模型有个很难除掉的毛病:它说话太完整了。它会分点、会总结、会在结尾祝你顺利、会每句都答。
你要它"像真人一点",它只会变得更礼貌——因为那正是它被训出来的平均脸。
这个插件的做法是:找一个人给它当坐标系。人味不在优点里,在缺陷里——说话没头没尾、懒得解释、句子打到一半、对某些问题干脆不回。
效果
默认状态(没开模仿):
群友:今天又加班到十点 机器人:加班到这么晚确实很辛苦,建议你注意休息,保持规律的作息,长期熬夜对身体的危害是很大的。
模仿模式开启后:
群友:今天又加班到十点 机器人:啊? 机器人:你们公司还没倒啊
区别不在用词,在它没有把话说完整。
功能
- 静默采样:只听不说,把指定人的发言按人切片落盘,连带保留前一句别人的话当语境
- 冷启动:进群就能拉群历史(能不能拉到取决于后端,拉不到会落盘原因)
- 表情包库:收到即下载(QQ 图片 URL 带 rkey 会过期,只存链接必废)+ 按语境检索
- 结构化画像:不是一段散文式人设,是可校验、可手改的数字和清单
- 续写式模仿:不写"请你扮演一个人",而是把真实对话铺好让它接着说
- 风格校验:生成后过一道规则打分,翻车成客服腔就重写
- 发言时机:深夜装死、概率性装没看见、有自己的冷却
- 盲测:真假混排让你猜,这是唯一的成败标准
快速开始
pnpm dsh plugin --profile web add dsh-mimic
重启 dsh web,进入 设置 → 人格蒸馏。
五步上手
- 填 OneBot WS 地址(默认
ws://127.0.0.1:3001)和 机器人自己的 QQ 号 - 打开 启用插件 + 开始采样,填 监听对象 QQ 和 采样群号
- 让它待在群里攒语料(后台静默,一句话都不发)
- 点 生成人格 → 得到画像
- 打开 模仿 → 在群里 @ 它试试
采样和模仿是两个独立开关。可以只采样不模仿。
只依赖一个 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。