From e56c0069ccdb7c68603b4436eed5cdfd73a9e97e Mon Sep 17 00:00:00 2001 From: liuwei Date: Fri, 17 Apr 2026 10:38:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E8=A7=A6=E5=8F=91=E9=80=BB=E8=BE=91=EF=BC=9A=E7=96=91?= =?UTF-8?q?=E9=97=AE=E5=8F=A5=E9=BB=98=E8=AE=A4=E4=BB=85@=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E4=BA=BA=E6=97=B6=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 变更项: 1. 在 triggers 中新增 question_requires_at 配置,默认要求@机器人才将疑问句升级为 question_trigger。 2. 在 response_planner 中收紧问答兜底策略,疑问句仅在 directed 场景进入模型。 3. 在 config.toml 增加 priority.question_requires_at=true,避免群聊普通疑问句高频误触发。 --- plugins/ai_auto_response/config.toml | 1 + .../ai_auto_response/core/response_planner.py | 5 ++++- plugins/ai_auto_response/core/triggers.py | 21 ++++++++++++++----- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/ai_auto_response/config.toml b/plugins/ai_auto_response/config.toml index 0595601..a679b08 100644 --- a/plugins/ai_auto_response/config.toml +++ b/plugins/ai_auto_response/config.toml @@ -86,6 +86,7 @@ recent_followup_window_minutes = 5 [priority] at_bot = 1.0 explicit_question = 0.95 +question_requires_at = true followup = 0.90 social_call = 0.65 light_social = 0.45 diff --git a/plugins/ai_auto_response/core/response_planner.py b/plugins/ai_auto_response/core/response_planner.py index 8225888..feb2e39 100644 --- a/plugins/ai_auto_response/core/response_planner.py +++ b/plugins/ai_auto_response/core/response_planner.py @@ -35,7 +35,10 @@ class ResponsePlanner: if trigger.get("is_question") and conversation_hints.get("has_recent_human_solver") and flow_state == "idle": return False if trigger.get("is_question"): - return directed or trigger.get("priority", 0) >= 0.9 or flow_state in {"warming", "engaged", "deep_engaged"} + # 策略收敛: + # 问答类回复只在“明确指向机器人”时触发,防止把群友之间的疑问句当作对机器人提问。 + # 这层作为兜底,即使上游触发器未来被调整,也不会回到“疑问句高频抢答”的状态。 + return directed if trigger.get("is_followup"): if directed: return True diff --git a/plugins/ai_auto_response/core/triggers.py b/plugins/ai_auto_response/core/triggers.py index 14d95c9..3af0ce0 100644 --- a/plugins/ai_auto_response/core/triggers.py +++ b/plugins/ai_auto_response/core/triggers.py @@ -34,6 +34,11 @@ class TriggerRouter: def __init__(self, config: Dict): self.config = config or {} self.topic_keywords = [str(item).lower() for item in self.config.get("focus", [])] + # 业务约束说明: + # 1) 群内大量“疑问句”其实是群友之间的随口沟通,不是向机器人求助; + # 2) 如果把所有疑问句都当成问答触发,会显著提升误触发率,导致“高频答非所问”; + # 3) 因此默认要求“必须@机器人”才把疑问句升级为咨询触发,避免抢话。 + self.question_requires_at = bool(self.config.get("question_requires_at", True)) def route(self, message: Dict, memory_hints: Dict, conversation_hints: Dict | None = None) -> TriggerResult: conversation_hints = conversation_hints or {} @@ -47,11 +52,17 @@ class TriggerRouter: result.is_directed = True result.reasons.append("is_at") if self._is_question(content): - if result.priority < float(self.config.get("explicit_question", 0.95)): - result.trigger_type = "question_trigger" - result.priority = float(self.config.get("explicit_question", 0.95)) - result.is_question = True - result.reasons.append("question") + # 这里把“是否是疑问句”和“是否应该按咨询触发”拆开处理: + # - 疑问句形态用于日志观察; + # - 触发升级只在满足定向条件时才生效,避免群聊里普通问句频繁触发机器人。 + if self.question_requires_at and not message.get("is_at"): + result.reasons.append("question_detected_but_not_at") + else: + if result.priority < float(self.config.get("explicit_question", 0.95)): + result.trigger_type = "question_trigger" + result.priority = float(self.config.get("explicit_question", 0.95)) + result.is_question = True + result.reasons.append("question") if memory_hints.get("is_followup"): if result.priority < float(self.config.get("followup", 0.90)): result.trigger_type = "followup_trigger"