Skip to content

聚焦插话 ​

聚焦插话(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_ENABLEDtrue是否启用轻提示
FOCUS_LIGHT_HINT_PROBABILITY0.25轻提示触发概率
FOCUS_LIGHT_HINT_COOLDOWN_SECONDS60同群轻提示最小间隔(秒)
FOCUS_LIGHT_HINT_MIN_CHARS8触发轻提示的消息最短字符数

注意力模式 ​

通过群组设置可以配置机器人的注意力范围:

模式说明
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_HOURS6冷场多少小时后触发
IDLE_TOPIC_SCAN_INTERVAL_SECONDS3600扫描周期(秒)
IDLE_TOPIC_MAX_PER_RUN3每轮最多主动发几个群

可在群设置中通过 idle_topic_enabled 开关单独控制每个群。

评分参数调优 ​

如果机器人插话频率太高或太低,可以调整:

json
{
  "FOCUS_STAGE1_THRESHOLD": 4,
  "FOCUS_JOIN_SCORE_THRESHOLD": 6,
  "FOCUS_JOIN_MAX_PER_SESSION": 5
}
配置项默认值说明
FOCUS_STAGE1_THRESHOLD4进入回复流程的最低评分(0-10)
FOCUS_JOIN_SCORE_THRESHOLD6聚焦模式下主动插话的最低评分
FOCUS_JOIN_MAX_PER_SESSION5单次激活最多插话次数

数值越高,机器人越谨慎、插话越少;数值越低,机器人越活跃。

群组自定义评分标准 ​

在群管理面板(/gadmin)中,群管理员可以设置评分标准,用自然语言描述这个群希望机器人关注的话题方向,影响 LLM 的评分行为。

例如:

"这是一个 Python 技术群,重点关注编程相关的讨论,游戏和美食话题评分降低。"

基于 python-telegram-bot 构建