Skip to content

Latest commit

 

History

History
128 lines (100 loc) · 7.05 KB

File metadata and controls

128 lines (100 loc) · 7.05 KB

12 · 多模态感知与融合

澄清点 3 的落地:允许 Agent 组合多种模态(截图/视觉、AX-tree、DOM、OCR、坐标定位、网络信号)来啃复杂页面与特殊情况(canvas、shadow DOM、iframe、纯视觉控件、异常态、反爬变形)。底座负责采集与打包多模态上下文,Agent 负责融合决策,成果回沉进定位器仓库惠及 0 Token 回放。

1. 为什么单一模态不够

模态 擅长 盲区
AX-tree 语义/角色/可访问名,稳定 ref,抗样式漂移 canvas/自绘控件/无障碍缺失的页面看不见
DOM 精确结构、属性、shadow/iframe 边界 结构频繁变动、混淆 class、虚拟列表
截图(视觉) 布局、图标、纯视觉控件、"看起来像按钮" 无精确坐标语义、易受分辨率/主题影响
OCR 图片/canvas 内文字、验证提示 慢、易错、无结构
坐标定位 兜底点击"就在那个位置" 脆、随布局漂移
网络信号 已知 XHR/接口、加载完成判定 不反映最终渲染

结论:复杂页面需要多模态交叉印证——例如"AX 说这里有个 combobox,截图显示是放大镜输入框,OCR 读到占位符『搜索』,三者一致 → 高置信定位"。


2. 底座采集、Agent 融合(职责边界)

flowchart LR
    subgraph BASE["底座 · 多模态感知(执行面)"]
        SNAP["snapshot() 一次采集"]
        SNAP --> AX["AX-tree(精简可交互子树)"]
        SNAP --> DOM["DOM 摘要(含 shadow/iframe 展平)"]
        SNAP --> SHOT["截图(整页/元素/裁剪)"]
        SNAP --> OCR["按需 OCR(canvas/图片区域)"]
        SNAP --> NET["网络/加载信号"]
        SNAP --> GRID["坐标网格/包围盒"]
    end
    subgraph AGENT["外部 Agent · 融合决策(见 10)"]
        FUSE["交叉印证 → 选元素/判成功/定策略"]
    end
    BASE -->|打包 multimodal_ctx| AGENT
    AGENT -->|结构化: LocatorBundle/Decision| BASE
    BASE --> SINK["回沉定位器仓库(见 03/07)"]
Loading
  • 底座只感知不判断:一次 snapshot() 产出对齐的多模态包(同一时刻、同一 DPR、带元素↔包围盒映射),避免"截图与 DOM 不同步"。
  • Agent 融合:通过 Cognition Port 拿到多模态包做决策(10);返回结构化定位/判据。
  • 按能力裁剪:若 Agent 无视觉能力,底座改发"AX + OCR 文本 + 坐标"文本化上下文(能力协商见 10 §5)。

3. 多模态定位融合(提升定位置信)

flowchart TD
    TARGET["要定位的元素"] --> A["AX 候选: role+name"]
    TARGET --> B["DOM 候选: 属性/结构"]
    TARGET --> C["视觉候选: 图标/形状/相对布局"]
    TARGET --> D["OCR 候选: 区域文字"]
    A & B & C & D --> FUSE["融合打分<br/>(一致性越高置信越高)"]
    FUSE --> BUNDLE["多模态 LocatorBundle(按置信排序)"]
    BUNDLE --> REPO["写入定位器仓库(07)"]
Loading
  • 交叉印证打分:多模态指向同一元素 → 高置信;冲突 → 降置信并标注,供 Agent 复核。
  • 回沉复用:融合出的 LocatorBundle 写入定位器仓库(03 §6 / 07 §4),回放期 0 Token 直接用;仅当全部命中失败才再触发多模态自愈。
  • 与坐标兜底的关系:坐标是 visual 定位器的最后一跳,且以"相对容器包围盒"表达以抗整体布局漂移。

4. 复杂页面 / 特殊情况处理册

flowchart TD
    CASE{"页面特殊情况"} --> C1["canvas/自绘控件"]
    CASE --> C2["shadow DOM / iframe"]
    CASE --> C3["纯视觉控件(图标无文字)"]
    CASE --> C4["虚拟滚动/懒加载列表"]
    CASE --> C5["动态弹窗/异常态/A-B 变体"]
    CASE --> C6["疑似反爬变形/验证挑战"]

    C1 --> S1["截图+OCR+坐标点击; 记录相对锚点"]
    C2 --> S2["DOM 展平穿透 shadow; iframe 边界显式标注(注意 iframe 交互限制)"]
    C3 --> S3["视觉模板/图标匹配 + 相对布局锚点"]
    C4 --> S4["滚动加载 + 按 item 相对定位 + 去重"]
    C5 --> S5["多模态判异常态 → 分支/等待/重试"]
    C6 --> S6["区分‘可拟人通过’ vs ‘硬挑战’; 硬挑战升级人工(03/05)"]
Loading
情况 主用模态组合 策略要点
canvas / 自绘控件 截图 + OCR + 坐标 无 DOM 语义,靠视觉+OCR 定位,记录相对锚点回沉
shadow DOM / iframe DOM 展平 + AX 穿透 shadow;iframe 内容受限时显式标注边界、必要时切上下文
纯视觉控件 视觉模板 + 相对布局 图标无文字,用形状/位置锚点 + 邻近文本辅助
虚拟滚动列表 AX/DOM + 滚动信号 边滚边抽、按相对位置定位、业务键去重(与 11 loop 呼应)
动态弹窗/异常态 截图 + AX + 网络 多模态判定当前态,走 branch/wait/retry07 控制流)
反爬变形/挑战 截图 + 网络 先判"拟人可过"还是"硬挑战";硬挑战→升级人工(03 §8

5. 与自愈的协同

多模态是 L1 本地自愈的能力来源(02 §5):

flowchart LR
    FAIL["首选定位器 miss"] --> MMFUSE["L1: 多模态融合重定位(0 Token)"]
    MMFUSE -->|命中| FIX["回写 + 韧性重排"]
    MMFUSE -->|仍失败| ESCALATE["L2: 带多模态包回调 Agent(见 10)"]
Loading
  • L1 就用多模态:不是只重试 CSS/XPath,而是调动 AX+视觉+OCR+坐标交叉找回元素——这让"0 Token 兜底"能覆盖更多漂移。
  • L2 升级也带多模态:回调 Agent 时附上完整多模态包(10 §4multimodal_ctx),Agent 决策质量更高。

6. 成本与性能护栏

  • 分级采集:默认只采 AX+DOM(轻);截图/OCR 按需触发(复杂情况或自愈时),避免每步都重采。
  • OCR 局部化:只对目标区域/ canvas 做 OCR,不整页跑。
  • 快照缓存与失效:快照绑定"URL + 关键容器 AX hash",容器外变化不失效(与 02 §7 缓存键一致),减少重复采集。
  • 回放优先零多模态:回放正常路径只用已固化的定位器(0 Token、无视觉开销);多模态是"特殊情况与自愈"的按需能力,不是每步默认。

验收检查表(本篇)

  • 底座一次 snapshot() 产出对齐的多模态包(AX/DOM/截图/OCR/坐标/网络)。
  • 底座只采集、Agent 融合决策,按 Agent 能力裁剪上下文(I-6/10)。
  • 多模态融合定位带置信排序并回沉定位器仓库,回放期 0 Token 复用。
  • 复杂页面处理册覆盖 canvas/shadow/iframe/纯视觉/虚拟列表/异常态/反爬。
  • L1 自愈调动多模态;硬挑战正确升级人工。
  • 分级采集 + 局部 OCR + 快照缓存,回放正常路径不引入多模态开销。