# 视觉识别测试与修复报告 测试日期: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。