fix: 修复病句漏过与陈旧时间戳放行(Task #1645/#1646)

- #1645: 候选处理循环补全病句/噪声二次拦截(_is_noise_text)。
  段级预分割在全噪声时回退返回原文本,导致"话又说回来。"这类
  无动作无主语破碎句漏到下游进KB搜索,现每条候选再跑一次兜底。
- #1646: 时间戳新鲜度逻辑增加硬性拒绝。freshness_score==1.0 表示
  含时间戳且距今>1小时(如22:32放行21:29的1h3m旧戳),视为OCR继承
  的陈旧时间戳,拒绝处理;无时间戳(freshness==0)仍按旧逻辑补分。
This commit is contained in:
youpaishidifu
2026-08-30 23:05:17 +08:00
parent 59ae875acc
commit 99abaa92bb
+19 -1
View File
@@ -10039,6 +10039,14 @@ class MessageMonitor:
# ⭐ 清理OCR噪声前缀(如"必选,")后再搜索知识库
cleaned_item = self._clean_ocr_prefix(item)
# ⭐ Task #1645: 病句/噪声二次拦截(候选循环补全)
# 段级预分割(_split_and_denoise_segments)在全噪声时回退返回原文本,
# 导致"话又说回来。"这类无动作无主语的破碎句漏到下游进KB搜索。
# 此处对每条候选消息再跑一次病句拦截,作为最终兜底。
if self._is_noise_text(cleaned_item) or self._is_noise_text(item):
logger.info(f"[{platform}] 候选病句/噪声拦截: {cleaned_item[:50]!r}")
self._last_new_msg_time[platform] = time.time()
continue
# ⭐ 检查是否与最近bot回复内容相同(OCR噪声干扰,把bot回复当作用户消息)
# ⭐ Task #1574: 降低阈值 0.9→0.65,骨架长度 6→4,防止自言自语漏过
# ⭐ Task #1574 v2: 拆行比对——bot回复是多行(含表格),OCR只读首行
@@ -10139,7 +10147,17 @@ class MessageMonitor:
# DB有记录:不加分
logger.info(f"[{platform}] 时间戳新鲜度<5且DB有记录,不加分: {item[:50]}")
else:
# DB无记录:补分到5
# ⭐ Task #1646: 陈旧时间戳硬性拒绝
# freshness_score==1.0 表示文本含时间戳且距现在 >3600秒(超1小时),
# 视为OCR从旧消息继承来的陈旧时间戳,不应当作新消息处理
# (用户报告: 22:32 错误放行了 21:29 的 1h3m 旧时间戳)。
# 仅对"有时间戳且过旧(freshness==1.0)"拒绝;无时间戳(freshness==0.0)
# 无法判断年龄,沿用旧逻辑补分,避免误杀正常消息。
if freshness_score == 1.0:
logger.info(f"[{platform}] 陈旧时间戳(>1h)拒绝处理: {item[:50]}")
self._last_new_msg_time[platform] = time.time()
continue
# DB无记录且时间戳不过旧:补分到5
score += 5.0
logger.info(f"[{platform}] 时间戳新鲜度<5且DB无记录,补分到5: {item[:50]}")
# 保留原有时间戳差值计算(用于排序)