From 8a2ae6eb7587941a921a48b548f570dff8c5cd76 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Thu, 25 Jun 2026 16:06:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(server):=20gate=5Fclassify=20=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=20=5Fclassify=5Firrelevant=5Finput=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20off=5Ftopic=20=E8=AF=AF=E6=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 回归问题:P1.3 重构时 gate_classify 的 off_topic 门用了 scene_registry 的 35 个 signal_keywords,丢掉了 legacy 的 73 个关键词(城市名/时间词/金额词/ 交通词等),导致'下周去上海''昨天打车30块'等正常业务输入被误判 off_topic, 根本进不了 LLM。 修复:gate_classify 的 off_topic 门改用成熟的 _classify_irrelevant_input (94 词 + registry 信号词 + greeting/meaningless 细分),scene_registry 的 signal_keywords 只用于规则匹配门(CHOICE 路由)。删除残缺的 _matches_any_signal。 验证:76 passed;实测'下周去上海'→llm_function_call、'昨天打车30块'→ llm_function_call、'你好'→off_topic(正确拦截)。 --- .../src/app/services/steward_graph_planner.py | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/server/src/app/services/steward_graph_planner.py b/server/src/app/services/steward_graph_planner.py index d5de644..5a39f8e 100644 --- a/server/src/app/services/steward_graph_planner.py +++ b/server/src/app/services/steward_graph_planner.py @@ -24,15 +24,6 @@ from app.services.steward_planner_fallback import StewardPlannerFallbackMixin # ---- 模块级辅助函数:gate_classify 的判断逻辑 ---- -def _matches_any_signal(message: str) -> bool: - """聚合 scene_registry 所有 signal_keywords,判断输入是否为业务相关。""" - from app.services.scenes import REGISTRY - compact = _compact_text(message) - if not compact: - return False - return any(kw in compact for kw in REGISTRY.all_signal_keywords()) - - def _compact_text(text: str) -> str: return re.sub(r"\s+", "", str(text or "")) @@ -154,13 +145,16 @@ class StewardGraphPlannerService(StewardPlannerFallbackMixin, StewardPlannerExtr 顺序: ① resume 门(用户说"再提交"+ state 有可恢复 flow → 上下文恢复) - ② off_topic 门(聚合 scene_registry signal_keywords) + ② off_topic 门(复用 _classify_irrelevant_input:legacy 94 词 + registry 信号词 + greeting/meaningless 细分) ③ 规则匹配门(按 priority 遍历 scene_registry,命中 CHOICE 规则的) ④ LLM 门(规则未命中,走 model function call) """ from app.services.scenes import REGISTRY - from app.services.scenes.gate_rules import GateRule, SceneRoute + from app.services.scenes.gate_rules import GateRule + request = state.get("request") + if request is None: + return {"gate_decision": "off_topic", "gate_scene_id": None} message = str(state.get("message") or "").strip() steward_state = state.get("steward_state") or {} @@ -169,8 +163,9 @@ class StewardGraphPlannerService(StewardPlannerFallbackMixin, StewardPlannerExtr if resume_scene: return {"gate_decision": "resume", "gate_scene_id": resume_scene} - # ② off_topic 门 - if not _matches_any_signal(message): + # ② off_topic 门:复用成熟的 _classify_irrelevant_input(含城市名/时间词/金额词等 94 词 + greeting/meaningless 细分) + scenario = self._classify_irrelevant_input(message, request) + if scenario is not None: return {"gate_decision": "off_topic", "gate_scene_id": None} # ③ 规则匹配门(按 priority 遍历,命中 CHOICE 规则的) @@ -186,8 +181,7 @@ class StewardGraphPlannerService(StewardPlannerFallbackMixin, StewardPlannerExtr # ④ LLM 门(规则未命中) # 走 model_intent 时,如 state 已有 active_flow 且 LLM 准备 fallback,可优先做 candidate_flow - request = state.get("request") - if request is not None and self._looks_like_ambiguous_travel_flow( + if self._looks_like_ambiguous_travel_flow( message, self._resolve_base_date_from_request(request), request ): return {"gate_decision": "ambiguous", "gate_scene_id": None}