跳过主要内容
R

habit-hint

root-7-khx/habit-hint

《习惯提示小模型》:本地小模型每隔几轮读一次近期对话,生成「习惯 / 重点 / 提示语」并注入系统提示词,训练与模型数据都在本机。需要带 torch/transformers/peft 的 Python 虚拟环境,以及用户自备的 Qwen3-0.6B 基座与 LoRA 适配器(插件不打包);默认只在开启伴侣记忆(companion-memory)的会话里工作,路径没配好时静默不注入。

安装

dsh plugin --profile web add github:root-7-khx/habit-hint

README

习惯提示小模型(@local/habit-hint)

独立的本地小模型插件:每几轮聊天,读最近几轮对话,生成「习惯 / 重点 / 提示语」, 作为一段提示注入当前会话的系统提示词。不改动 companion-memory、ai-voice、qqbot 的任何代码。

它怎么工作

会话消息流 ──每完成一轮对话(用户+AI)──▶ 计数 +1(data/turn-counter.json)
                                        └─▶ 原始轮次追加 data/live-turns.jsonl
计数到 500 ──▶ 拉起一次 auto_train.py --once --force(攒够才训,不再按时间轮询)
                                        
每 N 个 AI 回合 ──▶ 最近 6 轮对话
                                   │
                                   ▼
                    Python 常驻进程(Qwen3-0.6B + LoRA)
                                   │  {habits, important, hints}
                                   ▼
                        缓存(按会话隔离)
                                   │
                                   ▼
               下一轮系统提示词追加「【习惯提示 · 小模型】」
  • 训练触发按对话次数,不按时间:每完成一轮对话计数 +1,到 trainTriggerTurns(默认 500)就拉起一次训练,训练进程自己跑完退出;
  • 训练用 data/live-turns.jsonl 里实时记录的原始轮次,不依赖热缓存(2 个聊天日)的保留时间;
  • 模型/适配器路径、触发间隔、超时都在 cordis.patch.yml 的 config 里;
  • 第一次需要出提示时才启动 Python 进程(懒加载),加载完成会写日志;
  • 进程崩了、超时、JSON 坏、没有 adapter —— 全部静默跳过,聊天不受影响;
  • 想回滚:把 adapterPath 指向旧 adapter 目录,或改成 auto 读 adapters/current.json。

配置项

字段默认说明
enabledtrue总开关
pythonPathD:\AI\语音POC\venv-qwen3tts\Scripts\python.exe带 torch/transformers/peft 的 Python
modelPathD:\AI\习惯模型\models\Qwen3-0.6B基座目录
adapterPathautoauto = 读 adapterRoot/current.json;也可写死目录
adapterRootD:\AI\习惯模型\adapterscurrent.json 所在目录
intervalTurns3每几个 AI 回合跑一次小模型
windowTurns6送进小模型的最近轮数
maxNewTokens160小模型最多生成 token
threads8推理线程
timeoutMs180000单次推理超时
maxContextChars6000送进去的上下文最大字符数
freshMinutes60提示超过多少分钟就不再注入
scopecompanioncompanion = 只处理开了伴侣记忆的会话;all = 全部会话
companionSessionsPathcompanion-memory 的 sessions.json只读,用来判断哪些会话开了伴侣记忆
trainTriggerTurns500完成多少轮对话后触发一次训练
counterPathD:\AI\习惯模型\data\turn-counter.json对话计数
liveTurnsPathD:\AI\习惯模型\data\live-turns.jsonl实时原始轮次(训练数据来源)
trainRequestPathD:\AI\习惯模型\data\train-request.json到量后的训练请求记录
triggerEnabledtrue是否允许插件拉起训练
autoTrainPythonvenv python训练用的 Python
autoTrainScriptD:\AI\习惯模型\scripts\auto_train.py触发的训练脚本(--once)
autoTrainLockPathD:\AI\习惯模型\auto_train.lock训练锁,避免重复起进程
injectInQQSessionsfalseQQ 路由会话是否注入(默认关:QQ 上 runtime-context 刷新可能触发重复回复)
generateInQQSessionsfalseQQ 路由会话是否允许「生成」习惯(不控制注入):配合 companion-memory 把习惯写进该会话时设 true,提示仍不注入
qqBridgePathcompanion-memory 的 qq-bridge.json只读,用来识别 QQ 会话
logPathD:\AI\习惯模型\logs\habit-hint.log插件日志

0.3.0 更新要点

  • JSON 解析容错:小模型输出里的裸英文引号会自动转义、被 max_new_tokens 截断的输出会自动补齐括号、被代码块 / 废话包围也能找出 JSON 解析,坏输出不再整批丢弃。
  • QQ 会话只生成、不注入:generateInQQSessions(默认 false)放开 QQ 路由会话的「生成」,但提示仍不注入;配合 companion-memory 把习惯写进「对话人习惯」时设 true(详见「已知边界」)。
  • 依赖与训练数据不随插件走:Python 环境、基座模型、适配器、训练数据、日志仍在本机 D:\AI\习惯模型(路径见上面的配置表),发布包只带插件代码与推理脚本。
  • 路径选择用 Windows 原生对话框:设置卡里的选文件 / 选文件夹与 companion-memory、ai-voice 同款(COM IFileOpenDialog,DPI 感知,中文路径不乱码)。

日志与排障

D:\AI\习惯模型\logs\habit-hint.log,常看这几行:

  • 习惯提示插件已加载 —— Host 插件启动成功;
  • 启动推理进程 adapter=... —— 第一次触发,正在加载模型;
  • 推理进程就绪 —— 模型加载完成;
  • 生成成功 ... habits=.. important=.. hints=.. —— 小模型正常出结果;
  • 生成失败 ... 推理超时 / 推理进程退出 —— 降级或进程问题,聊天不受影响。

已知边界

  • 默认只给 DSH 桌面会话注入;QQ 路由会话不注入(原因见上)。要让 QQ 会话也产出习惯、但不注入提示,把 generateInQQSessions: true(只放开生成);要在 QQ 上也注入,再把 injectInQQSessions: true 打开并观察是否重复回复。
  • 小模型目前是规则标签训练的基线版(JSON 合法率 100%,但习惯召回一般),随着自动训练积累新版本会逐步变好;它只是「提示器」,不替代主 AI。
  • 提示是参考,不保证每次都对;主 AI 仍以角色文档和记忆为准。

相关插件