优化自动回复触发逻辑:疑问句默认仅@机器人时触发

变更项:

1. 在 triggers 中新增 question_requires_at 配置,默认要求@机器人才将疑问句升级为 question_trigger。

2. 在 response_planner 中收紧问答兜底策略,疑问句仅在 directed 场景进入模型。

3. 在 config.toml 增加 priority.question_requires_at=true,避免群聊普通疑问句高频误触发。
This commit is contained in:
liuwei
2026-04-17 10:38:30 +08:00
parent 1cf2cfd6e3
commit e56c0069cc
3 changed files with 21 additions and 6 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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"