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(" ⚠ 自动回复已关闭,不触发回复")