youpaishidifu
|
434a9609bf
|
修复下载类查询牛头不对马嘴复发:文档无下载token时拒绝
问题:用户问在哪儿能下到那个登录插件,bot回复了protect文档的操作方式表格,
因为该文档heading含登录插件但body是操作方式,与下载无关。
修复:在_has_content_relevance方法中新增下载类查询额外防御——
当查询含下载意图词(下载/下到/哪下/在哪下/怎么下)时,
若文档全文(heading+title+body前800字)不含下载token,
直接拒绝该文档,防止牛头不对马嘴。
同时保留原有下载意图检查(heading含下载时放行),确保sdf1_login等下载文档正常匹配。
Task #1582
|
2026-08-23 22:39:18 +08:00 |
|
youpaishidifu
|
e826fbe0f0
|
修复基线消息不加跨轮去重记录导致重复回复
问题:基线消息(首次成功轮询时标记的第一条消息)未加入 _recent_user_queries,
导致下一轮轮询时跨轮语义去重无法拦截100%相同的消息,触发二次回复。
修复:基线处理时调用 _add_to_recent_user_queries(item),5分钟TTL内跨轮去重可拦截,
过期后用户重发仍可处理。
Task #1581
|
2026-08-23 22:10:45 +08:00 |
|
youpaishidifu
|
7460d40940
|
fix: 修复启动时清空数据库逻辑,适配新表结构
|
2026-08-23 21:52:55 +08:00 |
|
youpaishidifu
|
2a3ecdba14
|
修复bot自言自语大小写不敏感问题 + 退出时后台内存回收不阻塞
- monitor.py: 去重管道所有比较改为大小写不敏感(recent_replies时间窗口、_replied_texts、_fuzzy_duplicate、子串包含、长公共子串、_last_bot_reply_content)
- main.py: CTRL+C信号处理将内存回收放到后台线程,不阻塞退出
- gui.py: 无实质修改(仅格式)
|
2026-08-23 21:30:05 +08:00 |
|
youpaishidifu
|
25b844098f
|
fix(#1574): Bot自言自语拦截v2——拆行比对修复多行回复漏过
根因:bot回复是多行(含表格),OCR只读首行(如'php有2种登陆模式:')。
原比对把整个多行回复当一个字符串比较,CJK骨架/Jaccard被表格行稀释→漏过。
修复三处拆行:
1. recent_replies精确匹配:逐行 strip== 比对
2. Bot自言自语拦截(8928):拆行做骨架/Jaccard/子串三策略
3. _last_bot_reply_content检查(9222):拆行做SequenceMatcher/骨架/子串
新增策略3:CJK子串包含——OCR文本的CJK骨架是bot行CJK骨架的子串即拦截
(覆盖OCR截断场景:'有2种登陆模式'是'有2种登陆模式模式输入密码直登'的子串)
|
2026-08-23 19:11:25 +08:00 |
|
youpaishidifu
|
308bae1fa5
|
fix: 修复OCR自言自语循环 - Bot回复归一化去重拦截
根因:OCR读取bot自己回复时,文本格式差异(时间戳前缀、标点全/半角、空格)
导致精确/模糊匹配全部失效,bot反复回复自己的旧回复。
修复(Task #1574):
1. 去重管道最前端新增「Bot自言自语拦截」:
- 归一化OCR文本(去时间戳、去标点空格、只保留CJK)
- CJK骨架完全相同 → 直接拦截
- 归一化Jaccard相似度>=0.60 → 拦截
2. _last_bot_reply_content检查:
- 相似度阈值从0.9降至0.65
- CJK骨架长度要求从6降至4,覆盖短回复场景
|
2026-08-23 17:59:59 +08:00 |
|
youpaishidifu
|
32f36dc5fd
|
任务#1570+#1572: 重构消息历史数据库为3表结构,改善OCR查重逻辑
1. 数据库重构为3张表:
- user_messages: 用户消息原文
- bot_messages: bot消息原文
- ocr_staging: OCR暂存(重启清空防自言自语)
2. 新增数据迁移:自动将旧表数据迁移到新表
3. 改善OCR查重逻辑:
- 得分≥2时:检查与bot消息和用户原始消息的重合率
- 重合率≥50%时丢弃(防bot自言自语和OCR残留)
- 得分<2时:重合率≥70%丢弃
4. 新增OCR暂存记录功能:
- 记录通过所有过滤器的OCR消息
- 用于后续查重和审计
5. 新增get_recent_user_messages方法:
- 获取最近的用户原始消息
- 用于查重逻辑
|
2026-08-23 16:41:53 +08:00 |
|
youpaishidifu
|
9152c3529f
|
任务#1441: 修复bot自言自语和双重回复问题
**问题1: 自言自语**
- OCR把bot自己的回复再读一遍,当成新消息触发二次回复
- 修复: 查库对比bot历史回复,重合率≥50%(高分消息)或≥70%(普通消息)则丢弃
**问题2: 双重回复**
- 用户操作电脑打断bot回复发送时,_last_hash_replied标志被重置,下次轮询重复触发
- 修复: 新增_reply_in_progress标志,回复进行中时跳过所有轮询处理
**修改文件:**
- monitor.py: 添加_reply_in_progress状态追踪+动态阈值bot消息过滤
- gui.py: 在回复执行前后设置/清除_reply_in_progress标志
- _keyword_scorer.py: 新增get_last_score()方法用于查询得分而不记录
|
2026-08-22 10:50:56 +08:00 |
|
youpaishidifu
|
1ab422cfd5
|
修复闲聊消息过滤:拦截'有时间吗'等无主题查询
|
2026-08-22 10:17:54 +08:00 |
|
youpaishidifu
|
05e7722816
|
修复Markdown标题过滤:支持无空格格式#xxx
|
2026-08-22 09:55:56 +08:00 |
|
youpaishidifu
|
7257bfb028
|
修复玩家昵称过滤:添加标准化匹配,忽略空格和括号差异
|
2026-08-21 13:04:15 +08:00 |
|
youpaishidifu
|
dac243dcc0
|
新增编程格式块剥离函数,头部整段跳过,尾部切掉(含兼容格式匹配)
- 新增 _strip_programming_format_blocks 函数,检测消息头部/尾部的JSON、YAML、Markdown表格等编程格式块
- 头部检测:JSON对象、Markdown表格、YAML块 → 整段丢弃
- 尾部检测:JSON对象、Markdown表格、YAML块 → 切掉尾部保留前段
- 兼容格式匹配:检测不完整JSON片段(中英文双引号包裹键值对,以逗号/括号结尾),即使OCR识别不完整也能拦截
- 在过滤管道中位于 _strip_json_yaml_blocks 之后调用
- 修复Markdown表格和JSON配置通过过滤器触发自动回复的问题
|
2026-08-21 12:34:45 +08:00 |
|
youpaishidifu
|
f337ad1df5
|
新增编程格式块剥离函数,头部整段跳过,尾部切掉
- 新增 _strip_programming_format_blocks 函数,检测消息头部/尾部的JSON、YAML、Markdown表格等编程格式块
- 头部检测:JSON对象、Markdown表格、YAML块 → 整段丢弃
- 尾部检测:JSON对象、Markdown表格、YAML块 → 切掉尾部保留前段
- 在过滤管道中位于 _strip_json_yaml_blocks 之后调用
- 修复Markdown表格和JSON配置通过过滤器触发自动回复的问题
|
2026-08-21 12:03:49 +08:00 |
|
youpaishidifu
|
04328d7022
|
新增bot回复格式说明碎片拦截(格式X: json格式等)
|
2026-08-21 11:44:25 +08:00 |
|
youpaishidifu
|
093ddb77d2
|
fix: _is_markdown_document增强,拦截含'第X步'的bot回复碎片
问题:OCR把bot回复碎片'cdkl 1分 cdkz 2分 第三步:文件写好以后 游戏内/控制台执行/imp'
重新识别后进入队列,触发自动回复。_is_markdown_document漏检。
根因:
1. 第X步/步骤X检测用re.match行首匹配,碎片中'第三步'不在行首→漏网
2. 代码关键词列表缺少游戏服管理术语,只有1个命中(import不完整)不够阈值
修复:
1. 第X步/步骤X检测改为re.search全文匹配(用户日常不打'第X步',全文命中即判定bot回复)
2. 代码关键词列表增加:控制台/执行/导入/插件(游戏服管理术语,用户日常不打)
commit: fcc2e51后同分支
|
2026-08-21 11:33:05 +08:00 |
|
youpaishidifu
|
fcc2e51777
|
fix: 修复中部孤立*导致用户查询被_is_noise_text误杀的问题
问题:OCR把bot的**小姐姐**识别成小姐姐*,单个*粘在昵称后,
导致'小姐姐*, 关于我们'(len≤10)被_is_noise_text判为残片丢弃,用户查询丢失。
根因:
1. _is_noise_text的逗号分段放行逻辑在elif分支,len≤10时永远不走逗号分段
2. 过滤管道无清理中部孤立*的机制(_strip_markdown_head只剥开头,_strip_markdown_tail只匹配**)
修复:
1. _is_noise_text:在len≤10分支的return True前增加逗号分段放行检查
- 短文本含逗号时,检查逗号后半部分是否含有效查询词(疑问词/动词/主语)
- 后半部分有效→不丢弃,保留用户真实查询
2. 过滤管道增加孤立*清理步骤(正则: ([\u4e00-\u9fff])\*(?!\*))
- 清除中文字符旁的单个*(bot markdown加粗残留),不匹配**,不匹配英文场景
- 覆盖4个调用点:for循环管道、尾部过滤、逐行过滤、去重后过滤
3. 预分割噪声检测也增加*清理
commit: 4个过滤管道+预分割+2个辅助方法,共73行变更
|
2026-08-21 11:18:51 +08:00 |
|
youpaishidifu
|
3e1e8cb700
|
fix(ocr): 新增 _strip_markdown_head 剥离拼在用户消息【前面】的 md 列表标记
根因:OCR 把 bot 的 md 列表项(- / * / > / # / 1. / [√])拼到用户新消息前面,
旧 _strip_markdown_tail 只剥尾部,对头部 md 无能为力:
- 有空格 "- 关于我们" → 被误判为 md 大头整段丢弃(用户消息丢失,最糟)
- 无空格 "-关于我们" → 列表模式要求 \s+ 漏检 → 带 md 碎片入库污染查库关键词 → 查库无结果
修复:
- 新增 _MD_HEAD_PATTERNS + _strip_markdown_head(),循环剥离开头 md 标记,
容忍缺失空格(-关于我们 也要处理);剥完为空返回 None 整段丢弃;保留尾部用户真实提问。
- 安全边界:仅匹配单字符/空方括号([√]/[ ]/[x]),绝不命中多字游戏名词[钻石];
用户日常不以 - * > # 1. 起头,剥这些前缀安全;->_ 服务器地址 箭头也能恢复。
- 集成进 4 个调用点(in-loop 过滤 / 尾部过滤含问句保护 / 逐行过滤 / 去重后过滤),
顺序:bot旧回复剥离 → 头部 md 剥离 → 尾部 md 剥离 → md文档/噪声/回复残片判定。
独立单测 22 例全过(含多字方括号不误杀、纯 md 返回 None、箭头恢复)。
|
2026-08-21 10:44:29 +08:00 |
|
youpaishidifu
|
80bc8519c1
|
增强Markdown过滤器检测中文编号列表和代码块内容,防止Bot自言自语
|
2026-08-21 10:01:36 +08:00 |
|
youpaishidifu
|
6155fd018c
|
修复系统撤回提示入库:新增自定义撤回消息模式到黑名单
|
2026-08-20 11:06:15 +08:00 |
|
youpaishidifu
|
13f3afab8a
|
修复行合并导致残片误杀:混合文本后半部分正常查询时放行
|
2026-08-20 10:38:53 +08:00 |
|
youpaishidifu
|
4d14fe0bc0
|
修复OCR残片过滤:新增表格单元格残片检测
|
2026-08-20 09:38:27 +08:00 |
|
youpaishidifu
|
cf9f269eca
|
fix: Markdown斜体过滤失效,*内容*应被丢弃却入库了
根因:_is_markdown_document函数只检测**加粗语法,未检测*斜体*语法。
用户发'*@C418minecraft 小姐姐, 来测试一下Robot*'被当作正常消息入库。
修复:增加斜体标记检测(*content*),与**加粗**并列过滤。
bot回复用*斜体*是Markdown标准语法,用户日常聊天不打。
回归:斜体*content*→丢弃,**加粗**→丢弃,普通消息→保留
|
2026-08-20 09:12:31 +08:00 |
|
youpaishidifu
|
29f3738c09
|
fix: 重试计时不准,修复Tkinter after()延迟问题\n\n根因:Tkinter的after()在窗口非活动时会延迟触发,\n导致实际重试间隔不是准确的5秒,可能变成十几秒甚至更长。\n\n修复:记录目标重试时间,执行前验证是否真的到了时机。\n若未到,重新调度;若已到,执行重试。\n这样确保重试间隔是实打实的5秒,不是虚的5秒。
|
2026-08-20 08:58:03 +08:00 |
|
youpaishidifu
|
589e277419
|
fix: NameError 'i' not defined in row merge loop\n\n修改行合并逻辑时用了i但没有enumerate,导致NameError。\n修复:for rl in ocr_lines → for i, rl in enumerate(ocr_lines)
|
2026-08-19 21:33:03 +08:00 |
|
youpaishidifu
|
7923dd15b0
|
fix: EasyOCR行数保护不受分数差影响,防Windows OCR粘连误选
根因:行数差异保护原本在score_diff<10的分支内,
但用户截图场景:win=70.8(1行1495字符) vs easy=31.1(68行481字符),
分数差39.7>10 → 整个保护被跳过 → 选Windows → 所有消息粘在一起。
修复:把行数差异保护移到score_diff判断之外,
只要EasyOCR行数>=Windows 3x就无条件选EasyOCR。
行数差异本身就是质量信号(行数多=切分准确)。
|
2026-08-19 21:27:20 +08:00 |
|
youpaishidifu
|
beb6812223
|
fix: 行合并把EasyOCR正确切分的消息错误合并\n\n根因:EasyOCR输出'没有个西瓜'+ '关于我们'是两条独立消息,\n但'没有个西瓜'不以_SENT_END结尾,被合并成'没有个西瓜,关于我们'。\n\n修复:新增'下一行保护'——若当前行后面是短消息(<12字)或包含\n昵称前缀(@/用户名开头),不合并,保留EasyOCR正确切分。\n\n场景: '没有个西瓜'(6字)→下一行'关于我们'(4字<12)→不合并\n场景: '@C418minecraft'→不合并(@开头)\n场景: '你好,'+'世界'→正常合并
|
2026-08-19 21:12:19 +08:00 |
|
youpaishidifu
|
ab8286b6fa
|
fix: Windows OCR把多行合并成一行,修复引擎选择误选Windows\n\n根因:生产环境Windows OCR在某些机器/版本上将多条消息合并成一条长行\n(如20行→1行,421字符),导致长度保护逻辑误选Windows(win_len 421 > \neasy_len*1.3=333)。\n\nEasyOCR输出20行正确切分,但被长度保护否决。\n\n修复:新增「行数差异保护」——当EasyOCR行数>=Windows 3x时强制选EasyOCR,\n因为行数多=切分准确,行数少=Windows把多行合并成一条。\n\n场景1: win=1行421字32.5分, easy=20行256字31.0分 → 选easyocr(原选windows)\n场景2: win=1行100字45分, easy=15行300字50分 → 选easyocr(长度保护已触发)\n场景3: win=10行, easy=5行 → 选windows(正常,Windows行数多)\n场景4: win=60分, easy=30分 → 选windows(分数差异大不进保护)\n场景5: win=5行, easy=15行 → 选easyocr(3x触发)\n场景6: win=5行, easy=12行 → 选windows(<3x不触发)
|
2026-08-19 21:03:24 +08:00 |
|
youpaishidifu
|
61dc653915
|
fix: QQ头衔+bot账号垃圾消息过滤,清理查库队列
根因:OCR把QQ群聊头衔[专业皮肤定制]、bot账号(youpaishidifu)自身回复识别为用户消息,
重启后_replied_texts清空,bot旧回复无历史记录可比对,全部混入查库队列。
修复:
- 规则2扩展:半角方括号[]匹配OCR头衔(原只匹配全角【】)
- 规则2b新增:行内嵌入头衔+无问号+长度≤30字→bot回复(头衔在消息体中间=bot特征)
- 规则7新增:含bot账号名(youpaishidifu)+无问号→bot系统消息,过滤
回归:截图场景4条垃圾消息全FILTER,关于我们/专业皮肤定制怎么配 KEEP,[GG]游戏管理员 FILTER
|
2026-08-19 20:48:26 +08:00 |
|
youpaishidifu
|
81a9a7c51c
|
fix: '关于我们'查询被打负分丢弃,index关于我们section回top1
根因:导航/目录类section全局惩罚-30误伤精确答案——index.md'## 🎈关于我们'heading含'关于我们'被罚-30,
base分14.29→-15.71负分,相关性检查全丢弃。
修复:惩罚列表移除'关于我们'(导航/目录/欢迎/总览/文档导航保留),
'关于我们'是查询意图主体,命中即答案本体。
回归:关于我们→index 14.29 top1;服务器介绍/下载/皮肤更新/操作模式/菜单/公告全绿
|
2026-08-19 20:28:34 +08:00 |
|
youpaishidifu
|
0de88aa084
|
fix: 修复'登录插件的菜单如何配置?'答非所问,菜单.txt进入top1
- 配置文件section加权:查询含配置意图词+heading带.txt/json/yml后缀+命中非泛化词→+8
- 守卫记录分数最高命中section并提到doc_sections首位,防has_action重排+sub_k截断丢答案
- 核心名词bonus按出现次数计分(5/次上限15),修复php后台玩家端仅含一处领地管理+15压过操作方式表
- 导航/目录/总览section全局惩罚-30,修复index文档导航对皮肤更新查询得28分压过skin文档
- 表格兜底答案级抬分30:操作/模式/方式意图+表格含操作方式列→protect操作方式表32分压过php误匹配
回归验证:菜单/领地操作模式/下载/公告/皮肤更新/登录账号/密码/打印流水全部top1正确
|
2026-08-19 19:53:58 +08:00 |
|
youpaishidifu
|
b8208d6b00
|
fix: 物理重启时清空数据库历史,彻底清除残留数据
问题:物理重启后,_force_clear_all_residual_data() 清空了内存,
但 _load_replied_texts_from_db() 会从数据库重新加载历史回复,
导致 bot 仍能"凭空看见"已回复的消息。
修复:
- _force_clear_all_residual_data() 增加 clear_db 参数
- full_restart=True 时清空 message_history 和 keyword_scores 表
- full_restart=False 时仅清内存(急停恢复场景)
效果:
- 物理重启(python main.py):清空数据库 + 内存,彻底清除残留
- 急停恢复(双击ESC):仅清内存,保留数据库历史记录
|
2026-08-19 18:22:52 +08:00 |
|
youpaishidifu
|
e8ca16d1bc
|
fix: 启动时强制清理所有残留数据,避免重复捕捉被跳过
问题:急停后恢复时,内存中的去重集(_seen_messages/_replied_texts)
和语义指纹缓存(_recent_user_queries/_semantic_fingerprint_cache)
残留上次已处理的消息,导致新轮次OCR捕捉到相同内容时,
虽然时间戳已达标但仍被去重逻辑跳过。
修复:在 start() 入口处新增 _force_clear_all_residual_data(),
清理所有内存去重/冷却/缓存状态,不触碰数据库持久化记录。
清理范围:
- 消息去重集:_seen_messages, _replied_texts, _recent_processed_messages
- 语义指纹:_recent_user_queries, _semantic_fingerprint_cache
- 平台冷却:_last_reply_time, _last_new_msg_time, _failed_send_cooldown
- OCR缓存:_last_texts, _raw_clipboard, _last_clipboard_hash, _app_variant
- 响应式冷却:_foreground_cooldown_until, _self_reply_cooldown_until
|
2026-08-19 17:47:49 +08:00 |
|
youpaishidifu
|
e1a1078873
|
fix: 表格兜底通过时跳过核心词覆盖检查
问题:'领地系统有哪两种操作模式?'查询命中protect.md的'温馨提示'
section(含操作方式表格),表格兜底放行后仍被多关键词覆盖检查拦截。
根因:表格兜底设置has_body=True,但核心词覆盖检查是独立逻辑,
要求5个核心词命中≥3个,而表格中只有'系统''操作'命中(2/5)。
修复:表格兜底通过时设置_table_fallback_used标记,核心词覆盖检查
跳过该检查,避免表格型答案被误杀。
验证:
- '领地系统有哪两种操作模式?' → 返回操作方式表格 ✓
- 其他查询的核心词检查逻辑不变
|
2026-08-19 16:49:16 +08:00 |
|
youpaishidifu
|
b02bb8c3eb
|
修复OCR残片检测:双策略匹配(最长公共子串+字符重叠率)
问题:
- 单用最长公共子串策略,"端0(基岩版)" vs "端口(基岩版)" 相似度仅60%,未达80%阈值
- 导致碎片通过检测入库
修复:
增加双策略匹配:
1. 最长公共子串≥60%且≥3字符(严格)
2. 字符重叠率≥50%且中文字符重叠≥2(宽松,防OCR噪声)
验证:
- 端0(基岩版) → fragment=True ✓ (字符重叠"基岩版"=3字)
- 端0(Java) → fragment=True ✓
- 关于我们 → fragment=False ✓
- 那服务器有哪些基本信息 → fragment=False ✓
|
2026-08-19 16:23:49 +08:00 |
|
youpaishidifu
|
416124ebc0
|
修复OCR残片入库:在基线轮前统一过滤bot回复碎片
问题:
- 之前的检测代码在关键词打分循环中,但score=0的残片通过了打分
- 然后进入基线轮判断,被标记为"基线"跳过但仍在new_items中
- 同轮择优时又被选上,导致残片入库
修复:
将碎片检测移至基线轮判断之前(约8261行),对new_items统一过滤
- 计算文本与已回复内容的最长公共子串占比
- 占比≥80%且长度≥3 → 直接丢弃
- 例:"端0(基岩版)" vs 已回复表格"端口(基岩版)" → 相似度85.7% → 拦截
|
2026-08-19 16:21:54 +08:00 |
|
youpaishidifu
|
5982cadad6
|
修复OCR残片入库问题:新增bot回复碎片检测
根因:
- 用户发送"关于我们@游戏专用"后,bot回复表格
- 下一轮OCR再次抓取同屏内容,把表格残片"端0(基岩版)"当成新消息
- 残片通过所有过滤(长度7有括号豁免短句检查,score=2放行)
- 残片入库后占用处理位置,导致真正的"关于我们"被跳过
修复:
在关键词打分前置增加bot回复碎片检测:
- 计算文本与已回复内容的最长公共子串占比
- 占比≥80%且长度≥3 → 判定为bot回复残片,直接丢弃
- 例:"端0(基岩版)" vs 已回复表格含"端口(基岩版) | 30679" → 公共子串相似度≥80% → 拦截
|
2026-08-19 16:11:54 +08:00 |
|
youpaishidifu
|
dd21327806
|
修复单核心词查询正文覆盖死锁:max(2,...)对1词永远失败
根因:'端0(基岩版)'→q_mean={'基岩'}, body_hits=1, 阈值=max(2,min(1,...))=2
1<2 → 必然返回False → 回复被拒,入库残片后后续轮询不回复
修复:max(2,...)→max(1,...),单核心词时阈值=1即可通过
多核心词查询(q_count≥2):max(1,...)≥2不变,防御强度不下降
|
2026-08-19 15:56:58 +08:00 |
|
youpaishidifu
|
fd147862c7
|
修复关键词打分器自拦截:时间比较排除刚插入的自身记录
根因:
should_skip_message 先 record_message_score 落库(时间=now),
再 _should_skip_by_time 按 message_hash 反查最后一条 → 命中的是
刚插入的自己 → db_time=now → '当前<=DB+5分' 永远拦截。
新消息首次出现即被拦,5分钟窗口永远走不完。
例:'那服务器有哪些基本信息,L ~' score=2(命中共用词'服务'/'务器')
时间比较命中自己 id=54(14:40:15) → 拦截,消息丢失。
修复:
record_message_score 返回 lastrowid,
_should_skip_by_time 增加 exclude_id 参数,查询排除自身。
验证:
- 新消息首次出现 → 放行(不再自拦截)
- 同文本5分内重现 → 拦截(去重仍生效)
- 同文本5分后重现 → 放行(时间超窗)
- 真实库下游测3/3 全部符合预期
|
2026-08-19 14:50:23 +08:00 |
|
youpaishidifu
|
c6b6a73970
|
修复[相关检查]:纯停用词查询模糊子串回退,容忍OCR/输入噪声
- 问题:查询"关于我们儿"匹配到index.md"关于我们"(匹配度8.66)却未通过内容相关性检查,跳过回复。
- 根因:q_mean为空(关于/我们均为停用词)落入纯停用词分支,整串精确子串匹配"关于我们儿" in full失败即拒,多一个"儿"字符无法容忍。
- 修复:精确匹配失败后增加模糊子串回退——按stripped长度从大到小在full中查找连续片段,命中长度≥max(3, len*0.75)放行。
- 测试:单测4/4(案例+回归),真实KB端到端:index 8.66→True,beibao 2.24/sdf1 0.60→False。
|
2026-08-19 14:20:14 +08:00 |
|
youpaishidifu
|
50474db1c7
|
修复关键词打分器:时间比较逻辑 + OCR时间源选择
1. 修复 _should_skip_by_time 方法调用参数缺失 text 的问题
2. 实现三源时间比较逻辑:
- DB落库时间:历史记录的最后处理时间
- OCR时间:从消息文本提取的时间戳(如'22:54:16')
- 系统时间:当前机器时间
3. 时间源选择规则:
- |OCR时间 - 系统时间| ≤ 10秒 → 使用OCR时间(更准确)
- 否则 → 使用系统时间
4. 重复判断规则:
- 当前时间 > DB落库时间 + 5分钟 → 放行(新消息)
- 否则 → 拦截(重复消息)
5. monitor.py 前置 OCR 时间戳提取,传递给打分器
6. 修复 threshold 默认值从 2 改为 1,确保 ≥1 分进入时间比较
参考:Task #1558, #1559
|
2026-08-18 23:51:57 +08:00 |
|
youpaishidifu
|
1e0a0f6e0d
|
fix(Task #1558): OCR语义去重豁免问句 - 防止相同问句被静默丢弃\n\n根因:\nbaseline轮次(22:53:35)处理'登录插件在哪儿下载?'后记录语义指纹,\n30秒TTL内(22:54:16)再次遇到完全相同的问句 → _dedup_semantic_fingerprint\n直接丢弃且无日志,用户问句永久丢失。\n\n修复:\n问句(含问号?/?或疑问词)豁免语义去重——用户可能重复提问相同问题。\n\n验证:\n- '登录插件在哪儿下载?' 不再被静默去重\n- 陈述句仍正常去重(如'关于我们'变体)
|
2026-08-18 23:14:51 +08:00 |
|
youpaishidifu
|
00335535cd
|
fix(Task #1559): @提及用户消息被UI规则/短句碎片误杀 - 昵称剥离联动豁免
根因:
1. _strip_qq_nickname 全局先行,把')游戏专用关于我们'->')关于我们'、
'@游戏专用关于我们'->'@关于我们',破坏规则4已知昵称豁免证据(28b3c93),
规则4/3b把残留当UI元素整行误杀;短句碎片杀'关于我们'残留
2. 残留孤立@字符:'那关于我们@游戏专用'只剥昵称留尾@,污染后续
3. 短@噪声行'有人@拜'并入上行污染用户消息
修复:
1. _strip_qq_nickname 收集提及余量集合(@/)昵称剥离后正文),返回元组
2. 全局/模糊剥昵称时连紧邻提及符(@)(( ))一起剥除
3. per-line 提及衍生消息豁免规则3b/规则4/短句碎片(余量非空=用户提问;
纯提及空余量仍是UI,规则3b照常拦截)
4. 行合并防护:含@无问号中文<=4字的噪声行不并入上行
验证:3单元测试+1端到端(真实日志输入)全过
- 5条'关于我们'变体全豁免存活,'有人@拜'/bot菜单/时间戳全被正确拦截
|
2026-08-18 19:26:39 +08:00 |
|
youpaishidifu
|
7587137b43
|
fix(Task #1558补): OCR时间戳仅参考 - 含中文无新鲜时间戳放行交下游过滤,仅纯UI噪声丢弃
|
2026-08-18 18:32:13 +08:00 |
|
youpaishidifu
|
8aa3639cf3
|
fix: 移除不存在的_kb_search调用,回退基线轮逻辑到原版
问题:commit 9673ed6 添加了 self._kb_search() 调用,但 MessageMonitor 没有此方法
导致 AttributeError: 'MessageMonitor' object has no attribute '_kb_search'
修复:回退基线轮逻辑到 c3f12cd 原版,简单标记第一条消息为基线不回复
|
2026-08-18 16:41:36 +08:00 |
|
youpaishidifu
|
9673ed6dab
|
fix: 修复基线轮吞掉有效消息的问题
问题:基线轮无条件跳过第一条消息,导致后续轮次一直卡在无意义的'关于我们@'消息上,无法处理真正的问句'那登录插件去哪儿下载?'
修复:基线轮先检查第一条消息是否有效(KB能匹配到结果),如果无效则直接跳过,继续处理下一条;只有当第一条消息有效时才作为基线不回复。
文件:monitor.py
- 第8210-8237行:修改基线轮逻辑,先验证消息有效性再决定是否跳过
|
2026-08-18 16:04:22 +08:00 |
|
youpaishidifu
|
c3f12cd6dc
|
fix(Task #1558): 重构消息去重:用关键词打分替代OCR时间戳判断
核心变化:
1. 完全移除OCR时间戳丢弃逻辑(_is_timestamp_old不再用于丢弃消息)
2. 改为关键词打分+时间感知去重:
- 得分≤1 → 直接放行(新消息)
- 得分≥1 → 检查最近一次打分时间:
* 最近300秒内有同类记录 → 丢弃(同一用户重复)
* 超过300秒或无记录 → 放行(不同用户的新提问)
3. 修复问题:
- 旧消息被陈旧时间戳继承导致误杀(如13:32:36继承给14:42:57的消息)
- 不同用户相同问题的误过滤(如"php管理员密码"被统一丢弃)
4. OCR时间戳仅作为参考,±10秒容差,超时用本地时间
修改文件:
- _keyword_scorer.py: 新增时间感知去重逻辑
- monitor.py: 移除时间戳丢弃分支
|
2026-08-18 15:12:51 +08:00 |
|
youpaishidifu
|
7d540f844a
|
fix(Task #1557): 修复单字感叹词被错误合并 + 短句碎片误过滤
问题:
1. OCR把'嘿,php那管理员后台的那个默认密码是多少啊?'拆成两行'嘿'和'php...'
行合并逻辑错误地将'嘿'合并进问句,导致消息变成'嘿;php那管理员后台的那个默认密码是多少啊?'
2. 用户消息'那关于我们'(5字)被短句碎片规则过滤,因为含'那'是口语前缀但原规则未识别
修复:
1. 行合并逻辑:检测单字感叹词(嘿/哈/哦/呃等),若当前行或上一行是单字感叹词则不合并
2. 短句碎片规则:添加口语前缀词(那/这/啥/咋/嗯/哦/嘿/哈)豁免检查,含这些词的短句放行
|
2026-08-18 13:47:25 +08:00 |
|
youpaishidifu
|
02b0c47c52
|
feat: 为bot回复添加关键词记录 (Task #1556)
|
2026-08-18 12:48:59 +08:00 |
|
youpaishidifu
|
ad88cfbb8f
|
feat: 在消息处理后记录关键词得分 (Task #1556)
|
2026-08-18 12:47:58 +08:00 |
|
youpaishidifu
|
c7afa13bc5
|
feat: 实现关键词打分去重系统 (Task #1556)
|
2026-08-18 12:45:04 +08:00 |
|