Commit Graph
47 Commits
Author SHA1 Message Date
youpaishidifu 5d38286793 修复知识库搜索'怎么装那云背包插件'返回错误结果
1. knowledge_base.py: 添加同义词映射'云包'→['云背包'],修复OCR识别误差
2. auto_reply.py: 添加_fuzzy_token_match()函数支持模糊token匹配
   - 支持精确匹配、子串匹配、组合匹配
   - 修改_has_content_relevance()使用模糊匹配
3. 修复了用户查询'怎么装那个云包插件?'无法命中beibao.md安装方法section的问题

测试结果:
- beibao.md的安装方法section通过相关性检查(relevance=True)
- 质量分:beibao.md=92.03,sdf1_login.md=81.64
- 搜索结果排名:beibao.md排名第2(protect排名第1,但protect会被复合标题检测拒绝)
2026-09-16 22:36:26 +08:00
youpaishidifu c54ded4ecf 修复知识库搜索:添加使用方法意图加权和兑换码插件特殊加权
- 问题:查询"兑换码插件怎么用的?"返回php登录模式选择,而非sdf1.md使用方法
- 根因:1) 缺少"怎么用"→"使用方法"同义词映射;2) 缺少使用方法意图加权;3) 缺少兑换码插件特殊加权
- 修复:
  1. 在SYNONYMS中添加"怎么用"→"使用方法"映射
  2. 在search函数中添加使用方法意图加权(heading含"使用方法"的section×4.0)
  3. 在search函数中添加兑换码插件特殊加权(查询含"兑换码插件"且文档标题含sdf1→×5.0)
- 测试:扩展查询"兑换码插件使用方法的?"匹配sdf1.md使用方法section,得分52.181排名第一
2026-09-16 17:33:31 +08:00
youpaishidifu 36f395c680 修复知识库搜索:移除'玩家'从停用词列表,解决'玩家权利'查询匹配错误
- 从auto_reply.py的_STOPWORDS集合中移除'玩家'
- 添加注释说明原因:Minecraft服务器场景中'玩家'是高频核心词
- 验证:查询'玩家有哪些权利?'现在正确返回'玩家权利'section
- Task #1732 和 #1733
2026-09-16 16:40:23 +08:00
youpaishidifu d62503baf4 修复:背包插件查询匹配到php登陆模式的问题
问题:用户问'背包插件怎么用'时,系统返回了php.md的'php有2种登陆模式'内容
原因:背包插件查询中包含'插件',被php.md和sdf1_login.md误匹配
修复:
1. knowledge_base.py:添加针对'背包插件'查询的特殊处理,优先匹配beibao文档
2. auto_reply.py:添加针对'背包'查询的特殊处理,确保匹配beibao文档
测试:验证'背包插件怎么用'等查询正确匹配到beibao文档
2026-09-16 15:30:25 +08:00
youpaishidifu 08d4bcaf7e 修复[知识库搜索]:兑换码插件查询匹配到php登陆模式的问题
- 问题:查询'兑换码插件怎么用啊?'时,系统返回了php.md的'php有2种登陆模式'表格,而非sdf1.md的使用方法
- 根因:知识库搜索评分逻辑中,php.md的'CDK兑换'与查询'兑换码'相关,导致匹配度高
- 修复:
  1. 在knowledge_base.py中添加同义词映射'兑换码'→['CDK', 'cdk']
  2. 在knowledge_base.py中添加针对'兑换码插件'查询的特殊处理,优先匹配sdf1文档,降权php/phpadmin文档
  3. 在knowledge_base.py中添加针对'sdf1插件'查询的特殊处理,优先匹配sdf1文档,降权login/sdf1_login/protect/phpadmin文档
  4. 在knowledge_base.py中添加针对'sdf1'查询的特殊处理,优先匹配sdf1文档,降权login/sdf1_login/protect文档
  5. 在knowledge_base.py中修复section级得分未应用文档级加权的问题
  6. 在auto_reply.py中添加针对'兑换码'查询的特殊处理,当查询含'兑换码'且文档标题含'sdf1'时直接放行
- 测试:查询'兑换码插件怎么用啊?'现在正确匹配到sdf1文档的'## 指令介绍'section
2026-09-16 14:44:06 +08:00
youpaishidifu 771fce3ef1 Task #1728: 修复'背包插件怎么装'匹配错误section
根因:protect.md的'操作方式|是否支持'表格通过表格兜底策略被boost到
max_score×2=99.82分,压过beibao.md的'安装方法'(76.32分)

修复:
1. 安装意图查询时,将'安装'加入核心词列表,确保heading含'安装'的
   section获得核心词奖励
2. 表格兜底策略:安装/下载意图查询时,表格必须含安装/下载相关词
   (安装/下载/前置/插件/依赖)才boost,防止无关表格压过正确答案
2026-09-16 13:11:29 +08:00
youpaishidifu be0cc208e7 修复[知识库搜索]:调整权重确保'刷量'查询匹配正确section 2026-09-16 11:23:44 +08:00
youpaishidifu 30927ffe92 修复[知识库搜索]:添加同义词映射'装'→'安装',安装意图加权,修复'云背包插件怎么装'返回介绍而非安装方法 2026-09-16 10:39:04 +08:00
youpaishidifu be91fbad35 Fix #1701: 修复知识库搜索权重计算导致牛头不对马嘴问题
问题:用户问用户组是怎么配置的,系统回复了sdf1_game.md的问答题表格配置块,
而不是protect.md中关于用户组的正确描述。

根因:sdf1_game.md的题目配置格式section body包含完整代码块(数百字符),
gui.py质量分body_len/100给该section大量加分,压过真正答案。

修复(三处):
1. knowledge_base.py: TF-IDF corpus构建时移除代码块内容
2. auto_reply.py: 相关性检查中移除代码块内容
3. gui.py: 质量分计算时截断代码块只计算说明文字长度
2026-09-11 22:20:09 +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 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 ae27ee91cd fix: 修复KB搜索回复内容不对和历史消息重复处理问题
问题1:回复内容不对
- protect.md的section heading包含整个section内容(含<br>和列表标记),导致下载意图加权检查误匹配
- 修复:增加检查,如果heading含<br>或列表标记,说明是复合标题,需检查下载是否出现在标题主体部分

问题2:历史消息重复处理
- 基线轮处理后seen.discard(item)从持久化集合中移除,但未重新加入_seen_messages
- 修复:基线轮处理后增加self._seen_messages.add(item),确保下次轮询不再处理此消息
2026-08-15 10:13:55 +08:00
youpaishidifu 8d648f37fb fix(kb): 搜索阶段过滤查询停用词,防止通用名词导致TF-IDF虚高
问题:查询"服务器的公告"时,"服务器"的IDF=3.2虚高,
player.md的"运营方权利"段落含"服务器"多次→keyword_score=12.8,
压过index.md的"近期公告"(keyword_score=3.2)。

修复:在search()中使用AutoReply._STOPWORDS过滤查询token,
只保留"公告"等核心查询词参与评分。

效果:"服务器的公告"现在正确匹配到index.md的"## 🔈近期公告"。
2026-08-13 15:24:46 +08:00
youpaishidifu dc40196ce9 修复知识库搜索垃圾回复:登录插件下载查询返回指令碎片
- 列表项切分保护从'全部短'放宽为'≥70%短',防止sdf1_login指令列表被切成单行碎片
- 新增match_heading字段:合并的短列表项文本参与heading匹配,恢复'注册账号'等查询的命中强度
- 下载意图查询(下载/下到/哪下/怎么下)跳过has_action重排与guide合并,修复'登录插件怎么下载'返回安装说明
- guide合并步骤统计只认###级子标题,防止##章节编号误判为教程步骤
- 下载加权/优先逻辑排除皮肤类heading,防止skin.md'下载皮肤文件'误放大
- gui.py新增DB查重,防止同一消息重复回复
2026-08-10 22:26:13 +08:00
youpaishidifu 59d0bb8a87 fix: knowledge_base.py 核心名词匹配使用未定义变量 full_text → full_text_check
- NameError: name 'full_text' is not defined at line 581
- 修复: 改为 full_text_check (heading_clean + body)
2026-08-09 21:16:00 +08:00
youpaishidifu cbc4a9266a fix: 知识库搜索返回不相干结果
1. DOC_TOPIC_TOKENS添加php映射,修复'PHP登录模式'查询不匹配php.md
2. parent-child逻辑增加条件2:parent body是表格+任何child heading含查询词
3. heading token计算改用heading_no_links,防止链接文字误匹配
4. 查询含'登录插件'时,protect文档降权从0.5改为0.2
5. 新增php登录模式查询boost:php文档section额外x10加分
6. 新增下载意图优先:查询含'下载'时优先返回heading含下载的section
2026-08-08 18:30:02 +08:00
youpaishidifu 87c0bd9f62 fix: 修复时间戳提问豁免无上限+知识库链接文字误匹配
Bug1: 提问豁免(_is_question_message)让继承极老时间戳的消息绕过过滤,
      如22:07的消息在次日10:43仍通过stage splitting放行。
      修复:给提问豁免加24h硬上限,继承时间戳>24h不再豁免。

Bug2: protect.md heading含[sdf1_login登录插件](...)链接,
      heading_no_link_text保留链接文字,导致phrase_in_text匹配触发5x加分。
      修复:新增full_text_phrase(移除整个链接含文字),
      所有短语匹配改为用full_text_phrase,链接文字不再参与评分。
2026-08-07 10:54:47 +08:00
youpaishidifu 1c16970871 修复知识库搜索答非所问:heading链接文本误触发短语匹配
- 问题:查询"登录插件在哪儿下载?"返回protect文档的"操作方式|是否支持"表格
- 根因:heading_clean保留链接文本(如[sdf1_login登录插件]),导致phrase_in_text误判为True,避免惩罚
- 修复:phrase_in_text检查改用full_text_clean(排除链接文本),确保精确短语匹配准确
- 效果:protect文档因链接文本误匹配的惩罚避免被纠正,sdf1_login文档应优先返回
2026-08-06 20:48:16 +08:00
youpaishidifu 59505fdafd 修复知识库搜索两个bug:
1. 否定式查询惩罚: 查询'是否X'时不含核心名词section×0.3,在reranking后执行
2. 子串回退: token交集失败时用2-6字子串匹配(解决jieba碎片token问题)
2026-08-06 18:59:36 +08:00
youpaishidifu f84ea56311 修复知识库搜索粒度:parent section是表格时优先返回child sections
- 添加_build_parent_child_map方法构建section层级关系
- 当parent section有heading命中但body是表格时,优先返回child sections
- 最终结果按分数排序确保最高分排第一
- 修复'安装说明'查询返回插件表格而非下载链接的问题
2026-08-06 17:17:20 +08:00
youpaishidifu f50eeb28da fix: 消除 sklearn TfidfVectorizer token_pattern 警告 2026-08-05 21:23:22 +08:00
youpaishidifu 5d9214526b fix: Bug F 修复回复混合和缺失步骤问题
- 修改guide query合并逻辑,按parent guide分组sections
- 根据查询关键词选择最相关的guide(url/图床→非正版guide,正版/官网→正版guide)
- 避免混合不同guide的内容,确保第一步不被遗漏
- 测试验证:url查询返回URL操作方式,官网查询返回正版玩家操作方式
2026-08-05 20:14:23 +08:00
youpaishidifu fd5d2ee73a 修复内存泄漏和回复截断问题
1. 内存泄漏修复(Bug D):
   - 在 easyocr_worker.py 中添加 GPU 清理函数和信号处理器
   - 在 monitor.py 中创建 _kill_easyocr_proc() 辅助方法
   - 使用 terminate→wait→kill→gc.collect() 安全终止序列替换所有直接 kill()
   - 确保 CUDA 上下文在子进程退出时正确清理

2. 回复截断修复(Bug E):
   - 在 knowledge_base.py 的 search() 方法中检测指南类查询
   - 对于步骤类查询(如何/怎么/教程等),合并同一文档的所有步骤 section
   - 确保用户获得完整的操作指南而非单个步骤
2026-08-05 17:56:07 +08:00
youpaishidifu d8c0e62a2d 修复跨平台答案混用: 表格优先策略必须检查heading语义相关性
- 表格优先策略: 不再盲目优先含'操作'的表格, 只优先heading与查询有交集的表格
- 表格兜底策略: 同上, 只兜底与查询语义相关的操作/支持表格
- 表格内容奖励: 同上, 3.0x加权只给与查询相关的表格
- 根因: '操作方式'表(交互模式)含'操作'被盲目优先, 覆盖了'权限级别'表
- 测试: '权限级别'→权限级别表格(20.51), '操作方式'→操作方式表格(49.54)
2026-08-05 15:01:00 +08:00
youpaishidifu 4d7017be6a 修复知识库搜索:表格内容不再被切分,表格section优先返回
- knowledge_base.py: _split_body_by_list_items检测表格区域,不切分表格行
- knowledge_base.py: 添加独立表格section,确保表格内容可被搜索匹配
- knowledge_base.py: 表格兜底策略:最佳文档含操作/支持表格时强制加入并置顶
- knowledge_base.py: reranking后无条件优先返回含操作/支持的表格section
- .gitignore: 添加msg_history.db和诊断脚本到忽略列表
2026-08-05 13:22:27 +08:00
youpaishidifu d87e482e1e 修复微信端知识库答非所问 + QQ OCR 漏消息(双 bug 修复)
knowledge_base.py(问题2:微信端答非所问):
- 文档级标题语义匹配改为 token 级(原仅字面子串匹配),OCR 丢失"php"只剩"管理员端默认"也能正确命中 phpadmin
- 新增"管理员+默认"组合强偏好:无"领地"时 phpadmin ×3.0、protect ×0.4,避免退化查询误选 protect/全局配置
- section 级重排新增 bonus +30:查询含"管理员+默认"时,偏好正文真正含"密码/登录/ypshidifu"的 section,压过"## 目录"目录项

monitor.py(问题1 + 问题2 上游):
- 新增 _split_and_denoise_segments:按消息边界预分割 + 分段噪声隔离,修复 Windows OCR 大杂烩把用户消息当噪声整段丢弃(QQ 漏消息)
- 候选行剥离 bot 自身旧回复文本:OCR 把用户新提问与屏上 bot 旧回复拼成一行时,先剥离旧回复再走过滤,消除答非所问的上游拼接根因

测试:新增 debug_kb.py 复现退化查询、test_kb.py 回归;跨主题回归全部正确,py_compile 通过
2026-08-03 20:52:08 +08:00
youpaishidifu 8ed93382e0 修复两个bug:1. EasyOCR线程崩溃(_OCR_TIMEOUT未定义) 2. 知识库搜索优化(核心名词匹配奖励+文档标题语义匹配) 2026-08-03 18:17:43 +08:00
youpaishidifu c3a210efef 知识库搜索优化:列表项二次切分,提升细粒度匹配精度 2026-08-03 17:31:45 +08:00
youpaishidifu c6c8cc0571 @
fix: 微信颜色检测放宽+KB精确匹配+自动回复重试

1. monitor.py - 微信白色气泡检测阈值放宽(>=245->>=240, >=3->>=2)
   适配新版微信UI颜色变化,减少漏检
2. knowledge_base.py - 精确短语匹配(5x加分)+子串匹配(2.5x/1.5x)
   防止查询被不相关文档抢走高分
3. gui.py - 自动回复发送失败重试(3次/5秒间隔)
   连续失败退避本轮,避免反复抢焦点
4. .gitignore - 补充build目录下的证书/构建产物
@
2026-08-03 16:42:21 +08:00
youpaishidifu 0405e42a90 修复OCR回复牛头不对马嘴+残留消息+EasyOCR崩溃捕获+360误报
1. knowledge_base.py: 检索排序惩罚标题-only/短正文段,降低heading bonus,奖励正文命中,避免纯标题/免责声明段排第一
2. auto_reply.py: 动作类查询要求正文命中才放行;拒绝纯标题/免责声明答案
3. monitor.py: 调试截图改存%LOCALAPPDATA%/windowmsgbot/ocr_debug避开源码目录(360); 收紧残留消息fresh gate(600s硬门); 启动即崩溃/请求崩溃时读取easyocr_crash.log写入主日志
4. easyocr_worker.py: 加faulthandler+sys.excepthook全局捕获,崩溃traceback落盘%LOCALAPPDATA%/windowmsgbot/easyocr_crash.log
2026-08-01 21:21:05 +08:00
youpaishidifu b55fff8cbb 修复2个bug: 急停后OCR残留 + 知识库奖励配置匹配错误
Bug1 - 急停(ESC×2)后Windows OCR仍在运行输出日志:
  _emergency_stop设_running=False+杀EasyOCR子进程,但Windows OCR
  (RecognizeAsync)是同步阻塞调用,无法被中断。OCR完成后_poll继续
  处理文本→触发回复。
  修复:_poll中在_read_messages返回后+文本过滤后各增加self._running
  检查,OCR完成或文本处理中如已急停则立即return,不再触发回复。

Bug2 - 用户问寻宝奖励配置,bot返回指令参数表格(匹配度15.38):
  知识库sdf1_game.md中'## 寻宝玩法介绍'命令表含'寻宝'高频词,
  TF-IDF得分远高于'## 奖励配置:'段。heading bonus仅2.0/词,
  不足以翻转15分的TF-IDF差距。
  修复:heading bonus从2.0/词提升至5.0/词;新增heading连续短语
  匹配bonus(+8.0),如查询含'奖励配置'且heading含'奖励配置'则
  大幅boost,确保语义匹配的section排到最前。
2026-07-30 13:49:58 +08:00
youpaishidifu a076353ee4 修复三个问题:病句过滤、KB回复内容、截图保存日志
1. 病句过滤改进(monitor.py):
   - ≤5字短句:必须包含疑问词(什么/怎么/如何/为什么/吗/呢等)才放行
   - 无疑问词的短句直接过滤(如'自行修?')
   - 5-50字病句:增加'过'字匹配(如'修正过后')

2. KB回复内容改进(auto_reply.py + knowledge_base.py):
   - _get_answer 改为返回 body(纯正文),不含 heading
   - KB搜索增加heading包含查询关键词的bonus
   - 文档头部(# 文档名)增加penalty,避免返回错误section

3. 截图保存日志改进(monitor.py):
   - QQ/微信截图保存失败日志从 debug 升级为 warning
   - 增加保存路径提示,便于定位问题
2026-07-29 22:43:32 +08:00
youpaishidifu afbcd109f0 fix: poll first变量修复 + KB添加安装动词 + 绿色气泡OCR拦截\n\n1. Poll first变量修复: first=True初始化但循环体内从未设为False→\n 所有new_items都被当作第一条处理。加first=False只处理首条。\n2. KB action_verbs_all添加"安装": "云背包插件怎么安装"\n verb+obj提取安装+云背包插件→优先匹配"安装方法"section\n3. 绿色气泡OCR拦截三层:\n - OCR级: |管道符+CJK混合过滤(正常聊天从不混用|和中文)\n - Poll级: 同|管道符+CJK过滤兜底\n - _is_reply_fragment阈值降低: raw 8→6, CJK 6→5\n - OCR line filter阈值同步降低: raw 8→6, CJK 6→5\n 绿色气泡被OCR啃成"GU |进行配置..."的乱码现在pipe过滤\n 即可拦截或SequenceMatcher阈值降低后匹配replied_texts\n- 提交git.ypshidifu.cn 2026-07-29 12:42:23 +08:00
youpaishidifu 718f67804c 修复KB搜索3项:疑问词不当降权 + 文档聚合tiebreaker + section弱匹配不计入 2026-07-29 00:09:22 +08:00
youpaishidifu 4da415f9c5 修复KB匹配:action_verbs_all去掉怎么/如何等疑问词,避免sdf1_login含'怎么办'被惩罚更少反超beibao 2026-07-29 00:01:28 +08:00
youpaishidifu a093528888 修复2个问题:微信OCR hash碰撞(aHash→dHash+5秒强制刷新) + KB搜索动词+对象精准匹配防误召回 2026-07-28 22:28:29 +08:00
youpaishidifu 3a7a05f973 修:OCR全角括号md碎片导致KB死循环
问题:OCR将英文括号识别为全角(()形式,[官方下载](?https...
此类碎片漏过 _is_markdown_document 检测,进入KB匹配触发回复。

修复:
1. _is_markdown_document: 新增 ]( 和 [text]( 检测(全角括号md链接)
2. OCR行级过滤: 新增 ]( 碎片丢弃
3. _extract_user_text_from_md_fragment: 新增全角括号md标记分割
4. KB scoring: 短查询(≤3分词)降权,防碎片得分反超真实消息
2026-07-27 21:48:44 +08:00
youpaishidifu ec06e48926 修复:KB同义词(权力→权利) + 微信"关闭"按钮过滤(NFKC标准化+行尾跳过) 2026-07-27 15:36:14 +08:00
youpaishidifu 8894124b0a fix(kb): section级搜索+意图排序+分词级匹配修复短查询与跨section排序
1. knowledge_base.py:
   - 文档按 ## 标题切分为独立 section 后索引,每个 section 独立 TF-IDF
   - 分词级匹配(避免"定义"子串匹配"自定义"的假阳性)
   - 文档级优先排序:先按文档聚合,取最高 section 分决定最佳文档
   - 定义类查询(版号/版本号/定义):自动降权无定义类 section 的文档
   - 动作类查询(怎么/如何/用法):按优先级找"参数/指令/使用"→"方法"→"安装" heading
   - 预计算 heading/body 分词集合,避免每次搜索重复 jieba
   - 修复 SYNONYMS 重复 key

2. auto_reply.py:
   - 精简答案提取:section 级搜索后 doc['content'] 即最相关片段
   - 移除冗余的 _extract_relevant_snippet(重复 jieba 分词+section 切分)

3. monitor.py:
   - 增加微信/QQ UI 噪声过滤(通讯录、发现、朋友圈等)
2026-07-27 14:17:51 +08:00
youpaishidifu 1441278082 fix(kb): 混合评分策略修复短查询匹配失败
TF-IDF 余弦相似度单独使用对短中文查询过于严格(3-5 个词 vs 数百个词的长文档)。
改为混合评分:0.4×TF-IDF + 0.6×关键词命中率,让短查询只要命中关键词就能返回结果。

同时降低 auto_reply_min_score 从 0.35→0.30,适配混合评分的数值范围。
2026-07-27 12:30:31 +08:00
youpaishidifu 7bdc7ad637 修复2问题: KB误匹配+返回全文 / Ctrl+C无法停止
1. KB匹配与返回全文
   - _poll中过滤纯时间/日期格式文本(OCR时间戳分割残留)->不入KB搜索
   - knowledge_base.py子串fallback要求query>=4字符,避免"19:15"等短时间戳误匹配
   - auto_reply._get_answer: 非Q&A文档只返回content前500字符,不返回整篇文件
   - 时间戳文本不进入KB + 短query不子串匹配 + 非Q&A截取 = 三层兜底

2. Ctrl+C无法停止
   - ThreadPoolExecutor创建非daemon线程->进程无法退出->必须杀CMD
     改用daemon thread + Event.wait(timeout): daemon线程不阻塞进程退出
   - main.py注册signal.signal(SIGINT) handler: 收到Ctrl+C后stop监控+quit窗口
   - 移除from concurrent.futures导入,替换为import signal
2026-07-26 15:30:55 +08:00
youpaishidifu e9d9551e3d 修复2个问题:退回裁剪+知识库只回复匹配句\n\n1. 裁剪退回c9acd7e版(cap_left=0.25)\n 0.35只截到时间戳,用户消息被切;0.25覆盖消息文字区域\n\n2. 知识库返回全文→只返回匹配问答段\n 原问题:名字.txt含2个Q&A,TF-IDF整文件匹配后返回全文\n 该方案:knowledge_base._parse_qa_segments解析文件为独立问答段\n 每段作为独立doc,auto_reply._get_answer优先返回doc.answer\n 用户问一句话,只回复对应答句,不塞全部内容 2026-07-26 13:38:04 +08:00
youpaishidifu cb170d1160 修复知识库短查询不匹配+QQ消息抓不到
问题1: 你叫啥名字→分词["你","叫","啥","名字"]
  → len(t)>=2过滤只剩["名字"]→len(tokens)<=1直接返回空
  修复: 放宽过滤 len(tokens)<=1→len(tokens)==0且len>=2
  添加子串匹配回退: TF-IDF无结果时检查查询是否包含在文档中

问题2: QQ消息抓不到
  _read_via_clipboard 加重试机制(首次空自动重试1次)
  _read_win32_texts 降低文本长度过滤 4→2 字
  QQ路径加 _click_message_area 确保焦点在消息区
2026-07-25 13:56:09 +08:00
youpaishidifu c8c2f2ccc6 fix: 1)微信QQ统一优先读消息列表(当前对话) 2)知识库min_score=0.30+短文本过滤 2026-07-24 22:39:09 +08:00
youpaishidifu bdfc24a4c7 init: 消息问答助手 — 微信/QQ监控 + 本地知识库搜索 + GUI 2026-07-24 19:36:14 +08:00