← 返回博客列表

多模态 Agent 工程化:图像不是 prompt 的免费午餐

把一张产品截图甩给 GPT-4o 让它”看一眼然后帮我点登录按钮”,这个 demo 谁都能跑通。但当这个 demo 变成生产环境每天处理 10 万张截图的浏览器 Agent,问题就开始堆积:单次 token 成本爆炸、点击坐标偏移、长对话里历史图片把上下文撑爆、低分辨率下识别错按钮。

2026 年的多模态 Agent 已经不是”能不能跑”的阶段,而是”能不能在精度、成本、延迟这三角里活下来”的阶段。这篇文章把视觉 Agent 工程化里最容易翻车的几个点掰开讲清楚。

图像不是免费的:先学会算 token

工程师常犯的错是把图片当成”反正一张图就一张图”。实际上每张图都会被切成 patch 编码进 token 序列,三家主流厂商的算法各不相同:

厂商编码方式1024×1024 图2048×1536 图备注
OpenAI高分辨率切 512×512 tile~765 token~2125 tokenlow detail 模式固定 85
Anthropic按 (w*h)/750 估算~1400 token~4200 token长边超过 1568 自动缩放
Gemini固定 258 token 每图258 token258 token大图也只算 258,长视频例外

同一张 1080P 屏幕截图,Anthropic 比 Gemini 贵 16 倍。这不是夸张,是写在定价表里的事实。但便宜的 Gemini 在小字 OCR 场景精度反而是最差的——下文的决策矩阵会展开。

算成本时要记得:图片是 input token,和文本 input 一样可以走 prompt cache。对于多轮对话里反复出现的同一张参考图(比如”对照这张设计稿改 UI”),缓存命中后能省 90%。

# Anthropic 风格的图片成本估算
def estimate_anthropic_image_tokens(width: int, height: int) -> int:
    # 长边超过 1568 会被服务端缩放
    max_dim = max(width, height)
    if max_dim > 1568:
        scale = 1568 / max_dim
        width = int(width * scale)
        height = int(height * scale)
    return (width * height) // 750

# 一张 4K 截图先压到 1568 再算
print(estimate_anthropic_image_tokens(3840, 2160))  # ~1840 token

把这个函数挂在 Agent 入口做预算守卫,比事后看账单要有效得多。

坐标漂移:Vision 模型不是真的”看见”了像素

让模型返回”登录按钮在哪”,它会给你一个坐标。但你直接拿这个坐标去 PyAutoGUI 点击,大概率会偏。原因是模型内部对图像做了 resize 和归一化,返回的坐标可能是:

  • 归一化坐标(0-1 之间的浮点)
  • 模型内部 resize 后的坐标(比如 1568×x 空间)
  • 千分制坐标(0-1000 整数,Claude Computer Use 就是这种)

不同模型给的还不一样。生产环境的标准做法是 永远做坐标系还原

def normalize_click_coords(
    model_x: int, model_y: int,
    model_space: tuple[int, int],   # 模型返回坐标的参考系
    real_space: tuple[int, int],    # 真实截图分辨率
) -> tuple[int, int]:
    """把模型空间坐标还原到真实截图空间。"""
    mw, mh = model_space
    rw, rh = real_space
    return (
        int(model_x / mw * rw),
        int(model_y / mh * rh),
    )

# Claude 千分制 → 1920x1080 真实坐标
x, y = normalize_click_coords(523, 412, (1000, 1000), (1920, 1080))

更进一步,给点击加 二次校验:点击前再截一次图,让模型确认”目标按钮是否在十字线下”。这一步多花 1 个 round-trip,但把误点率从 10% 降到 1% 以下,是浏览器 Agent 进生产的硬门槛。

OCR 还是 Vision:选错就翻倍烧钱

很多团队第一反应是”反正 GPT-4o 能看图,OCR 就别要了”。这是 2026 年最贵的偏见。

任务类型推荐方案理由
发票 / 表单结构化专用 OCR + LLM 整理OCR 字符级精度 99%+,LLM 只做字段映射
截图找按钮 / UI 元素Vision 模型OCR 看不到色块、icon、布局关系
长文档(PDF)问答OCR + RAG每页都 Vision 太贵,OCR 一次性建索引
图表数据提取Vision 模型OCR 拿不到坐标轴语义
含手写 / 公式的内容专用模型(Mathpix)通用 Vision 在公式上幻觉率 30%+
实时屏幕监控(每秒 5 帧以上)轻量 Vision + 缓存大模型 Vision 每帧 0.5-2s,跟不上

一个真实数字:处理 100 页中文合同 PDF。

  • 全 Vision 走 GPT-4o:约 100 × 1500 token × $5/M = $0.75,耗时 3-5 分钟
  • OCR(PaddleOCR)+ GPT-4o-mini 整理:OCR 本地跑免费,LLM 部分约 100 × 800 token × $0.15/M = $0.012,耗时 30 秒

60 倍。Vision 强不等于”什么都该用 Vision”。

多图上下文:会话越长越烧钱

视觉 Agent 的对话历史里图片是”复利债务”。第 5 轮还塞着前 4 轮的截图,每张 1500 token,光历史就 6000 token。第 20 轮就崩了。

三种工程上经过验证的应对策略:

1. 滑动窗口 + 描述化降级

最近 N 轮保留原图,更早的图片转成文本描述(“截图:登录页,显示用户名输入框和密码输入框,下方有蓝色登录按钮”)。

def degrade_history(messages: list, keep_recent: int = 3) -> list:
    """超过 keep_recent 轮的图片转成文本描述。"""
    result = []
    image_messages = [m for m in messages if has_image(m)]
    keep_threshold = len(image_messages) - keep_recent

    img_idx = 0
    for msg in messages:
        if has_image(msg):
            if img_idx < keep_threshold:
                # 替换成之前缓存的描述
                msg = replace_with_description(msg)
            img_idx += 1
        result.append(msg)
    return result

2. ROI 裁剪

不要把整张 4K 截图丢进去。先用轻量模型(YOLO、甚至简单的图像 diff)找到关注区域,只把这块区域送给 LLM。1920×1080 → 400×300 的 ROI,token 直接砍到 1/15。

3. Prompt Cache 锁定参考图

对话开头的”参考设计稿""产品手册图片”这类不变内容,明确打 cache_control 标记,让它走缓存折扣。

三家模型 2026 年视觉能力对比

我用同一组 200 张测试图(UI 截图 100 张 + 中文文档 50 张 + 图表 50 张)跑了一轮内部 benchmark:

维度GPT-4oClaude Sonnet 4.5Gemini 2.5 Pro
UI 元素定位准确率87%92%78%
中文小字 OCR88%85%81%
图表数值提取82%81%86%
单图首 token 延迟1.2s1.5s0.6s
1080P 图 token 成本~1100~3100258
多图(10+)支持良好优秀良好
坐标输出稳定性偏移 5-10px千分制最稳偏移 10-20px

简单选型建议:

  • 需要点击精度(浏览器 / 手机自动化)→ Claude
  • 大批量看图(百万级 / 天)→ Gemini,便宜且快
  • 综合质量 + 生态 → GPT-4o

多模态 Agent 落地 checklist

上线前过一遍这九条:

  1. 图片预处理流水线:所有图片在送进 LLM 前统一 resize 到目标分辨率(1568 长边或 1024×1024),别让 API 帮你 resize
  2. Token 预算守卫:单次请求图片总 token 上限(建议 8k)超了直接拒绝
  3. 坐标系还原:Vision Agent 必须有 model_space → real_space 的明确转换层
  4. 二次校验回路:高风险操作(点击、提交)前再 verify 一次
  5. OCR / Vision 路由:对每类任务想清楚走哪条路,别全压一个模型
  6. 历史图片降级:超过 N 轮自动转描述,N 一般取 3-5
  7. Prompt Cache 配置:参考图、参考手册显式打 cache 标记
  8. 失败重试策略:图片识别失败时降低分辨率或换模型重试,不要直接抛错给用户
  9. 可观测性:每次请求记录图片尺寸、token 消耗、识别置信度,账单异常能追溯到具体请求

多模态 Agent 不会因为模型变强就自动变好。强模型只是把上限抬高了,下限——成本、精度、延迟——还是工程师自己守的。把这九条嵌进 CI 和监控,比追逐每月的新模型版本要值得多。