把一张产品截图甩给 GPT-4o 让它”看一眼然后帮我点登录按钮”,这个 demo 谁都能跑通。但当这个 demo 变成生产环境每天处理 10 万张截图的浏览器 Agent,问题就开始堆积:单次 token 成本爆炸、点击坐标偏移、长对话里历史图片把上下文撑爆、低分辨率下识别错按钮。
2026 年的多模态 Agent 已经不是”能不能跑”的阶段,而是”能不能在精度、成本、延迟这三角里活下来”的阶段。这篇文章把视觉 Agent 工程化里最容易翻车的几个点掰开讲清楚。
图像不是免费的:先学会算 token
工程师常犯的错是把图片当成”反正一张图就一张图”。实际上每张图都会被切成 patch 编码进 token 序列,三家主流厂商的算法各不相同:
| 厂商 | 编码方式 | 1024×1024 图 | 2048×1536 图 | 备注 |
|---|---|---|---|---|
| OpenAI | 高分辨率切 512×512 tile | ~765 token | ~2125 token | low detail 模式固定 85 |
| Anthropic | 按 (w*h)/750 估算 | ~1400 token | ~4200 token | 长边超过 1568 自动缩放 |
| Gemini | 固定 258 token 每图 | 258 token | 258 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-4o | Claude Sonnet 4.5 | Gemini 2.5 Pro |
|---|---|---|---|
| UI 元素定位准确率 | 87% | 92% | 78% |
| 中文小字 OCR | 88% | 85% | 81% |
| 图表数值提取 | 82% | 81% | 86% |
| 单图首 token 延迟 | 1.2s | 1.5s | 0.6s |
| 1080P 图 token 成本 | ~1100 | ~3100 | 258 |
| 多图(10+)支持 | 良好 | 优秀 | 良好 |
| 坐标输出稳定性 | 偏移 5-10px | 千分制最稳 | 偏移 10-20px |
简单选型建议:
- 需要点击精度(浏览器 / 手机自动化)→ Claude
- 大批量看图(百万级 / 天)→ Gemini,便宜且快
- 综合质量 + 生态 → GPT-4o
多模态 Agent 落地 checklist
上线前过一遍这九条:
- 图片预处理流水线:所有图片在送进 LLM 前统一 resize 到目标分辨率(1568 长边或 1024×1024),别让 API 帮你 resize
- Token 预算守卫:单次请求图片总 token 上限(建议 8k)超了直接拒绝
- 坐标系还原:Vision Agent 必须有 model_space → real_space 的明确转换层
- 二次校验回路:高风险操作(点击、提交)前再 verify 一次
- OCR / Vision 路由:对每类任务想清楚走哪条路,别全压一个模型
- 历史图片降级:超过 N 轮自动转描述,N 一般取 3-5
- Prompt Cache 配置:参考图、参考手册显式打 cache 标记
- 失败重试策略:图片识别失败时降低分辨率或换模型重试,不要直接抛错给用户
- 可观测性:每次请求记录图片尺寸、token 消耗、识别置信度,账单异常能追溯到具体请求
多模态 Agent 不会因为模型变强就自动变好。强模型只是把上限抬高了,下限——成本、精度、延迟——还是工程师自己守的。把这九条嵌进 CI 和监控,比追逐每月的新模型版本要值得多。