fix(gui): 清理OCR污染查询,防止同屏消息碎片污染KB搜索
问题:同屏OCR捕获时,用户问句后可能拼接其他消息的碎片 如"个登录插件是在哪个地方下载? 4001234S67 ]插件下载:见github..." 导致protect.md因"插件下载"关键词命中而得分过高(195.15) 修复:在_clean_query_for_kb中添加OCR污染检测 - 匹配模式:6位以上ID + ] + 插件下载等bot回复关键词 - 检测到后截断到第一个完整问句结束(?或?)
This commit is contained in:
@@ -364,6 +364,29 @@ def _clean_query_for_kb(msg: str) -> str:
|
||||
t = re.sub(r'^@\s*', '', t)
|
||||
# 5. 清理残留标点/空格
|
||||
t = re.sub(r'[,,、\s]+', ' ', t).strip(',,、 \t')
|
||||
|
||||
# 6. ⭐ 清理OCR污染:同屏捕获时,用户问句后可能拼接其他消息的碎片
|
||||
# 如 "个登录插件是在哪个地方下载? 4001234S67 ]插件下载:见github..."
|
||||
# 检测模式:6位以上大写数字/字母ID + ] + 插件下载/下载地址 等bot回复关键词
|
||||
# 如果检测到,截断到第一个完整问句结束(?或?)
|
||||
_ocr_pollution = re.compile(
|
||||
r'[??]\s*' # 问句结束符后可能有空格
|
||||
r'[\s]*' # 更多空格
|
||||
r'[A-Z0-9]{6,}' # 订单号/ID(6位以上大写数字字母)
|
||||
r'\s*]' # 跟随的]符号
|
||||
r'\s*插件下载' # bot回复内容关键词
|
||||
r'.*' # 其余内容
|
||||
)
|
||||
if _ocr_pollution.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] OCR污染清理: {msg[:50]!r} -> {t!r}")
|
||||
|
||||
return t
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user