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:
@@ -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(" ⚠ 自动回复已关闭,不触发回复")
|
||||||
|
|||||||
Reference in New Issue
Block a user