变更项: 1. 新增 LLM_RESULT 日志,记录模型输出的 should_reply、reply_mode、topic、reply 预览和原始响应预览。 2. 新增 BLOCKED_REPLY 日志,记录模型原本想回复但被 post_llm_cooldown、过期、覆盖或重复回复拦下的具体原因。 3. 保留原有 SKIP 与 SENT 日志,使模型判定、发送阻断和最终发出三段链路可以串起来排查。
小牛群聊 BOT
定位
ai_auto_response 不再是“随机插话插件”,而是一个长期在线的拟人化群友 小牛。
目标是三件事:
- 在群里像一个混久了的真人,不像客服
- 该接问题时接得住,不该说话时会装死
- 能记人、记群、记关系,并在合适的时候自然用起来
这份 README 只描述 plugins/ai_auto_response 当前设计与实现落点,不调整仓库根目录。
当前目录分层
main.py插件入口与主编排,只保留消息流转、组件装配、发送消息。config.toml小牛的运行配置。persona/人设文本,目前核心是xiaoniu.txt。core/统一决策、prompt、LLM 结果解析、回复规划。context/上下文总装配、引用处理、图片处理。memory/短期消息、向量召回、群关系、群事实、群画像推断、群级记忆聚合。profile/人设装配和群画像解析。runtime/心流、限流、日志摘要。safety/过滤、攻击识别、去重。docs/设计文档沉淀。
已落地的模块
core
decision_flow.py主流程进入模型前的统一决策装配。llm_client.pyLLM 调用客户端适配层。triggers.py触发器识别与优先级判断。response_planner.py本地粗筛和回复模式规划。prompt_builder.py统一构造给模型的用户提示词。llm_result_parser.py统一解析模型 JSON 结果,过滤 echo 和异常结构。reply_formatter.py统一做回复裁剪、拆句、多条发送控制、日志预览。
context
context_builder.py汇总最近消息、成员记忆、群记忆、引用/图片上下文。quote_context.py引用消息解析。image_context.py图片跟评识别、图片安全提示、图片附件准备。
memory
memory_store.py短期消息、成员画像、followup 会话读取。vector_memory.py向量召回与写入。group_memory_profile.py从近 48 小时消息和群摘要推断群长期知识域、风格、关注点。group_memory.py聚合群画像、群关系、群事实,并负责群级长期快照回写与记忆重排摘要。social_memory.py轻量构造群关系上下文,给模型提示谁常和谁互动、谁在接谁的话。group_facts.py轻量提炼群事实候选,补充“这个群长期在聊什么、谁更像答疑位、最近有什么稳定吐槽”。memory_ranker.py按当前这次话题对成员记忆、群关系、群事实、向量召回做相关性重排。 同时配合群关系快照、群事实快照,把群级长期记忆慢慢沉淀进向量层。
profile
group_profile.py把人工群配置和历史推断结果合成最终群画像。persona_engine.py人设文本装配和群风格叠加。
runtime
flow_manager.py心流状态管理。cooldown.py回复频率和 burst 限流。logging.py一行摘要日志,包含记忆命中和重排摘要。
safety
filters.pyignore / prompt attack / coding work / @别人识别。dedup.py消息去重和回复去重。
当前主流程
主链路现在是:
can_process只做硬过滤。process_message做消息标准化、群画像解析、记忆装配、粗筛、调用模型、发送回复。LLM 一次决策在一次交互里同时完成:- 判断当前这次到底在聊什么
- 判断这次是否值得回复
- 选择回复强度
- 产出最终回复文本
也就是说,现在的目标不是“本地规则决定一切”,而是:
本地硬过滤 + 本地粗筛 + 模型负责高语境判断
当前能力边界
已经支持:
- 群画像驱动的人设偏置
- 成员长期画像读取
- 30 条最近上下文窗口
- 群关系提示
- 群关系 / 群事实快照回写向量库
- 记忆相关性重排
- 向量记忆召回
- 引用消息解析
- 图片附件随模型请求发送
- 最近图片跟评识别
- 回复拆成 1 到 2 条短消息
- 静默忽略 prompt attack
- 非
@小牛的编码代劳请求直接跳过 - LLM 失败时不做本地兜底,直接装死
还在持续建设:
- 结构化群事实记忆
- 群关系长期压缩写回
- 更强的多话题分辨
- 更细的称呼强度控制
- 更细的记忆命中可解释性
设计文档
这几个文档是当前重构的设计基线:
README_humanization_v2.md总体方案收敛。README_decision_flow.md统一响应决策流。README_social_memory.md群关系记忆。README_group_facts.md群事实长期记忆。
当前重构原则
- 不继续把复杂逻辑堆进
main.py - 兼容层可以暂时保留,但新能力优先放进清晰目录
- 本地规则只负责安全、去重、限流、成本控制
- 真正像群友的判断,尽量交给模型
- 不做割裂体验的本地固定兜底
- 只处理当前发言对应的一个话题,不做多线程并行聊天
下一阶段
接下来会继续拆三块:
- 群关系从“可回写的长期记忆”继续升级到“更稳定的关系强度演化”
- 群事实从“轻量摘要”补到“群内角色、搭子、稳定背景、固定梗”
- 让记忆权重和命中原因更容易从日志里观察与校准
等这两层补起来,小牛才会更像“在群里待了很久的人”,而不是“会读上下文的机器人”。