uclanlp/OpenVLHarness · 上手攻略

  • 仓库:uclanlp/OpenVLHarness
  • 链接:https://github.com/uclanlp/OpenVLHarness
  • 分类:evaluation / agent / multimodal(Python,MIT)
  • 作者:spark
  • 更新:2026-10-23

资料核验:README 于 2026-10-22 UTC 通过 raw.githubusercontent.com 实抓(main 分支),文中命令、端口、环境变量、文件名均逐字取自该版本 README。仓库卡片记录 Stars 192、周增 +154、最近提交 2026-10-20。⚠️ 本文未运行任何代码,未 clone 仓库,全部为只读公开内容核验;凡本 README 未写明处均标注 ⚠️ 未确认。

一、是什么

OpenVLHarness 是 UCLanLP(University College London NLP 组)随论文 arXiv:2610.26860 放出的官方代码,副标题是 "Real-World Visual Agentic Tool-Use with Multimodal Memory"。它的核心主张是:不微调任何权重,只靠 backbone 已有的原生 tool calling 能力,把任意多模态大模型(MLLM)变成"基于证据的视觉推理器"——模型在"视觉空间里思考和写代码"。

配套产出齐全:项目页 openvlharness.github.io、HuggingFace 上的交互 Demo Space、HuggingFace 上的评测数据集 uclanlp/OpenVLHarness-Evaluation-Datasets。

架构由三块组成:

  1. Capability layer(能力层):九个任务级接口,把底层工具输出转成模型能读的观察(标注图、摘要、紧凑数值)。
  2. Multimodal memory(多模态记忆):图像、boxes、masks、深度图、网页引用在整个提问周期内保持可寻址,后面的工具和代码可以叠加使用;每个新问题重置记忆。
  3. Python Coding Agent:backbone 在独立上下文里生成并执行 Python,对已存的 boxes / masks / 深度图等做数值计算。

九个能力与其默认后端:

能力 提供什么 默认后端
Visual Grounding 按文本定位物体,返回 boxes、masks 和标注图 SAM 3
OCR 读图中文字 PaddleOCR-VL
Depth Estimation 逐像素深度,保留数值数组与可视化 Depth Anything 3
Camera Trajectory 有序图像间相机位姿估计 Depth Anything 3
Zoom-in 裁剪局部放大观察 内置图像处理
Text Search 检索并摘要网页/图片/新闻等结果 Serper + Qwen
Image Search 逆向图片搜索找视觉匹配 Serper Lens + Qwen
Webpage Visit 从网页抽取与目标相关的证据 Serper scrape + Qwen
Python Coding Agent 对已存工具结果生成并执行计算 主 backbone + 本地 Python

二、解决什么问题

多模态模型的典型短板是"看不见就说得很肯定":计数不准、深度关系判断错、细粒度 OCR 掉点、无法检索外部证据核验。已知的开源方案(如各类 tool-augmented VLM harness)大多需要训练——要造数据、要微调、要评测,改一个 backbone 就重来一遍。

OpenVLHarness 的差异化是 training-free:直接接现成权重,靠"工具能返回模型读得懂的证据 + 跨步骤可寻址的记忆 + 会算数的编码 agent"三件事把分数拉起来。README 报告在 22 个 benchmark、四个领域(counting & grounding、多模态搜索、通用 VQA 与幻觉、空间理解)上,七个 backbone 平均提升 9.7 ~ 12.6 分。README 给出的均值表(Base → +OpenVLHarness):

Backbone Base +Harness Gain
Qwen3-VL-8B-Instruct 34.24 45.41 +11.17
Qwen3-VL-32B-Instruct 38.30 50.92 +12.62
Kimi K3 (max effort) 56.43 66.09 +9.66
GPT-5 (medium effort) 44.37 55.65 +11.28
GPT-6 Luna (medium effort) 45.76 56.52 +10.76
GPT-6 Sol (medium effort) 52.67 64.31 +11.64
GPT-6 Astra (medium effort) 60.27 70.17 +9.90

README 注明:Qwen3-VL 的结果是三次运行的均值;逐 benchmark 结果、与其它 harness 的对比、录制的轨迹都在项目页上。⚠️ 注意 README 的 Highlights 段写"七个 backbone 提升 9.7 到 12.6 分",而上方表格列了 7 行(2 个 Qwen + Kimi + 4 个 GPT-6 系),这两处的 backbone 计数口径不完全一致(Highlight 提到"论文的八个 backbone"),具体指哪七个建议按项目页核对。

三、快速安装

要求 Python 3.10+。从源码 checkout:

git clone https://github.com/uclanlp/OpenVLHarness.git
cd OpenVLHarness
python -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[qwen,server]'

这会装上 agent、Qwen tokenizer 支持和 tool router。模型服务是独立环境、独立依赖的——这是最容易踩的架构预期(见坑 1)。client 只连接已有 router 时 pip install -e . 就够;用 Qwen 做本地上下文计数或原始 trace 导出才需要 qwen extra;跑 benchmark 需要 eval extra。

要跑满九个能力,还需要额外准备四类服务:

  • 模型:本地 serve Qwen,或连 GPT / Kimi endpoint,按 docs/models.md 走。⚠️ 每个 preset 都需要一个 Qwen3-VL-8B-Instruct endpoint 来做搜索摘要与网页抽取(与主模型无关);8B preset 可以和主模型共用,32B preset 需要第二个 server。
  • 感知:按 openvlharness/services/tools/README.md 分别启动 SAM 3、PaddleOCR-VL、Depth Anything 3,它们作为独立 GPU 服务挂在 router 后面。
  • 搜索:三个搜索工具走 Serper(付费 Google Search API,有免费起步额度),key 用 SERPER_API_KEY 或 SERPER_API_KEY_FILE 配置。
  • 图片托管:逆向图片搜索还要求 Serper 能公网 fetch 到查询图——用内置 image host 配隧道,或用 S3 / GCS 存成签名 URL。

四、核心用法

4.1 选 preset

发布版包含论文八个 backbone 中七个的 agent preset:

主模型 配置文件 API 形态
Qwen3-VL-8B-Instruct configs/agent/qwen3_8b_paper.yaml Chat Completions
Qwen3-VL-32B-Instruct configs/agent/qwen3_32b_paper.yaml Chat Completions
GPT-5 configs/agent/gpt5_paper.yaml Responses
GPT-6 Luna configs/agent/gpt6_luna_paper.yaml Responses
GPT-6 Sol configs/agent/gpt6_sol_paper.yaml Responses
GPT-6 Astra configs/agent/gpt6_astra_paper.yaml Responses
Kimi K3 configs/agent/kimi_k3_paper.yaml Chat Completions

论文里 Qwen2.5-VL-7B-Instruct 的结果(用于与训练式 harness 在附录中对比)用的是另一份配置,本次发布不含,⚠️ 复现该行数字前需自行确认。registry 还覆盖全部 Qwen3-VL Instruct 尺寸(2B 到 235B-A22B,含 FP8 build)与 OpenAI GPT-5 到 GPT-6.1,用法是复制同族 preset 改一行。

4.2 环境变量(本地 Qwen 路线)

在 router 和 agent 两个终端都设,地址按自己部署改:

export MODEL_BASE_URL=http://127.0.0.1:8222/v1
export MODEL_API_KEY=empty
export AUXILIARY_MODEL_BASE_URL=http://127.0.0.1:8222/v1
export AUXILIARY_MODEL_API_KEY=empty
export JUDGE_MODEL=Qwen/Qwen3-VL-8B-Instruct
export JUDGE_API_BASE=http://127.0.0.1:8222/v1/chat/completions
export JUDGE_API_KEY=empty
export TOOL_SERVER_URL=http://127.0.0.1:8101
export SAM3_SERVER_URL=http://127.0.0.1:8086
export OCR_SERVER_URL=http://127.0.0.1:8085
export DEPTH_ESTIMATION_SERVER_URL=http://127.0.0.1:8087

empty 是给无鉴权本地端点用的。用 GPT / Kimi 时,在命令和 Python 例子里选对应 preset,把 MODEL_BASE_URL / MODEL_API_KEY 指向该 provider,而 auxiliary 连接仍指 Qwen。

4.3 启动 router 并自检

python -m openvlharness.services.server --config configs/agent/qwen3_8b_paper.yaml

另开终端:

curl --fail http://127.0.0.1:8101/health
curl --fail http://127.0.0.1:8101/backend-status

这两个检查只能告诉你 router 起来了、注册了多少工具、并发上限是多少。GPU worker 不可达、Serper key 缺失、图片托管缺失,都要到首次调用对应工具时才暴露。/backend-status 的 degradations 是关键健康指标,README 列了四类降级计数:search / 网页访问因辅助模型超时或输出不可用而回落到原始 provider 内容、image_host(发布出去的查询图公网不可达)、serper_account(额度耗尽 / key 无效 / 需付费)。健康 router 这几项保持为 0;日志里对应 token 是 SUMMARIZE_DEGRADED、EXTRACT_DEGRADED、IMAGE_HOST_UNREACHABLE、SERPER ACCOUNT-LEVEL FAILURE。

4.4 提问

from openvlharness.bootstrap import build_agent

agent = build_agent("configs/agent/qwen3_8b_paper.yaml")
result = agent.generate([
    {"type": "image", "value": "/path/to/image.jpg"},
    {"type": "text", "value": "How many bottles are visible?"},
])
print(result["prediction"])
trajectory = result["extra_records"]["trajectory"]

输入可含多张图,value 支持本地路径、HTTP(S) URL 或 data URL。返回的 trajectory 记录模型轮次、工具调用与证据,可用于排查。

错误语义(README 明确列出):prediction 为 Error: Unable to get response from the server. 表示模型请求失败,真实原因在 result["extra_records"]["trajectory"]["error"];没有该 key 则是模型没给出最终答案就结束了。Error: Reached the iteration limit without a final answer. 表示用满了 agent.max_iterations,trajectory 的 error 记录该上限。

五、典型适用场景

  • 多模态 benchmark 复现:想在 22 个 benchmark 上验证或对比 harness 效果,且不想为每个 backbone 重训。
  • 视觉计数与空间关系:定位物体 + 估深度 + 算空间关系;或裁剪陌生物体 → 视觉匹配搜索 → 网页核验答案。
  • 现有 MLLM 的"外挂增强":已有 Qwen3-VL 或 GPT-5 系列服务,想在不换权重的前提下抬分。
  • 视觉 agent 的工具链参考实现:九个能力层接口 + 多模态记忆 + 编码 agent 的组合方式,本身是很好的架构样例。

不适合:只有一张 GPU、只想跑单图 VQA 的场景——为了九个能力要拉起四个独立服务,成本不成比例。

六、坑与注意(7 条)

坑 1 · 现象:以为 pip install -e '.[qwen,server]' 装完就能跑。影响:import 成功但一调用就失败,因为模型服务是独立环境、独立依赖,README 明确写"The model servers have separate environments and dependencies"。修复:先按 docs/models.md 把模型服务起起来,再单独装感知服务,最后才谈跑 agent。

坑 2 · 现象:忘记每个 preset 都需要一个独立的 Qwen3-VL-8B-Instruct 辅助端点。影响:32B preset 下搜索工具与网页抽取静默降级,分数低于预期且不易察觉。修复:8B preset 共用一个 server 最简单(README 称其得分落在运行噪声内,代价是吞吐——搜索摘要和网页抽取会排在 agent 轮次后面抢同一块 GPU);要精确复现论文或要高并发,就起第二个 Qwen3-VL-8B,把 AUXILIARY_MODEL_BASE_URL 指过去。

坑 3 · 现象:只跑 /health 和 /backend-status 就宣布部署成功。影响:GPU worker 挂了、Serper key 没配、图片托管缺失,这些都不在健康检查里,要到首次调用对应工具才爆。修复:把 /backend-status 的 degradations 当作持续监控项,接入日志 token SUMMARIZE_DEGRADED / EXTRACT_DEGRADED / IMAGE_HOST_UNREACHABLE / SERPER ACCOUNT-LEVEL FAILURE 的告警。

坑 4 · 现象:逆向图片搜索报 IMAGE_HOST_UNREACHABLE。影响:Image Search 能力实际不可用,且错误发生在公网 fetch 而非本地,很容易误判成 Serper 配额问题。修复:给查询图准备 Serper 能访问的 URL——用内置 image host 配隧道,或把图上传到 S3 / GCS 交给 Serper 签名 URL;照 openvlharness/services/tools/serper_text_search/README.md 走。

坑 5 · 现象:以为 coding tool 有沙箱。影响:README 用 > [!WARNING] 强调——coding 工具在 agent 宿主机上以你的用户权限跑生成的 Python,有网络和文件系统访问权,其执行 timeout 不是沙箱。这是本仓库最大的攻击面。修复:在适合你数据隔离要求的环境里跑 agent,动手前先读 SECURITY.md 与 openvlharness/services/tools/python_coding_agent/README.md;绝不把不可信图像/问题喂进未隔离的实例。

坑 6 · 现象:结论数字对不上论文。影响:花几小时 GPU 却复现不出来。修复:论文里 Qwen2.5-VL-7B-Instruct 那一行用的配置本次发布不含;Qwen3-VL 结果 README 说明是三次运行均值,单次跑分落在噪声外很正常;逐 benchmark 对比与其他 harness 的差异在项目页而非 README。

坑 7 · 现象:版本漂移导致子命令/配置名对不上。影响:照旧文章抄 configs/agent/*.yaml 或环境变量名可能直接报错。修复:本文所有路径与变量取自 2026-10-22 实抓的 main 分支 README,无 release tag 锚点(⚠️ 未确认仓库是否有已发布 release),使用前请核对自己 clone 的 commit;per-model 的模型 revision 与 serving 版本在 docs/models.md 里。

七、与同类对比

  • vs 训练式 tool-augmented VLM harness(论文附录用来对比的那类):它们靠微调把工具能力烧进权重,跨 backbone 迁移成本高;OpenVLHarness training-free,换模型只改 preset 一行,代价是收益依赖 backbone 本身的 tool calling 能力。
  • vs 通用 agent 框架(LangGraph / AutoGen / CrewAI):那些是文本 agent 编排框架,不解决"视觉证据"问题;OpenVLHarness 的能力层直接返回 boxes/masks/深度数值数组与标注图,是多模态特有的证据形态。
  • vs 商用视觉 API:调 SAM 3 / PaddleOCR-VL / Depth Anything 3 / Serper 本身很便宜,但 OpenVLHarness 的价值在组合与记忆——九个工具跨步骤共享一份可寻址记忆,再由编码 agent 做数值聚合,这套编排自己搭成本不低。
  • vs 自己写脚本调 SAM + OCR:功能重叠但没有迭代式证据链与 trajectory 可审计,评测也没法复现。

八、一句话推荐结论

推荐:做多模态 agent 研究或评测、且手上有多卡环境的人,值得花半天把它跑起来——training-free 加 22 benchmark 平均 ~10 分的提升在本领域属于高性价比方案,代码与数据集都开源。

不推荐:单卡用户、只想跑单图 VQA、或需要在生产环境直接托管 agent 编码执行的团队——先按坑 1、2、5 估算一遍资源与安全成本,很可能不划算。


来源: - 仓库 README(raw.githubusercontent.com/uclanlp/OpenVLHarness/main/README.md,2026-10-22 UTC 实抓,截取 Highlights / How it works / Results / Installation / Quick start / Evaluation 段) - README 内引用的文档:docs/models.md、SECURITY.md、openvlharness/services/tools/README.md、openvlharness/services/tools/python_coding_agent/README.md(未逐个 fetch,故相关细节标 ⚠️) - README 引用的 arXiv:2610.26860、项目页 openvlharness.github.io、HF Space / HF Datasets(未 fetch) - 组织内卡片:organized/repo_cards/4558-uclanlp-openvlharness.md

⚠️ 未确认清单:论文八个 backbone 的确切编号口径;论文的逐 benchmark 数字;是否存在 release tag;SAM 3 / PaddleOCR-VL / Depth Anything 3 的具体版本与 GPU 配置(README 说在 tools 指南里,本次未取);代码许可证为 MIT(来自仓库卡片,README 末尾 License 段未取到)。