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 |
|
youpaishidifu
|
da619dd3da
|
fix: 添加行合并跳过bot回复的调试日志 (Task #1555)
|
2026-08-18 11:28:39 +08:00 |
|
youpaishidifu
|
adfcb5e591
|
fix: 行合并逻辑防止bot回复污染用户消息 (Task #1555)
|
2026-08-18 11:26:07 +08:00 |
|
youpaishidifu
|
28b3c930a7
|
修复规则4误杀已知用户名消息
- 规则4增加已知用户名豁免:OCR把@误读为)时,若用户名匹配已知列表则放行
- 已知昵称:游戏专用、草原探险服务器备用号、youpaishidifu
- 问题:')游戏专用 关于我们'被规则4丢弃
|
2026-08-18 10:59:21 +08:00 |
|
youpaishidifu
|
fb96be8a64
|
修复过滤规则误杀用户消息
- 规则4豁免:OCR把@误读为)时,若匹配到已知用户名则放行而非丢弃
- 短句过滤器:含句末标点(。)或口语确认词(好的/嗯/明白等)的短句放行
- 问题:')游戏专用 关于我们'被规则4丢弃,'那么好。'被短句过滤器丢弃
|
2026-08-18 10:57:04 +08:00 |
|
youpaishidifu
|
59cb6789f0
|
修复行合并吞掉用户问句bug
- _SENT_END增加中文句末语气词(呀啊呢吧嘛)
- 行合并增加疑问特征检查:裸@末尾或含问号时不合并,防止用户问句被黏进bot回复内容
|
2026-08-18 09:58:39 +08:00 |
|
youpaishidifu
|
bd4a78dbf0
|
修复EasyOCR超时导致消息丢失:增大外层超时到50s,混合消息检测改为提取最后一条消息
|
2026-08-17 23:17:38 +08:00 |
|
youpaishidifu
|
f8366798f6
|
refactor: md checkbox 一刀切,不再枚举符号
用户从不手打 markdown,短方括号结构才是稳定特征:
- [√] [x] [ ] [⚠] [✔] [V] 及 OCR 变体 [ √ ]、全角【√】全部覆盖
- 不再枚举具体勾选符号——OCR 偏差永远撞不全符号
- 多字词方括号([钻石] [VIP])绝不命中,保护用户正文
- \s*.?\s* = 空或单字符,md checkbox 的本质特征
改动点:
1. monitor.py _MD_TAIL_PATTERNS: checkbox 模式改一刀切 + 补全角【】
2. monitor.py _is_markdown_document: checkbox 检测同步放宽
3. monitor.py OCR 过滤链: checkbox残片/多checkbox/计数/行首菜单 4处同步
4. auto_reply.py _clean_markdown: checkbox 移除改一刀切,(?!\() 保护链接
策略(用户定):md在头→整段跳过;在中间→看语义(C#负向前瞻已挡);在尾→一刀切
|
2026-08-17 21:55:28 +08:00 |
|
youpaishidifu
|
4005369492
|
fix: 跨轮语义去重+checkbox清理
Task #1548: 跨轮语义去重增强
- 三层策略: Jaccard≥0.75 → 核心词重叠≥0.80 → 子集检测≥0.90
- 新增 _extract_content_keywords 提取CJK bigram关键词
- 修复登录插件去哪儿下载等变体查询未被拦截问题
Task #1549: Markdown小尾巴清理
- _clean_markdown 新增 checkbox 标记移除
- 支持 [√] [✗] [X] [x] [V] [v] [ ] [⚠] [!] 格式
- 修复 bot回复末尾残留 [√] GitHub(稳定版) 问题
|
2026-08-17 21:23:31 +08:00 |
|
youpaishidifu
|
ace66863f1
|
fix: 添加平台名碎片过滤规则,拦截GitHub/gitee/gitcode+稳定版的OCR残片
问题:OCR把bot回复中的列表项(如"[√] GitHub(稳定版)")误认成用户消息
特征:含平台名+版本标识,无实质提问内容
修复:在OCR预处理阶段添加专门过滤规则
- 多checkbox+仅1个中文词 → 列表碎片
- 多平台名+无问号+中文词≤2 → 平台名堆砌
- 单checkbox+单平台名+无问号+仅1个中文词 → 单条列表项碎片
- 有问号但无实质内容 → 纯平台名碎片
测试:14个用例全部通过,不会误杀真实用户提问
|
2026-08-17 19:43:21 +08:00 |
|
youpaishidifu
|
66d748a884
|
fix: OCR合并消息时问句被MD尾巴剥离吞掉
问题:stage[3]尾部消息'php有2种登陆模式:...]否|,那那个登录插件应该又去哪儿下载呢?'
被_strip_markdown_tail在首个|处切断,只保留'php有2种登陆模式:...]是',
用户下载问句'那那个登录插件应该又去哪儿下载呢?'被丢弃。
修复:
1. 问句保护:检测文本含问号但首段无问号时,在最后一个|处拆分
2. 尾部含问号的部分单独保留,不进入md剥离流程
3. md_stripped后把问句追加回来,确保用户提问不被吞掉
测试:
- 问题场景:download question preserved ✓
- 正常bot回复(无问句): unaffected ✓
- 问句在头部:unaffected ✓
|
2026-08-17 18:55:11 +08:00 |
|
youpaishidifu
|
1a6692ee12
|
fix: 下载查询仍选protect温馨提示+问句被混合乱码误杀
问题1: '登录插件去哪儿下载'仍返回protect'温馨提示'简略链接而非完整下载列表
- 根因: 质量分+10对两者都加(protect body '- [ √ ] 插件下载:见...'也含'- [')
且heading字段把正文吞进来('## 温馨提示...下载...')导致'下载' in heading误判
- 修复(gui.py): heading只看第一段(<br>|换行|之前), 分支顺序调整为:
① heading首段含'下载'→+20 ② 指针式提示('依托[xx]'或短body含'见')→-10
③ 表格/链接列表→+10 ④ body长度加权
结果: sdf1_login'### 2.1 下载'(45.73) > protect'温馨提示'(17.48)
问题2: 第三次用户消息'pHP用户后端有哪两种登录模式啊?'整条被丢弃
- 根因: OCR把'PHP'打散成'pH P', 大写被CJK分割3组≥2→混合乱码误判
问句豁免只加了协议检测, 混合乱码检测没有
- 修复(monitor.py): 混合乱码检测新增问号'??'豁免
⚠ 只认问号不认疑问词('哪'等疑问词在真乱码Task#1474中常见, 会误放)
|
2026-08-17 18:06:30 +08:00 |
|
youpaishidifu
|
0feadd9c62
|
fix: @提及昵称+正文拼凑吞消息+GUI冻结(主线程sleep)
问题1: '@咱想了解一下咱那个登录插件去哪儿下载?' 只剩'?'
- 根因: _at_user_pattern贪婪吞18字符当username, rest='?'
- is_clean_at=False只拦了入库, 但ts已被覆盖成rest('?')→整条问句丢失
- 修复: 不干净时仅剥@保留全部正文(宁留脏昵称不吞消息)
问题2: 跟踪日志时GUI冻结必须ctrl+c
- 根因: _execute_reply跑在Tk主线程, _paste_and_send失败后
time.sleep(5)×3次=主线程冻结15秒(QQ窗不前置时必失败)
- 修复: after()异步重试+data['_attempt']计数, 主线程不阻塞
|
2026-08-17 17:41:39 +08:00 |
|
youpaishidifu
|
c13a41771a
|
fix: 下载查询优先选择详细表格而非简略提示
问题:'那登录插件去哪儿能下载到?'返回protect'温馨提示'简略链接,
而非sdf1_login'2.1 下载'详细表格。
根因:gui.py简单取第一个通过相关性检查的候选,
protect score=27.53 > sdf1_login score=25.73,被优先选中。
修复:收集所有相关候选,按质量分排序:
- 下载类查询:body含表格/链接列表→额外+10分
- 其他查询:body长度加权
选质量分最高的候选回复。
|
2026-08-17 15:59:53 +08:00 |
|
youpaishidifu
|
953e7de62b
|
fix: 反向包含剥离误伤问句+语义去重阈值过低
问题1: 反向包含剥离把用户问句中的共享词(如'操作')误判为bot回复片段剥掉
- 原逻辑: 逗号分段后,part in r → 剥离
- 根因: '那领地系统有哪两种操作模式啊?'中'操作'匹配旧回复表头'操作方式'
- 修复: 检测问号/疑问词时跳过策略2(问句豁免)
问题2: 语义去重阈值0.3太低,轻微OCR变体就触发重复
- 原阈值: 0.3(Jaccard on CJK bigrams)
- 实测: '操作模式?' vs '操作模式啊?游戏专' Jaccard=0.47 > 0.3 → 误杀
- 修复: 提高到0.75,仅真正重复查询(OCR变体/加@前缀)才拦截
|
2026-08-17 15:06:49 +08:00 |
|
youpaishidifu
|
5455d3560b
|
fix: OCR口语词/碎片词污染核心词+下载全文回退+动作表格兜底
1. non_core_kw新增: 有人(@OCR误读)/一嘴/那家/那价
2. core_kw过滤纯ASCII<=2碎片词(ij等OCR噪声)
3. 下载意图新增全文回退: section无'登录'但整文档是登录插件(全文17次)则放行
4. 动作查询表格兜底: 查询'操作模式'vs表'操作方式'词级匹配失败时, 表格+action词命中放行
|
2026-08-17 14:16:36 +08:00 |
|
youpaishidifu
|
bd35975d2e
|
fix: 口语填充词+下载/表格加权,修复三个匹配错误
1. auto_reply.py: non_core_kw新增'一句/问一句/再问'
- 用户说'我再问一句'中的'一句'是填充词,不应作为核心词
2. knowledge_base.py: 下载意图加权从2.5→4.0
- 强化heading含'下载'的section优先级
- 修复sdf1_login.md的'2.1 下载'被protect.md的'温馨提示'压过
3. knowledge_base.py: 表格内容奖励从3.0→5.0
- 强化含'操作'等关键词的表格section优先级
- 修复'操作方式'表格被'领地列表'描述压过
|
2026-08-17 13:42:50 +08:00 |
|
youpaishidifu
|
174b606721
|
fix: 跨轮语义去重+KB核心名词加权,修复公告信息匹配到基本信息
1. monitor.py: 新增跨轮语义去重(5分钟TTL, Jaccard≥30%)
- _recent_user_queries列表 + _is_semantically_duplicate()
- _poll候选构建阶段检查,回复后写入记录
2. auto_reply.py: non_core_kw新增通用信息类名词
- '信息','内容','详情','情况','介绍'不应作为核心词
- 原因:公告信息核心词应是{公告}而非{公告,信息}
3. knowledge_base.py: core_nouns新增公告/更新
- 查询含核心名词时,section含该名词→2倍加分,不含→0.3倍惩罚
- 修复近期公告(2.93)被基本信息(6.56)压过的问题
|
2026-08-17 12:09:23 +08:00 |
|
youpaishidifu
|
0fe4f018ba
|
fix: 核心词零命中硬拒绝,彻底修复登录插件匹配到背包的牛头不对马嘴
根因:_has_content_relevance 中,'下载'被排除出 core_kw(core_kw={'登录'}),
但 has_ht=True(heading '下载地址' 命中 q_mean 中的'下载'),
导致跳过多关键词覆盖检查和正文覆盖检查,直接 return True。
即使下载意图检查拒绝了 beibao(核心词'登录'未命中),函数仍然返回 True。
修复:下载意图拒绝后、多关键词覆盖检查前,新增核心词零命中硬拒绝:
当 core_kw 非空但 core_hits=0 时无条件 return False。
|
2026-08-17 10:47:25 +08:00 |
|
youpaishidifu
|
cc95cd3ffc
|
fix: 增强KB查询清理,移除bot回复碎片残留
问题:
- OCR捕获时可能同时截到用户消息和bot之前的回复
- 如"那个登录插件去哪下载[官方下载"或"俺想知道登录插件在哪儿下载[官方下载"
- 末尾的"[官方下载"会污染查询,导致beibao.md被错误匹配(匹配度高70.51)
修复:
新增第7步清理逻辑:
1. 检测问句结束后的bot回复关键词([官方下载]/[bbsmc分流]/插件下载等)
2. 如果有问号,截断到问句结束
3. 如果没有问号但包含bot回复Markdown格式,在"["前截断
预期效果:
- "那个登录插件去哪下载[官方下载" → "那个登录插件去哪下载"
- "俺想知道登录插件在哪儿下载[官方下载" → "俺想知道登录插件在哪儿下载"
|
2026-08-17 09:42:34 +08:00 |
|
youpaishidifu
|
f9c5ab2142
|
fix: 新增'知道'/'想知道'为口语填充词,不作为核心词
问题:
- 用户问"俺想知道登录插件在哪儿下载"时,核心词提取为{'知道', '登录', '下载'}
- "知道"是口语填充词,不应参与核心词匹配
- 导致核心词覆盖检查失败:core_hits=1/3, missing=['登录', '知道']
- sdf1_login.md被错误拒绝
修复:
- 将'知道'和'想知道'加入non_core_kw停用词列表
- 预期效果:核心词变为{'登录', '下载'},覆盖检查通过
测试预期:
- '俺想知道登录插件在哪儿下载' → core_kw={'登录', '下载'} → sdf1_login通过
|
2026-08-17 09:40:58 +08:00 |
|
youpaishidifu
|
ecadaaa9ae
|
fix: 修复下载类查询被URL路径误匹配的问题
问题:
- 用户问"那个登录插件去哪下载",beibao.md(背包插件)被错误选中
- 下载意图检查正确拒绝了beibao(因为不含"登录"核心词)
- 但子串回退逻辑却放行了:因为"插件"出现在URL路径 /plugin/ 中
根因:
子串回退检查phrase in full时,没有排除URL路径中的匹配
导致通用词"插件"在URL中出现就误判为相关文档
修复:
1. 下载类查询要求:核心名词短语(如"登录")必须在文档正文中出现
不能只是"插件"这种通用词在URL路径中命中
2. 如果核心名词未命中,直接拒绝子串回退
3. 额外检查:如果phrase只在URL中出现,也拒绝
测试预期:
- '那个登录插件去哪下载' → beibao拒绝(不含"登录"),sdf1_login通过(含"登录")
- '哪个插件下载' → beibao可能通过(只有"插件"通用词)
|
2026-08-17 09:22:08 +08:00 |
|
youpaishidifu
|
4acbea8440
|
fix: 增强同轮择优机制,降低URL/链接格式消息的优先级
问题:
- 用户发送新消息后,OCR连续多次只捕获到旧截图
- 等到截到新图时,内容已是bot旧回复+用户消息的混合
- 同轮择优选中了这条污染消息(13.0分),导致bot抢跑回复旧内容
根因:
_score_message_quality()对URL/链接格式消息的评分不够低
- 真实用户消息通常是自然语言(含疑问词、较短)
- bot回复常包含URL、链接格式、英文平台名等
修复:
- 新增URL/链接格式惩罚:
* https:// → -20分
* 域名片段(.cn .net)→ -8分
* Markdown链接 [text](url) → -10分
* 特定平台名(github/gitee/gitcode等)→ -5分
- 新增中英混合惩罚:英文占比过高时 -5分
- 预期效果:URL碎片类消息分数降至负分,不再被选为候选
测试预期:
- 'git.ypshidifu.cn官方下载...' → 大幅降分
- '俺想下载那个登录插件' → 保持高分(含疑问词)
|
2026-08-16 23:01:45 +08:00 |
|
youpaishidifu
|
8b116ff824
|
fix: 修复下载意图匹配过于宽松导致牛头不对马嘴问题
问题:用户问'登录插件下载地址'时,bot错误匹配到beibao.md(背包插件)而不是sdf1_login.md(登录插件)
根因:下载意图检查只要求标题包含'下载'就放行,没有验证其他核心关键词(如'登录'、'插件')是否匹配文档
修复:
- 如果查询只有'下载'一个核心词 → 放宽检查(普通下载类查询)
- 如果查询有多个核心词(如'登录插件下载地址')→ 要求至少一个其他核心词命中文档
- 未命中时记录debug日志便于排查
测试:预期'登录插件下载地址'现在应匹配sdf1_login.md而非beibao.md
|
2026-08-16 22:45:03 +08:00 |
|
youpaishidifu
|
3bfdbff40c
|
fix: 下载类回复保留Markdown链接格式
问题:
- _clean_markdown()把[文本](URL)转换成纯文本,丢失URL
- 用户问"登录插件下载地址"时,回复变成"官方下载 bbsmc分流"
- 实际应该是"[官方下载](https://...) [bbsmc分流](https://...)"
修复:
- 新增 _clean_markdown(keep_links=False) 参数
- 检测下载意图(含下载/地址关键词 + 含URL)
- 下载类回复保留原始Markdown链接格式
效果:
- 非下载类:仍清理Markdown(普通问答)
- 下载类:保留[文本](URL)格式(含可点击链接)
相关issue: #1542
|
2026-08-16 22:37:07 +08:00 |
|
youpaishidifu
|
b3f1ecfd61
|
fix: 基线轮不应加入全局seen集合
问题:基线轮把消息加入 _seen_messages 后,后续轮次永远跳过该消息。
用户真实提问被永久拦截,bot不再回复。
修复:
- 基线轮只做 'seen.discard' 防止未来重复,不加 _seen_messages
- 同轮择优逻辑前置,先收集所有候选再择优
- 污染消息和真实消息同时评估,选质量分最高的触发回复
相关issue: #1542
|
2026-08-16 21:59:51 +08:00 |
|
youpaishidifu
|
9a7580acd0
|
feat: 同轮择优机制防bot抢跑
当一轮poll检测到多条候选消息时,只选最可能是真实用户消息的那条触发回复。
新增 _score_message_quality() 方法,评估维度:
- 长度惩罚(越长越可疑)
- 疑问词奖励(用户提问特征)
- 噪声前缀惩罚(UI标签提示污染)
- 有效关键词奖励(插件/下载等)
- 英文比例惩罚(乱码提示)
- 标点混乱惩罚(OCR噪声)
修复场景:
污染历史消息(长+无前缀+无疑问词) vs 真实用户消息(短+含疑问词)
→ 择优后只回复真实用户消息,避免bot抢跑
相关issue: #1542
|
2026-08-16 21:37:46 +08:00 |
|
youpaishidifu
|
7d78fe4918
|
fix(monitor): 修复策略4定位逻辑,正确处理特殊符号
问题:原定位逻辑使用 \s\W_ 匹配内容字符,但 √ 被误判为非内容字符,
导致 '你好 [√] GitHub(稳定版) 请问怎么下载?' 被错误处理为 '你好 [√] 载?'
修复:扩展内容字符判断,包含特殊符号 []()√✓✗
- 中文字符、英文字母、数字 → 内容字符
- 特殊符号 []()√✓✗ → 内容字符(用于匹配 bot 回复格式)
测试验证:
✓ '官方下载 bbsmc分流 那我知道公告信息' → '那我知道公告信息'
✓ '你好 [√] GitHub(稳定版) 请问怎么下载?' → '你好 请问怎么下载?'
保留 '纯粹的用户消息,没有bot回复'
commit 3f8d9e1 (2026-08-16)
|
2026-08-16 18:45:18 +08:00 |
|
youpaishidifu
|
78a4bd3ed8
|
fix(monitor): 策略4改为贪婪匹配,不管bot回复在哪都摘掉
原策略4是头部剥离(只处理bot回复在消息前面的情况),
用户反馈:OCR不确定哪天会把小帽子扣在哪,需要用贪婪匹配兜底。
新策略4:
1. 归一化文本(去空格标点),抵抗OCR噪声
2. 遍历已知bot回复,检查是否包含在文本中
3. 如果包含,定位并移除匹配部分
4. 保留剩余的用户消息
覆盖场景:
- 头部:'官方下载 bbsmc分流 那我知道公告信息' → '那我知道公告信息'
- 尾部:'那个登录插件在哪 见github' → '那个登录插件在哪'
- 中部:'你好 [√] GitHub(稳定版) 请问怎么下载' → '你好 请问怎么下载'
commit a3f7c2e (2026-08-16)
|
2026-08-16 18:37:18 +08:00 |
|
youpaishidifu
|
21a2890480
|
fix(monitor): 添加策略4-头部剥离,修复bot回复拼在消息前面的问题
问题:OCR把bot回复拼在用户消息前面("小帽子"),导致:
- 查询变成:bot回复+用户消息
- 例:'官方下载 bbsmc分流 那我知道咱们服务器有哪些公告信息呀?'
- 下载意图检查提前匹配(query含'下载'),错误路由到下载地址
修复:在 _strip_bot_reply_fragments() 添加策略4:
1. 定位中文疑问词(那/请问/想知道/怎么/哪里/什么等)
2. 分割头部(问句前)和尾部(问句及之后)
3. 归一化比较头部与已知bot回复
4. 匹配成功则剥离头部,只保留用户消息
测试验证:
输入: '官方下载 bbsmc分流 那我知道咱们服务器有哪些公告信息呀?'
输出: '那我知道咱们服务器有哪些公告信息呀?' ✓
commit 5d9e8f3 (2026-08-16)
|
2026-08-16 18:26:58 +08:00 |
|
youpaishidifu
|
9c11ac4246
|
fix(gui): 修正@提及清理逻辑,防止误删中文昵称
问题:原步骤2正则在匹配@时包含了中文字符范围[A-Za-z0-9_\u4e00-\u9fff],
导致'@问问那个登录插件'被整体匹配并删除,造成消息内容丢失。
修复方案:
1. 步骤2改为只匹配ASCII昵称:@[A-Za-z0-9_]{1,20}(?=\s|$)
- 原因:OCR残留的中文昵称前缀(如@问问...)不应被步骤2处理
- 真实@提及格式通常为ASCII用户名后跟空白(如@user123 你好)
2. 步骤4a改为'^@\s*',仅移除开头的孤立@前缀
- 例:'@问问那个登录插件' -> '问问那个登录插件' ✓
- 例:'@小明 这个插件' -> '小明 这个插件' ✓
- 例:'你好@小明 这个插件' -> 保留原样(真实@提及)
commit 9f3c7d2 (2026-08-16)
|
2026-08-16 17:23:13 +08:00 |
|
youpaishidifu
|
bb24d8990b
|
fix(gui): 修复孤立@前缀误删问题
问题:步骤2的正则
会匹配整个字符串(如),
然后被步骤4a的 误删(因为后无空格)。
根因:
1. 步骤2正则匹配了整串
2. 步骤4a要求后有 (空白或无),但实际是(中文紧邻)
3. 两者不匹配,导致残留
修复:
- 步骤4a改为 (移除开头任意数量的@),无论后面是否紧跟中文
- 确保格式的孤立@被正确清除
commit 7c8f3e1 (2026-08-16)
|
2026-08-16 17:18:54 +08:00 |
|
youpaishidifu
|
43484b65dd
|
fix: 下载意图检查提前 + 语义去重防双回复
问题1: 核心词覆盖检查在下载意图检查之前执行
- 查询'那个登录插件是在哪个地方下载?'含3个核心词{登录,插件,下载}
- sdf1_login.md的'## 下载地址'只含'下载'(1/3),不满足阈值>=2
- 直接return False,下载意图检查从未执行
- 修复:将下载意图检查移到核心词检查之前,提前放行
问题2: 相同意图不同表达导致双回复
- hash('{platform}:{msg}:{answer[:80]}')要求完全一致
- OCR噪声导致同义重复(如'在哪下载'vs'下载地址')
- 修复:添加Jaccard相似度(CJK bigram)语义去重
- TTL=30秒,阈值>=0.3视为重复,缓存上限50条
commit 8d7c9e2 (2026-08-16)
|
2026-08-16 16:17:34 +08:00 |
|
youpaishidifu
|
3cdfd32225
|
fix(monitor): 策略3增加边界检查,防止误触发
问题:'? 插件下载见github'这种问句前无内容的情况也会触发剥离
修复:
1. 要求问句前至少有8个字符(避免单字符问句误触发)
2. 要求问句前至少有4个中文字符(确保是完整问句)
3. 要求问句后至少有4个中文字符(确保尾部有足够匹配内容)
测试覆盖:
- ✓ 污染查询正确剥离
- ✓ 正常查询保持不变
- ✓ 边界情况不再误触发
|
2026-08-16 15:32:08 +08:00 |
|
youpaishidifu
|
27a2889028
|
fix(monitor): 策略3-尾部匹配剥离bot回复
增强_strip_bot_reply_fragments函数,添加第三种剥离策略:
问题:OCR同屏捕获时,bot回复被拼接到用户消息末尾
例:"个登录插件是在哪个地方下载? 4001234S67 ]插件下载:见github..."
解决方案:
1. 检测问句后的尾部内容(≥15字符)
2. 提取纯中文部分,排除英文/数字干扰
3. 与数据库中已存储的bot回复计算相似度
4. 相似度≥85%时直接截断到问句结束
效果:
- 抵抗OCR噪声(标点/空格差异)
- 抵抗英文/数字干扰(只比较纯中文)
- 精确识别尾部污染并剥离
测试验证:
- 污染查询: '个登录插件是在哪个地方下载? 4001234S67 ]插件下载:见github...'
- 相似度: 100% (纯中文'插件下载见'完全匹配)
- 输出: '个登录插件是在哪个地方下载?'
|
2026-08-16 15:27:52 +08:00 |
|
youpaishidifu
|
c75c771604
|
fix(gui): 清理OCR污染查询,防止同屏消息碎片污染KB搜索
问题:同屏OCR捕获时,用户问句后可能拼接其他消息的碎片
如"个登录插件是在哪个地方下载? 4001234S67 ]插件下载:见github..."
导致protect.md因"插件下载"关键词命中而得分过高(195.15)
修复:在_clean_query_for_kb中添加OCR污染检测
- 匹配模式:6位以上ID + ] + 插件下载等bot回复关键词
- 检测到后截断到第一个完整问句结束(?或?)
|
2026-08-16 14:49:13 +08:00 |
|
youpaishidifu
|
8bafd1e209
|
fix(monitor): 修复模糊匹配误删正常文本的严重bug
问题:
单字符昵称'祁'、'爱'等允许1字符编辑距离,导致:
- '一'被误识别为'祁'并删除
- '唉'被误识别为'祁'并删除
- '他'被误识别为'祁'并删除
消息内容被严重污染
根因:
_fuzzy_find()无长度限制,短昵称的模糊匹配过于宽松
修复:
添加长度保护:只有len(nick) >= 4的昵称才允许模糊匹配
短昵称仍支持精确匹配,但不进行容错
测试验证:
✓ 长昵称OCR误识别:'草原深险' → '草原探险' 正确模糊匹配
✓ 短昵称精确匹配:'祁' 仍然可以精确匹配删除
✓ 防误删:'服务器备用电源坏了' 不误匹配
✓ 防误删:'一'、'唉'、'他'等正常汉字不被删除
|
2026-08-16 14:29:14 +08:00 |
|
youpaishidifu
|
0b623fe098
|
fix(monitor): 添加OCR昵称模糊匹配,支持形近字容错
问题:OCR把"草原探险服务器备用号"误识别为"草原深险服务器备用号",
导致精确匹配失败,昵称无法剥离,消息内容被污染。
修复:新增_fuzzy_find()静态方法,使用滑窗比较实现1字符编辑距离的容错匹配。
在全局匹配步骤中,当精确匹配失败时自动降级到模糊匹配。
测试验证:
✓ OCR形近字:"草原深险" -> "草原探险" 正确识别
✓ 含上下文:"你好草原深险服务器备用号有问题" 正确定位
✓ 正常匹配:精确匹配仍优先,无性能损耗
✓ 防误删:"服务器备用电源坏了" 不误匹配
|
2026-08-16 13:30:59 +08:00 |
|
youpaishidifu
|
c06c7df065
|
fix(monitor): 修复群聊拆分正则误匹配邮箱导致消息丢失
问题:OCR输出中包含邮箱地址如"youpaishidifu@qq.com",原正则
会匹配"youpaishidifu@"作为分隔符,
导致群聊拆分只保留"qq.com",消息内容完全丢失。
根因:
1. \s不匹配换行符,导致含换行的匹配失败
2. 无邮箱格式排除机制,@后面有.时仍被误匹配
修复:
- 使用显式空白字符列表 (?=[\n|\t| |\t|,|:]) 替代 \s
- 添加负向前瞻 (?@(?![^@]*\.)) 排除@后面含.的邮箱格式
- 两条款分离:空白/标点匹配 + @非邮箱匹配
测试验证:
✓ 换行+@格式正确拆分
✓ 逗号/空格分隔正确拆分
✓ @直接粘连正确拆分
✓ 邮箱地址不被误匹配
✓ 最新消息内容完整保留
|
2026-08-16 12:52:20 +08:00 |
|
youpaishidifu
|
5dfc89dd08
|
删除不属于代码部分的文件
|
2026-08-16 12:47:47 +08:00 |
|
youpaishidifu
|
ee0e1e9acd
|
移除未知文件
|
2026-08-16 12:47:27 +08:00 |
|
youpaishidifu
|
2175400744
|
fix(monitor): 修复全局昵称匹配正则边界过严问题,改用简单子串匹配
原正则要求前后必须是空格/标点/字符串边界,导致常见OCR格式无法匹配:
- "你好草原探险服务器备用号,我想问" → 未剥离(失败)
- "=>草原探险服务器备用号游戏专用有问题" → 未剥离(失败)
新方案:统一使用最长优先的子串匹配
- 按昵称长度降序排序,优先匹配长昵称(避免短前缀误匹配)
- 直接字符串查找并移除,简单高效
- 不会误删部分匹配的文本(如"服务器备用电源"不会误删"备用")
测试验证:
✓ 纯昵称剥离
✓ 箭头前缀剥离
✓ 汉字前缀+逗号剥离
✓ 连续多个昵称剥离
✓ 短昵称剥离
✓ 防误删(部分匹配不误删)
|
2026-08-16 12:12:09 +08:00 |
|
youpaishidifu
|
91c027f5a1
|
fix(monitor): 扩展昵称剥离为全局匹配,无论藏在何处都能识别
【问题】当前 _strip_qq_nickname 只支持前缀匹配(startswith),
但 OCR 输出中昵称可能出现在文本的任何位置,导致部分昵称无法剥离。
【场景复现】
- 输入: '=>草原探险服务器备用号游戏专用有问题,他们常用的登录插件是在哪里下载的?'
- 期望: '有问题,他们常用的登录插件是在哪里下载的?'
- 实际(修复前): 部分昵称残留,污染知识库检索
【修复方案】
在 _strip_qq_nickname 主循环中新增步骤5(全局匹配兜底):
1. 前缀匹配优先处理常见粘连格式
2. 若前缀匹配无变化,启用全局正则匹配扫描文本中间
3. 使用前后边界检查避免误删正文中的正常文本
4. 限制最大迭代次数(20次)防止无限循环
【测试验证】
✓ '=>草原探险服务器备用号游戏专用有个问题...' → '有个问题...'
✓ '草原探险服务器备用号游戏专用有个问题...' → '有个问题...'
✓ '你好草原探险服务器备用号,我想问...' → '我想问...'
✓ '谢谢游戏专用,这个问题解决了' → '这个问题解决了'
【新增non_core_kw】口语填充词过滤(2026-08-16)
- '有个', '问题', '常用', '他们', '各位', '大家', '小伙伴'
- 防止口语填充虚增核心关键词数量导致误拒绝
【早期昵称剥离】(2026-08-16)
- 在_process_ocr_output开头调用_strip_qq_nickname
- 防止昵称污染时间戳检测和行合并逻辑
- 位置:垃圾检测之前(第3172行)
|
2026-08-16 12:07:04 +08:00 |
|
youpaishidifu
|
dec97d1687
|
修复:口语填充词导致关键词覆盖率误判 + OCR早期昵称剥离
【问题1】关键词覆盖率虚高
查询"有个问题。他们常用的登录插件是在哪里下载的?":
- 修复前:core_kw含{'有个','问题','常用','登录','下载'}共5词
- sdf1_login heading"### 2.1 下载"仅命中1词
- 阈值=max(1,(5+1)//2)=3 → 1<3 → 误拒绝
- 修复后:'有个','问题','常用'加入non_core_kw
- core_kw只剩{'登录','下载'}共2词,阈值=1
- heading含"下载" → 1/2 ≥ 1 → 通过 ✓
【问题2】昵称污染早期处理链路
昵称"草原探险服务器备用号"在OCR原始文本中会污染:
- _ocr_text_has_fresh_timestamp时间戳检测
- 行合并逻辑
- _split_and_denoise_segments分段
修复:在_process_ocr_output开头(垃圾检测之前)调用_strip_qq_nickname
确保所有后续步骤都不受昵称字符干扰
新增non_core_kw词条:'有个','问题','常用','他们','各位','大家','小伙伴'
|
2026-08-16 11:35:21 +08:00 |
|