fix: 增强KB查询清理,移除bot回复碎片残留
问题: - OCR捕获时可能同时截到用户消息和bot之前的回复 - 如"那个登录插件去哪下载[官方下载"或"俺想知道登录插件在哪儿下载[官方下载" - 末尾的"[官方下载"会污染查询,导致beibao.md被错误匹配(匹配度高70.51) 修复: 新增第7步清理逻辑: 1. 检测问句结束后的bot回复关键词([官方下载]/[bbsmc分流]/插件下载等) 2. 如果有问号,截断到问句结束 3. 如果没有问号但包含bot回复Markdown格式,在"["前截断 预期效果: - "那个登录插件去哪下载[官方下载" → "那个登录插件去哪下载" - "俺想知道登录插件在哪儿下载[官方下载" → "俺想知道登录插件在哪儿下载"
This commit is contained in:
@@ -391,6 +391,39 @@ def _clean_query_for_kb(msg: str) -> str:
|
||||
t = t[:q_end + 1]
|
||||
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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user