fix: 表格兜底通过时跳过核心词覆盖检查
问题:'领地系统有哪两种操作模式?'查询命中protect.md的'温馨提示' section(含操作方式表格),表格兜底放行后仍被多关键词覆盖检查拦截。 根因:表格兜底设置has_body=True,但核心词覆盖检查是独立逻辑, 要求5个核心词命中≥3个,而表格中只有'系统''操作'命中(2/5)。 修复:表格兜底通过时设置_table_fallback_used标记,核心词覆盖检查 跳过该检查,避免表格型答案被误杀。 验证: - '领地系统有哪两种操作模式?' → 返回操作方式表格 ✓ - 其他查询的核心词检查逻辑不变
This commit is contained in:
+22
-13
@@ -233,6 +233,11 @@ class AutoReply:
|
||||
f"动作查询表格兜底放行: query={query[:40]!r} "
|
||||
f"doc_heading={heading[:30]!r}"
|
||||
)
|
||||
# ⭐ 表格兜底通过:跳过后续多关键词覆盖检查
|
||||
# 表格本身就是答案(如"操作方式"表格对应"操作模式"查询)
|
||||
# 不应再要求核心词全覆盖
|
||||
has_body = True
|
||||
_table_fallback_used = True
|
||||
else:
|
||||
# 正文(不含动作词)完全没有共同词 → 直接拒绝,无论 heading 是否命中
|
||||
logger.debug(
|
||||
@@ -245,7 +250,8 @@ class AutoReply:
|
||||
pass
|
||||
# has_ht and 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]
|
||||
@@ -430,18 +436,21 @@ class AutoReply:
|
||||
# sdf1.md只含"草原"(1/3)→ 拒绝
|
||||
# index.md含"近期"+"公告"(2/3)→ 通过
|
||||
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个)
|
||||
# heading含'公告'(1/1)→ 通过(原max(2,...)要求≥2,会拒绝)
|
||||
min_core_hits = max(1, (len(core_kw) + 1) // 2)
|
||||
if core_hits < min_core_hits:
|
||||
logger.debug(
|
||||
f"多关键词覆盖不足跳过(防牛头不对马嘴): query={query[:40]!r} "
|
||||
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 locals().get('_table_fallback_used', False):
|
||||
if len(core_kw) >= 2:
|
||||
# ⭐ 修复:阈值改为max(1,...),避免只有1个核心词时仍要求≥2个命中
|
||||
# 例:"服务器最近有哪些公告啊?" 核心词={'公告'}(1个)
|
||||
# heading含'公告'(1/1)→ 通过(原max(2,...)要求≥2,会拒绝)
|
||||
min_core_hits = max(1, (len(core_kw) + 1) // 2)
|
||||
if core_hits < min_core_hits:
|
||||
logger.debug(
|
||||
f"多关键词覆盖不足跳过(防牛头不对马嘴): query={query[:40]!r} "
|
||||
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:
|
||||
q_count = len(q_mean)
|
||||
|
||||
Reference in New Issue
Block a user