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:
+19
-1
@@ -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]}")
|
||||
# 保留原有时间戳差值计算(用于排序)
|
||||
|
||||
Reference in New Issue
Block a user