MedBridge Sandbox — Experiment Viewers

Holo3 + Cerebras を使った電子カルテ退院サマリ自動抽出パイプラインの実験結果スナップショット (合成データ)

📝 記事: 電子カルテのベンダーロックインを、画面操作 AI で迂回する話
本ベンチマーク群を題材にした技術記事 (経営/IT 部門向け橋渡し) ─ MoE vs Dense、JSON Schema 制約、医療情報安全管理ガイドラインとの整合、コスト試算など

Task Suites — 退院サマリ抽出

Task Suite — 20260417_140320
Score 0.86 7 tasks 19分 Holo3 hardcoded Patient 00000001

Detection Benchmark — Zero-shot UI affordance 検出

Computer use agent が「クリック対象の単語を事前に知らず」画面上のクリック可能・入力可能要素を visual affordance だけで列挙できるかを評価。
Prompt: 「画面内でクリックできる・入力できる UI 要素を全列挙」。文字列ヒントなし。
GT: 各画面の DOM から button, input, textarea, select, a[href], [role=button/tab/link/menuitem/checkbox/combobox], [contenteditable] を実際にナビゲートしながら収集 (可視要素のみ)。
Matching: 予測点が GT bbox 内に落ちたら TP、余剰予測 = FP、未検出 GT = FN。

Qwen3.6-27B BF16 + JSON schema (maxItems=50) — detection
P 0.40 R 0.81 F1 0.53 TP 95 / FP 143 / FN 23 ⏱ 69s/screen, total 412s 6画面 (login/patient_list/karte/labs/meds/diagnoses) — 実ナビゲーション

画面別 detection

画面GTPredTPFPFNPRF1Lat
login454100.801.000.8911s
patient_list1133112200.331.000.5058s
karte24501139130.220.460.3085s
labs2550222830.440.880.5986s
meds2950232760.460.790.5886s
diagnoses2550242610.480.960.6486s

observations

Recall は総じて高い (0.46-1.00): シンプルな画面 (login/patient_list/diagnoses) ではほぼ全ての GT 要素を発見。
Precision は低い (0.22-0.80): GT 数の 2 倍近い予測を返す傾向。内訳は 「DOM フィルタから外れた装飾要素 (見出し、表の行番号等)」+「同じ要素の重複検出」。
🔴 karte で F1=0.30 と苦戦: カルテ本文の「バイタル / 処方 / 検査 / 病名」タブ + 日付リストで 100 超のエレメントが画面上にあり、50 個キャップで一部取りこぼし + 順序が予測と合わない。
Latency は画面あたり 60-90 秒: 出力トークンが長くなる (50要素 × ~40token = 2000token) のが支配的。

Computer use agent 実装への示唆: Qwen3.6-27B BF16 は「画面を眺めて操作候補の座標リストを吐く」task を F1=0.53 でこなせる。R が高いので「候補漏れ」は少なく、FP は後段の LLM Planner が絞り込めばよい。 文字列ヒント grounding (hit 0.84) と併用すれば実用レベル。


Grounding Benchmark — VLM 単体能力測定 (label-based)

同一の6画面スクショ (login/patient_list/karte/labs/meds/diagnoses) で Grounding (DOM bbox と予測点の一致率) と OCR (画面から構造化抽出 → SQLite GT との recall) を測定。下記は JSON Schema 制約付き最終版。llama.cpp の response_format: json_schema で出力形式を強制し、{"x":[69,33],"y":[27]} のような壊れた配列出力を防止。

① Holo3-35B-A3B (vLLM BF16) — 20260417_125301
Grounding 0.84 (27/32) OCR 0.67 Mean 149px GUI特化Fine-tune
② Qwen3.6-27B Q8_0 + schema [FINAL]
Grounding 0.84 (27/32) OCR 1.00 Mean 148px ⏱ 3.3s/g, 2.8s/o Dense 27B, JSON schema で Holo3 タイ
③ Qwen3.6-27B BF16 + schema [BEST]
Grounding 0.84 (27/32) OCR 1.00 Mean 127px ⏱ 2.8s/g, 15.7s/o Dense 27B FP, Holo3 を mean dist で上回る
④ Qwen3.6-35B-A3B Q8_0 + schema
Grounding 0.09 (3/32) OCR 1.00 Mean 388px ⏱ 1.9s/g, 3.2s/o Active 3B MoE — schema で改善せず
⑤ Qwen3.6-35B-A3B BF16 + schema
Grounding 0.06 (2/32) OCR 1.00 Mean 376px ⏱ 2.2s/g, 3.9s/o Active 3B MoE, 量子化も format も関係なし

主な数値

モデル量子化SchemaHit rateMean distOCRg-latTotal (35 calls)
Holo3-35B-A3BBF16 (vLLM)0.84 (27/32)149px0.67
Qwen-27B denseQ8_00.63 (20/32)111px1.005.0s178s
Qwen-27B denseQ8_00.84 (27/32)148px1.003.3s123s
Qwen-27B denseBF160.66 (21/32)105px1.003.1s147s
Qwen-27B denseBF160.84 (27/32)127px1.002.8s137s
Qwen-35B MoEQ8_0✗/✓0.09 (3/32)388px1.001.9s72s
Qwen-35B MoEBF16✗/✓0.06 (2/32)376px1.002.2s82s

画面別 grounding hit (schema付き最終版)

画面Holo327B-Q8 +sch27B-BF16 +sch35B-Q8 +sch35B-BF16 +sch
login2/22/22/22/22/2
patient_list6/66/66/61/60/6
karte5/64/64/60/60/6
labs5/66/66/60/60/6
meds5/64/64/60/60/6
diagnoses4/65/65/60/60/6

JSON Schema 制約の効果

問題: 27B-dense はしばしば {"x": [69, 33], "y": [27]} のような壊れた配列を返していた。パーサは配列から 1 点を取り出せず grounding 失敗。
解決: llama.cpp response_format: json_schemax: integer, y: integer を強制。
27B-dense は hit率 0.63-0.66 → 0.84 に +0.19 の大幅改善で Holo3 タイ。
35B-MoE は 0.09/0.06 のまま不変 — 出力フォーマットではなく active 3B による認識精度の構造的限界が原因と確定した。

最終結論

✅ 推奨: Qwen3.6-27B dense (Q8_0 or BF16) + JSON schema 制約 がベストチョイス。
・Holo3 とタイの hit率 0.84
・Holo3 を上回る OCR 1.00 と mean dist 127px (BF16)
・Holo3 特化 fine-tune なしに GUI agent として成立
・llama.cpp で動くので運用容易 (BF16 で A100 80GB 50GB 使用)

❌ 避けるべき: Qwen3.6-35B-A3B (MoE) は grounding 用途に非推奨。active 3B が構造的に足りない。OCR 用途 (3.2s/call 最速) なら使える。

座標系注記: Qwen3.6 は指示に関わらず 0-1000 正規化座標を返す (Qwen-VL踏襲)。pred × image_size / 1000 で変換必要。どの量子化でも共通。

旧 run (schema なし / 座標補正なし) — 参考
Qwen3.6-35B Q8_0 v1 (座標未補正) — hit 0.09
Qwen3.6-35B Q8_0 v2 初期 — hit 0.09
Qwen3.6-27B Q8_0 v2 初期 (no schema) — hit 0.63
Qwen3.6-27B Q8_0 v3 (timing, no schema) — hit 0.63
Qwen3.6-27B BF16 (no schema) — hit 0.66
Qwen3.6-35B Q8 v3 (no schema) — hit 0.09
Qwen3.6-35B BF16 (no schema) — hit 0.06

ビューワーの使い方

各 bench の viewer では grounding trial 毎に Latency 列と「Show grounding prompts & raw responses」トグルがあり、送信プロンプト全文と モデルの生レスポンス全文を展開して確認できる。schema 付き run では raw response が {"x": 255, "y": 55} の整った形で返っていることが確認できる。