Files
kefu/deploy/recognition-audit-20260916/visual-report.md
T
2026-09-21 10:34:06 +08:00

52 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 视觉识别测试与修复报告
测试日期:2026-09-16。范围:`C:/kefu/wechat_rpa`、`C:/wechat_rpa`。
## 结果
| 目录 | 自动回归 | 失败/错误/跳过 | 真实本机 OCR 合成图片测试 |
| --- | ---: | ---: | ---: |
| C:/kefu/wechat_rpa | 625 | 0 / 0 / 0 | 24 / 24 字符完全匹配 |
| C:/wechat_rpa | 625 | 0 / 0 / 0 | 24 / 24 字符完全匹配 |
两次 625 项回归来自同一组测试在两个目录运行,不应描述为 1250 个独立场景。真实 OCR 使用已安装 RapidOCR、微软雅黑生成的中文昵称图片,覆盖 1×、2×、3×尺寸和明暗主题,未 mock OCR 引擎;不等同于真实微信界面识别准确率。两份代码的 OCR 文件原内容一致。
执行模块:`test_visual_pipeline`、`test_vision_fallback`、`test_message_navigation`、`test_self_reply_loop`、`test_vision`、`test_session_name`、`test_unread_cross_machine`、`test_reply_safety`、新增 `test_visual_identity_audit`、新增 `test_visual_cache_audit`。
覆盖:未读红点和红色草稿区分;不同 DPI 的导航与裁剪;窗口捕获失败/黑屏/遮挡保护;系统入口和未知行过滤;连续两帧确认;快速 OCR→检测 OCR→模型识别的模拟降级;昵称及会话键;待回复消息合并;左右气泡/我方消息回环保护;发送前会话校验;草稿、人工审核、重复发送和不确定回执处理。`test_vision` 只执行导入安全断言,未执行其手动调用远程视觉 API 的 main。
## 发现并修复
1. **相似昵称被合并为同一客户。** 原 `NameReader.canonical` 按编辑距离 1 和出现频次强制修正姓名,`客户乙@微信` 可被改成先见过的 `客户甲@微信`,`会员0002` 可被改成 `会员0001`。即使 OCR 置信度 99% 也会发生,两个会话最后使用相同历史键。现在禁止任意客户姓名模糊合并;仅保留已知固定界面词误读,以及客户名完全相同的固定平台后缀误读修正。
2. **升级 OCR 缓存仅以头像为键。** 两人使用相同默认头像且快速 OCR 失败时,第二人的检测 OCR 被跳过,直接读取第一个人的名字;名字裁片读取失败也仍可复用头像缓存。缓存键现同时绑定头像与当前昵称裁片,裁片不可读时不复用。列表重排但裁片相同仍能命中。字体/抗锯齿变化时可能增加一次 OCR,优先保证不串客。
3. **畸形 OCR 数据会通过身份判断或抛异常。** `NaN`/正无穷置信度会绕过原 `< 0.8` 判断;无限坐标在 `int()` 时引发 `OverflowError`,连后续正常识别项也丢失。现过滤非有限值与不在 0–1 范围的置信度,跳过异常项继续处理正常项。
最小复现保存在 `visual-bugs-before.json`(5 测试,包含 9 个失败子项和 1 个异常)及 `visual-cache-before.json`(3 测试,2 失败)。新增 8 项正式回归验证原缺陷及原有兼容行为。
## 改动及备份
两个目录分别修改 `session_name.py`、`wechat_bot.py`(仅 `_row_name_deep_cache_key`);分别新增 `test_visual_identity_audit.py`、`test_visual_cache_audit.py`。原文件分别保存在各自 `backups/recognition-audit-20260916/visual/`。没有替换整份目录,没有修改用户配置、聊天档案、待回复队列或协议实现。
运行器:`run_visual_audit.py`。最终证据:`visual-source-final.json/.log`、`visual-target-final.json/.log`。本机 OCR 证据:`visual-real-ocr-source.json`、`visual-real-ocr-target.json`。改动清单:`visual-changes.json`、`visual-cache-changes.json`。
## 隔离与局限
所有应用数据目录指向临时目录;真实桌面输入、剪贴板、屏幕截图和 HTTP 被拦截,网络套接字仅允许本机临时端口测试;发送互斥量使用进程独立名称。最终两次回归均未触发任何外部动作拦截(0 次)。没有点击/输入微信,没有真实发送,没有上传客户资料,没有发起付费模型调用。
首轮并行测试曾出现 7 个失败,原因是测试未隔离 Windows 全局发送锁,两个测试进程互相抢锁。加上独立审计锁名后原始 617 项在两个目录均通过,该首轮现象不是产品缺陷。运行器同时修正了 Windows 下退出临时工作目录前清理会报文件占用的问题。
视觉模式现有身份设计仍主要依赖显示昵称。完全同名的不同联系人不能仅凭昵称证明是同一人;本轮修复解决了差字姓名和同头像缓存串用,但未重构持久化身份体系。也未验证真实微信所有版本/字体/截断昵称/复杂背景下的识别率,未验证远程视觉模型服务在线状态。AI 上下文与知识库端到端由主任务其他分支单独报告。
## 追加:视觉问答知识引用留痕修复
只读复核未发现上述昵称/缓存修复的阻断性回归:`@徽信` 后缀仅在客户主体完全匹配已知名字时纠正;默认头像不同昵称已有独立回归;裁片不可用时不复用识别结果;裁片变化会重新识别,未读筛选页的第二帧也执行深度 OCR。视觉调用仍将按会话取出的 history 传给 `ai_chat.get_ai_reply`;`_call_model_with_observer` 的模型回调在原调用线程执行,不会丢失 thread-local 网关 trace。
发现并修复一项额外可追溯缺陷:视觉 `_orchestrated_reply` 原来取到网关 `knowledge` 后未传给 `_record_model_call`,待回复状态也没有 `knowledge_trace` 与 `model_task_id`,与协议路径不一致。现在按协议字段语义保留这两项,在磁盘持久化/恢复时保留,新客户消息开始下一轮时清除旧引用。仅保存知识开关、检索模式、耗时及每个命中的 id/revision/score(最多20条),不保存知识正文或聊天原文;调用前消费旧 thread-local trace,防止内部识别调用的旧记录误挂到安全兜底回复。发送和审核判断未改动。
新增 `test_visual_knowledge_trace_audit.py` 6 项:历史/图像与引用同时保留;无裁判也可记录引用;重启恢复;丢弃额外大正文;下一轮清除旧引用;旧内部调用不冒充本次问答;其中有关清除行为分别覆盖新消息和新模型结果。最小复现 `visual-trace-before.json` 为6项全部未通过(2失败/4错误),修复后两目录各 **526项/0失败/0错误/0跳过**。涉及 `test_reply_safety`、`test_visual_pipeline`、`test_model_router` 及新增模块;526项包含原625项的大量复测,不能相加声称1151个独立测试。
按日志测试 ID 去重:原集合625项,追加集合526项,重合431项,**合并为每目录720个独立自动测试**。本机真实 OCR 的24组图片单独计数,未包含在自动测试数字中。两个目录同一组场景重复运行,不把数量翻倍当作独立场景。
追加改动仍仅为两目录 `wechat_bot.py` 与新增测试;补丁前版本保存在各目录 `backups/recognition-audit-20260916/visual-trace/wechat_bot.py`。相关证据:`visual-trace-source.json/.log`、`visual-trace-target.json/.log`、`visual-trace-changes.json`、`visual-deduplicated-counts.json`。末次回归外部动作拦截次数仍为0。