fix(gui): 清理OCR污染查询,防止同屏消息碎片污染KB搜索

问题:同屏OCR捕获时,用户问句后可能拼接其他消息的碎片
如"个登录插件是在哪个地方下载? 4001234S67 ]插件下载:见github..."
导致protect.md因"插件下载"关键词命中而得分过高(195.15)

修复:在_clean_query_for_kb中添加OCR污染检测
- 匹配模式:6位以上ID + ] + 插件下载等bot回复关键词
- 检测到后截断到第一个完整问句结束(?或?)
This commit is contained in:
youpaishidifu
2026-08-16 14:49:13 +08:00
parent 8bafd1e209
commit c75c771604
+23
View File
@@ -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