fix: 下载查询优先选择详细表格而非简略提示

问题:'那登录插件去哪儿能下载到?'返回protect'温馨提示'简略链接,
而非sdf1_login'2.1 下载'详细表格。

根因:gui.py简单取第一个通过相关性检查的候选,
protect score=27.53 > sdf1_login score=25.73,被优先选中。

修复:收集所有相关候选,按质量分排序:
- 下载类查询:body含表格/链接列表→额外+10分
- 其他查询:body长度加权
选质量分最高的候选回复。
This commit is contained in:
youpaishidifu
2026-08-17 15:59:53 +08:00
parent 953e7de62b
commit c13a41771a
+25 -2
View File
@@ -1039,8 +1039,12 @@ class MsgBotApp(ctk.CTk):
# 从 top_k 结果中选取【第一个通过内容相关性校验】的文档发送, # 从 top_k 结果中选取【第一个通过内容相关性校验】的文档发送,
# 避免永远只取 results[0] 导致"牛头不对马嘴"的错误文档被发送。 # 避免永远只取 results[0] 导致"牛头不对马嘴"的错误文档被发送。
# 一条消息只回复一段(选中最相关且语义匹配的那一条),不触发 N 段回复。 # 一条消息只回复一段(选中最相关且语义匹配的那一条),不触发 N 段回复。
# ⭐ 2026-08-17 修复:收集所有相关候选,按质量分排序选最优
# 原来只选第一个通过的,导致 protect"温馨提示"(score高但内容浅)压过 sdf1_login"2.1下载"(score略低但内容深)
chosen = None chosen = None
if self.ar.enabled: if self.ar.enabled:
# 收集所有通过相关性检查的候选
relevant_candidates = []
for idx, (doc, sc) in enumerate(results): for idx, (doc, sc) in enumerate(results):
if sc < self.ar.min_score: if sc < self.ar.min_score:
continue continue
@@ -1050,8 +1054,27 @@ class MsgBotApp(ctk.CTk):
f"score={sc:.2f} relevance={rel}" f"score={sc:.2f} relevance={rel}"
) )
if rel: if rel:
chosen = (doc, sc) # 计算质量分:body越长、有表格/链接列表,质量越高
break 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: if not self.ar.enabled:
lines.append(" ⚠ 自动回复已关闭,不触发回复") lines.append(" ⚠ 自动回复已关闭,不触发回复")