聚焦插话
聚焦插话(Focus)是 Openmim 最核心的设计之一,它决定了机器人何时主动参与群聊。相比随机概率触发,聚焦系统使用 LLM 实时评估每条消息,做出更智能的参与决策。
工作原理
双阶段决策
消息进入聊天处理器后,经过两个阶段才决定是否回复:
新消息到达
│
▼
【阶段 1:规则触发判断(TriggerService)】
│
├─ @ 机器人 / 回复机器人消息 / 昵称被叫到
│ → trigger_type = "reply" / "mention" / "called"
│ → ✅ 直接进入完整回复,跳过 LLM 评分
│
├─ 白名单群组的普通消息 + 聚焦模式激活中
│ → trigger_type = "focus_light_hint"
│ → 进入阶段 2 ↓
│
└─ 其他(非白名单 / 回复偏好为"提到优先"等)
→ ❌ 不触发,进入被动消息处理
▼(仅 focus_light_hint 消息到达此处)
【阶段 2:LLM 评分(FocusService)】
│
├─ 稍作等待(约 2 秒,等待消息流稳定)
│
├─ 调用轻量 LLM Prompt,对当前消息打 0-10 分
│ 考虑维度:
│ · 话题是否与机器人兴趣/人设相关?
│ · 是否是问题或需要回应的陈述?
│ · 群内当前氛围是否适合插话?
│ · 群组自定义评分标准(/gadmin 中配置)
│
├─ 评分 < FOCUS_STAGE1_THRESHOLD(默认 4 分)
│ → ❌ 不参与
│
└─ 评分 ≥ 4 分
→ ✅ 进入完整聊天流程(LLM 生成回复)阶段 1 是纯规则判断,无 LLM 调用,几乎零延迟。
阶段 2 仅对"普通群消息"触发,是一次轻量 LLM 调用(独立的短 prompt,不携带完整上下文),用于过滤不相关消息,避免机器人对每条消息都生成完整回复。
明确触发(阶段 1 直通)
@机器人、回复机器人的消息、消息中出现昵称别名(默认:猫猫、小猫、咪姆、咪姆酱)这三类触发会在阶段 1 直接通过,完全跳过阶段 2 的 LLM 评分,保证响应零延迟。
管理员命令(/ 开头)由独立 handler 处理,不经过聚焦流程。
focus_light_hint 与轻提示
focus_light_hint 是阶段 1 产生的触发类型,代表"聚焦模式激活、普通群消息有资格参与"。它会继续走阶段 2 的 LLM 评分,评分通过才生成完整回复。
评分不通过时,若满足以下条件,仍可触发轻提示——一句简短跟聊(非完整 LLM 回复),保持存在感:
| 配置项 | 默认值 | 说明 |
|---|---|---|
FOCUS_LIGHT_HINT_ENABLED | true | 是否启用轻提示 |
FOCUS_LIGHT_HINT_PROBABILITY | 0.25 | 轻提示触发概率 |
FOCUS_LIGHT_HINT_COOLDOWN_SECONDS | 60 | 同群轻提示最小间隔(秒) |
FOCUS_LIGHT_HINT_MIN_CHARS | 8 | 触发轻提示的消息最短字符数 |
注意力模式
通过群组设置可以配置机器人的注意力范围:
| 模式 | 说明 |
|---|---|
single_message(默认) | 每次只分析触发消息本身 |
all_message | 分析窗口内所有新消息,汇总判断 |
mixed | 综合模式(部分场景用全消息分析) |
聚焦开关
/quiet 和 /unquiet
用户可以使用这两个命令临时控制机器人在群里的主动性:
/quiet— 让机器人进入安静模式,不再主动聚焦插话(仍响应 @ 和昵称)/unquiet— 恢复主动聚焦插话
话题追踪模式
/topic— 进入话题追踪模式,机器人会更积极地跟进当前话题/notopic— 退出话题追踪模式
回复偏好
通过群组设置 reply_preference 控制插话逻辑倾向:
| 值 | 说明 |
|---|---|
llm_first(默认) | 优先遵循 LLM 的综合判断 |
explicit_first | 优先响应明确提到机器人/需要机器人回答的消息 |
消息丢弃概率
通过 message_drop_probability 可以让机器人随机跳过部分消息的处理,降低回复频率:
0(默认):不丢弃任何消息0.2:约 20% 的普通消息被跳过1:跳过所有普通消息(等同于完全安静)
注意
明确 @/回复/叫到机器人,以及管理员命令,不受此概率影响。
冷群话题激活
当一个群组连续 IDLE_TOPIC_IDLE_HOURS(默认 6 小时)没有消息时,机器人会主动发送一条话题引导消息,根据群组的历史偏好(技术、生活、游戏等)选择合适的话题方向。
| 配置项 | 默认值 | 说明 |
|---|---|---|
IDLE_TOPIC_IDLE_HOURS | 6 | 冷场多少小时后触发 |
IDLE_TOPIC_SCAN_INTERVAL_SECONDS | 3600 | 扫描周期(秒) |
IDLE_TOPIC_MAX_PER_RUN | 3 | 每轮最多主动发几个群 |
可在群设置中通过 idle_topic_enabled 开关单独控制每个群。
评分参数调优
如果机器人插话频率太高或太低,可以调整:
{
"FOCUS_STAGE1_THRESHOLD": 4,
"FOCUS_JOIN_SCORE_THRESHOLD": 6,
"FOCUS_JOIN_MAX_PER_SESSION": 5
}| 配置项 | 默认值 | 说明 |
|---|---|---|
FOCUS_STAGE1_THRESHOLD | 4 | 进入回复流程的最低评分(0-10) |
FOCUS_JOIN_SCORE_THRESHOLD | 6 | 聚焦模式下主动插话的最低评分 |
FOCUS_JOIN_MAX_PER_SESSION | 5 | 单次激活最多插话次数 |
数值越高,机器人越谨慎、插话越少;数值越低,机器人越活跃。
群组自定义评分标准
在群管理面板(/gadmin)中,群管理员可以设置评分标准,用自然语言描述这个群希望机器人关注的话题方向,影响 LLM 的评分行为。
例如:
"这是一个 Python 技术群,重点关注编程相关的讨论,游戏和美食话题评分降低。"
