Browser Harness 使用指南

Browser Harness 用来评测只能通过网页访问的聊天产品,并把抓回来的响应重新导入 eval_752,落成普通 run。

当目标模型只能通过网站使用时,就走这条路径。如果你已经有正常 API 端点,请继续使用标准的 Providers + Runs 流程。

当前 alpha 范围:

  • ChatGPTGeminiCustom adapters
  • text-only、primary-only capture
  • prompt-only signed packs
  • .eval752.zip 作为主要导出 / 导入格式

v1 暂不支持:

  • 浏览器侧多模态抓取
  • 当源 dataset 已不在当前工作区时仍然导入 capture

什么时候该用它

满足以下情况时就该用 Browser Harness:

  • 你要测的是一个只提供网页 UI 的聊天产品
  • 你不想把这个厂商先包装成 eval_752 里的 API provider
  • 你仍然希望结果最后能落成 RunsComparison 中可评分的 run

如果你已经有 API key 和受支持 provider,就直接用普通 Runs launcher。

第一次尝试 Browser Harness 时,建议先用内置 fixture 页面,再去碰真实外部网站。这样可以先验证 selector recipe 和 pacing,而不用一上来就追真实产品的 DOM 变化。

导出的内容是什么

Browser Harness 不会把答案或 checker 逻辑发送到第三方页面。

生成的 signed pack 只包含:

  • dataset identity 和 version hash
  • 过滤后的 item 顺序
  • section metadata
  • prompt 文本
  • scoring eligibility
  • 已签名的 dataset_token

生成的脚本 不会包含:

  • reference answers
  • checker code
  • embedded assets
  • 完整 dataset package

端到端工作流

  1. 打开 Browser Harness
  2. 选择 dataset、section filter 和可选的 Max items
  3. 选择 target adapter:
    • ChatGPT
    • Gemini
    • Custom
  4. 如果 dataset 需要 LLM judging,就选择 Judge providerJudge model
  5. 生成脚本。
  6. 打开目标聊天页面,执行脚本或 bookmarklet。
  7. 等待抓取结束并下载 .eval752.zip
  8. 回到 eval_752,导入这个 capture。
  9. Runs 里检查生成的 run;评分稳定后,再到 Comparison 查看。

第一步:选择数据范围

页面会在生成 pack 之前做预检。

以下情况会阻止导出:

  • 过滤后的选择里没有任何 items
  • 某道题没有可提取的纯文本 prompt
  • 某道题包含 assets
  • 数据集需要 judge scoring,但没有配置 judge provider / model

第二步:选择目标 Adapter

Presets

ChatGPTGemini 自带默认 selector recipes 和 pacing 值。

你仍然可以覆盖:

  • target origin
  • display name
  • pacing values

Custom

Custom 需要这些字段:

  • Origin match
  • New chat selector
  • Composer selector
  • Send button selector
  • Assistant turn selector
  • Response text selector

可选字段:

  • Model label selector
  • Busy selector
  • Stop selector

建议先用 Browser Harness 页面里链接的本地 fixture 页面验证 selector recipe,再去尝试真实站点。

第三步:Judge Provider

依赖 LLM judging 的 dataset 现在支持显式 judge provider,它可以与 run provider 不同。

Browser Harness 也沿用同一套契约:

  • Judge provider
  • Judge model
  • 可选的 Judge prompt

如果数据集不需要 judge scoring,这一节可以留空。

第四步:生成与导入

页面会生成:

  • 一份完整自包含的 raw script
  • 这个脚本对应的 bookmarklet 包装

运行时脚本会:

  • 在目标页面打开一个轻量 overlay
  • 每道题前先点一次 new chat
  • 一次只发送一个 prompt
  • 等待 assistant 响应稳定
  • 记录 timing、origin、model label 和 errors
  • 下载 browser-harness-export.eval752.zip

如果浏览器里 ZIP 打包失败,运行时会回退到 browser-harness-export.json。导入 UI 同时支持这两种格式,但 ZIP 仍然是主路径。

成功时通常应满足:

  • 脚本能在没有预检报错的情况下生成
  • 目标页面能按选中 prompts 逐条跑完
  • 本地成功下载 capture
  • 导入后在 Runs 中出现一条普通 run

导入后会创建什么

导入会创建一条普通 completed run:

  • triggered_by = browser_harness
  • provider surface = browser
  • browser target metadata 会存到 provider 上
  • item responses 会以普通 run items 形式存储
  • scoring 通过标准后端 worker 排队执行

这意味着:

  • run 会出现在 Runs
  • logs 和 item detail 仍然可用
  • judging 完成后,Comparison 也能消费这条结果
  • 导入后的 run 仍然支持正常导出

故障排查

在脚本生成前就被阻止导出

查看页面上的 preflight 问题列表。常见原因是:

  • dataset 里仍然有 assets
  • 过滤后没有剩余 items
  • 需要 judge 的 dataset 没有配置 judge provider / model

脚本提示 target origin 不匹配

Target origin 设为目标网站的准确 origin,例如 https://chatgpt.com

脚本找不到页面元素

先用本地 fixture 页面验证。如果 fixture 正常但真实网站不行,通常说明站点 DOM 已变化,需要更新 selector recipe。

导入失败,提示 dataset 不匹配

Browser Harness 导入会用 signed dataset token 校验当前工作区。先把源 dataset 重新导回同一个工作区,再试一次。

run 已导入但还没评分

评分是异步排队的。打开 Runs,检查 run logs,并确认 worker 正常可用。judge-provider 失败会记录在结构化日志里,但不会直接丢弃这条已导入 run。