From c13a41771a0af1edce8430263698e32ff6b2cab1 Mon Sep 17 00:00:00 2001 From: youpaishidifu Date: Mon, 17 Aug 2026 15:59:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=8B=E8=BD=BD=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BC=98=E5=85=88=E9=80=89=E6=8B=A9=E8=AF=A6=E7=BB=86=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E8=80=8C=E9=9D=9E=E7=AE=80=E7=95=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:'那登录插件去哪儿能下载到?'返回protect'温馨提示'简略链接, 而非sdf1_login'2.1 下载'详细表格。 根因:gui.py简单取第一个通过相关性检查的候选, protect score=27.53 > sdf1_login score=25.73,被优先选中。 修复:收集所有相关候选,按质量分排序: - 下载类查询:body含表格/链接列表→额外+10分 - 其他查询:body长度加权 选质量分最高的候选回复。 --- gui.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/gui.py b/gui.py index 36133f0..f33444e 100644 --- a/gui.py +++ b/gui.py @@ -1039,8 +1039,12 @@ class MsgBotApp(ctk.CTk): # 从 top_k 结果中选取【第一个通过内容相关性校验】的文档发送, # 避免永远只取 results[0] 导致"牛头不对马嘴"的错误文档被发送。 # 一条消息只回复一段(选中最相关且语义匹配的那一条),不触发 N 段回复。 + # ⭐ 2026-08-17 修复:收集所有相关候选,按质量分排序选最优 + # 原来只选第一个通过的,导致 protect"温馨提示"(score高但内容浅)压过 sdf1_login"2.1下载"(score略低但内容深) chosen = None if self.ar.enabled: + # 收集所有通过相关性检查的候选 + relevant_candidates = [] for idx, (doc, sc) in enumerate(results): if sc < self.ar.min_score: continue @@ -1050,8 +1054,27 @@ class MsgBotApp(ctk.CTk): f"score={sc:.2f} relevance={rel}" ) if rel: - chosen = (doc, sc) - break + # 计算质量分:body越长、有表格/链接列表,质量越高 + body = doc.get('body', '') or doc.get('content', '') + body_len = len(body.strip()) + # 下载类查询优先选择详细表格,而非简略提示 + is_download_query = any(w in cleaned_msg for w in ('下载', '下到', '哪下', '怎么下')) + is_table_body = '|' in body or '- [' in body + if is_download_query and is_table_body: + quality_score = sc + 10.0 # 下载查询中,表格body额外+10分 + else: + quality_score = sc + body_len / 100.0 # 其他查询,body长度加权 + relevant_candidates.append((quality_score, sc, doc)) + + if relevant_candidates: + # 按质量分降序排列,选最高的 + relevant_candidates.sort(key=lambda x: x[0], reverse=True) + _, orig_score, chosen_doc = relevant_candidates[0] + chosen = (chosen_doc, orig_score) + logger.debug( + f"[{platform}] 选优: score={orig_score:.2f} " + f"heading={(chosen_doc.get('heading') or '')[:30]!r}" + ) if not self.ar.enabled: lines.append(" ⚠ 自动回复已关闭,不触发回复")