From 9cbf2650e1e697886544a25998189e33735812f6 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 18 Jul 2026 01:42:05 +0800 Subject: [PATCH] =?UTF-8?q?P1-4b:=20Matcher=E4=BC=98=E5=85=88=E7=BA=A7?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20-=20title=E5=8C=B9=E9=85=8D=E6=8F=90?= =?UTF-8?q?=E5=88=B0category=E4=B9=8B=E5=89=8D=EF=BC=88title=E6=98=AFDify?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E7=9A=84=E5=85=B7=E4=BD=93=E6=84=8F=E5=9B=BE?= =?UTF-8?q?=EF=BC=8C=E6=AF=94=E5=A4=A7=E7=B1=BB=E6=9B=B4=E7=B2=BE=E7=A1=AE?= =?UTF-8?q?=EF=BC=8C=E7=9C=9F=E5=AE=9E=E5=9C=BA=E6=99=AF:=20approval=5Ftyp?= =?UTF-8?q?e=3D=E8=B4=A6=E5=8F=B7=E6=9D=83=E9=99=90=E7=94=B3=E8=AF=B7+titl?= =?UTF-8?q?e=3DVPN=E8=B4=A6=E5=8F=B7=E7=94=B3=E8=AF=B7=E5=BA=94=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=8D=95=E5=8D=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/services/approval_matcher.py | 30 +++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/backend/app/services/approval_matcher.py b/backend/app/services/approval_matcher.py index 8d2576c..1cd707e 100644 --- a/backend/app/services/approval_matcher.py +++ b/backend/app/services/approval_matcher.py @@ -5,9 +5,9 @@ # # 匹配优先级: # 1. approval_type 精确匹配模板 ID(如 "zero_trust_vpn") -# 2. approval_type 关键词匹配模板 keywords(如 "VPN账号申请" 含 "VPN") -# 3. approval_type 匹配 category(如 "账号权限申请" → 返回该分类下所有模板) -# 4. title 匹配模板 name(如 "VPN账号申请" → zero_trust_vpn) +# 2. title 匹配(关键词 + 名称)— title 是 Dify 判断的具体意图,比大类更精确 +# 3. approval_type 关键词匹配模板 keywords(如 "VPN账号申请" 含 "VPN") +# 4. approval_type 匹配 category(如 "账号权限申请" → 返回该分类下所有模板) # 5. 兜底:全部失败时返回全量 18 项卡片(v4.0 P1-4,不再返回 None) # # 输出:标准化卡片数据 card_data,前端纯渲染 @@ -48,22 +48,24 @@ class ApprovalMatcher: if template: return self._build_single_card(template) - # 优先级 2:关键词匹配 - template = self._match_by_keyword(approval_type) - if template: - return self._build_single_card(template) - - # 优先级 3:category 匹配 - options = self._match_by_category(approval_type) - if options: - return self._build_multi_card(approval_type, options) - - # 优先级 4:title 匹配(先关键词后名称,title 是具体名称如"VPN账号申请") + # 优先级 2:title 匹配(先关键词后名称) + # v4.0 P1-4b:title 是 Dify 判断的具体意图(如"VPN账号申请"), + # 比 approval_type 大类(如"账号权限申请")更精确,应优先输出单卡 if title: template = self._match_by_keyword(title) or self._match_by_name(title) if template: return self._build_single_card(template) + # 优先级 3:approval_type 关键词匹配 + template = self._match_by_keyword(approval_type) + if template: + return self._build_single_card(template) + + # 优先级 4:category 匹配(大类兜底,返回该分类多选项) + options = self._match_by_category(approval_type) + if options: + return self._build_multi_card(approval_type, options) + # 优先级 5(v4.0 P1-4):兜底返回全量卡片 # 原死分支(重复调用 _match_by_keyword)已删除——与优先级 2 数学上等价不可达 logger.info(