fix: 增强KB查询清理,移除bot回复碎片残留

问题:
- OCR捕获时可能同时截到用户消息和bot之前的回复
- 如"那个登录插件去哪下载[官方下载"或"俺想知道登录插件在哪儿下载[官方下载"
- 末尾的"[官方下载"会污染查询,导致beibao.md被错误匹配(匹配度高70.51)

修复:
新增第7步清理逻辑:
1. 检测问句结束后的bot回复关键词([官方下载]/[bbsmc分流]/插件下载等)
2. 如果有问号,截断到问句结束
3. 如果没有问号但包含bot回复Markdown格式,在"["前截断

预期效果:
- "那个登录插件去哪下载[官方下载" → "那个登录插件去哪下载"
- "俺想知道登录插件在哪儿下载[官方下载" → "俺想知道登录插件在哪儿下载"
This commit is contained in:
youpaishidifu
2026-08-17 09:42:34 +08:00
parent f9c5ab2142
commit cc95cd3ffc
+33
View File
@@ -391,6 +391,39 @@ def _clean_query_for_kb(msg: str) -> str:
t = t[:q_end + 1] t = t[:q_end + 1]
logger.debug(f"[kb] OCR污染清理: {msg[:50]!r} -> {t!r}") logger.debug(f"[kb] OCR污染清理: {msg[:50]!r} -> {t!r}")
# 7. ⭐ 清理bot回复碎片残留(2026-08-17 修复)
# 用户发送新消息时,OCR可能同时捕获到bot之前的回复
# 如 "那个登录插件去哪下载[官方下载" 或 "插件下载:见github..."
# 检测模式:问句结束后紧跟[官方下载]/[bbsmc分流]/插件下载等bot回复特征
# 如果检测到,截断到问句结束
_bot_reply_fragment = re.compile(
r'[??]\s*' # 问句结束符
r'[\[((]?\s*' # 可选的方括号/圆括号
r'(官方下载|bbsmc分流|插件下载|下载地址|下载地址)' # bot回复关键词
r'.*' # 其余内容
)
if _bot_reply_fragment.search(t):
# 找到第一个问句结束符并截断
q_end = max(
t.find('?') if '?' in t else -1,
t.find('?') if '?' in t else -1
)
if q_end >= 0:
t = t[:q_end + 1]
logger.debug(f"[kb] Bot回复碎片清理: {msg[:50]!r} -> {t!r}")
elif '[官方下载' in t or '[bbsmc分流' in t:
# 没有问号,但包含bot回复的Markdown链接格式
# 如 "那个登录插件去哪下载[官方下载"
# 尝试在"["之前截断
cut_pos = min(
t.find('[官方下载') if '[官方下载' in t else len(t),
t.find('[bbsmc分流') if '[bbsmc分流' in t else len(t),
t.find('插件下载:') if '插件下载:' in t else len(t),
)
if cut_pos < len(t) and cut_pos > 5: # 确保不是太短
t = t[:cut_pos].rstrip(',,、 ')
logger.debug(f"[kb] Bot回复Markdown清理: {msg[:50]!r} -> {t!r}")
return t return t