fix: 表格兜底通过时跳过核心词覆盖检查

问题:'领地系统有哪两种操作模式?'查询命中protect.md的'温馨提示'
section(含操作方式表格),表格兜底放行后仍被多关键词覆盖检查拦截。

根因:表格兜底设置has_body=True,但核心词覆盖检查是独立逻辑,
要求5个核心词命中≥3个,而表格中只有'系统''操作'命中(2/5)。

修复:表格兜底通过时设置_table_fallback_used标记,核心词覆盖检查
跳过该检查,避免表格型答案被误杀。

验证:
- '领地系统有哪两种操作模式?' → 返回操作方式表格 ✓
- 其他查询的核心词检查逻辑不变
This commit is contained in:
youpaishidifu
2026-08-19 16:49:16 +08:00
parent b02bb8c3eb
commit e1a1078873
+22 -13
View File
@@ -233,6 +233,11 @@ class AutoReply:
f"动作查询表格兜底放行: query={query[:40]!r} " f"动作查询表格兜底放行: query={query[:40]!r} "
f"doc_heading={heading[:30]!r}" f"doc_heading={heading[:30]!r}"
) )
# ⭐ 表格兜底通过:跳过后续多关键词覆盖检查
# 表格本身就是答案(如"操作方式"表格对应"操作模式"查询)
# 不应再要求核心词全覆盖
has_body = True
_table_fallback_used = True
else: else:
# 正文(不含动作词)完全没有共同词 → 直接拒绝,无论 heading 是否命中 # 正文(不含动作词)完全没有共同词 → 直接拒绝,无论 heading 是否命中
logger.debug( logger.debug(
@@ -245,7 +250,8 @@ class AutoReply:
pass pass
# has_ht and has_body_nonaction → 通过 # has_ht and has_body_nonaction → 通过
# 注:原 has_body 已包含 action_kw 词,此处用 has_body_nonaction 更严格 # 注:原 has_body 已包含 action_kw 词,此处用 has_body_nonaction 更严格
has_body = has_body_nonaction if 'has_body' not in locals():
has_body = has_body_nonaction
# ⭐ 后台/前台关键词区分:查询含"后台"但文档不含"后台"→ 不相关 # ⭐ 后台/前台关键词区分:查询含"后台"但文档不含"后台"→ 不相关
full = heading_clean + " " + title.lower() + " " + body_clean[:800] full = heading_clean + " " + title.lower() + " " + body_clean[:800]
@@ -430,18 +436,21 @@ class AutoReply:
# sdf1.md只含"草原"(1/3)→ 拒绝 # sdf1.md只含"草原"(1/3)→ 拒绝
# index.md含"近期"+"公告"(2/3)→ 通过 # index.md含"近期"+"公告"(2/3)→ 通过
logger.debug(f"核心词覆盖检查: core_kw={core_kw} len={len(core_kw)} core_hits={core_hits}") logger.debug(f"核心词覆盖检查: core_kw={core_kw} len={len(core_kw)} core_hits={core_hits}")
if len(core_kw) >= 2: # ⭐ 表格兜底已通过:跳过严格的核心词覆盖检查
# ⭐ 修复:阈值改为max(1,...),避免只有1个核心词时仍要求≥2个命中 # 避免"操作模式"查询因"模式"不在"操作方式"表格中被拒绝
# 例:"服务器最近有哪些公告啊?" 核心词={'公告'}(1个) if not locals().get('_table_fallback_used', False):
# heading含'公告'(1/1)→ 通过(原max(2,...)要求≥2,会拒绝) if len(core_kw) >= 2:
min_core_hits = max(1, (len(core_kw) + 1) // 2) # ⭐ 修复:阈值改为max(1,...),避免只有1个核心词时仍要求≥2个命中
if core_hits < min_core_hits: # 例:"服务器最近有哪些公告啊?" 核心词={'公告'}(1个)
logger.debug( # heading含'公告'(1/1)→ 通过(原max(2,...)要求≥2,会拒绝)
f"多关键词覆盖不足跳过(防牛头不对马嘴): query={query[:40]!r} " min_core_hits = max(1, (len(core_kw) + 1) // 2)
f"doc_heading={heading[:30]!r} core_hits={core_hits}/{len(core_kw)} " if core_hits < min_core_hits:
f"(阈值≥{min_core_hits}), missing={ [kw for kw in core_kw if kw not in doc_text]!r}, has_ht={has_ht}" logger.debug(
) f"多关键词覆盖不足跳过(防牛头不对马嘴): query={query[:40]!r} "
return False f"doc_heading={heading[:30]!r} core_hits={core_hits}/{len(core_kw)} "
f"(阈值≥{min_core_hits}), missing={ [kw for kw in core_kw if kw not in doc_text]!r}, has_ht={has_ht}"
)
return False
# 原有正文覆盖不足防御(保留作为兜底) # 原有正文覆盖不足防御(保留作为兜底)
if not has_ht and has_body: if not has_ht and has_body:
q_count = len(q_mean) q_count = len(q_mean)